Beispiel #1
0
	/**
	*	Extract Shader Storage Buffer data from the shader
	*/
	void Program::ExtractStorageBlockData()
	{
		GLint numBlocks = 0;
		glGetProgramInterfaceiv(_program, GL_SHADER_STORAGE_BLOCK, GL_ACTIVE_RESOURCES, &numBlocks);

		char tempNameAR[1024];

		Log("\tBuffer :")

			for (int blockIdx = 0; blockIdx < numBlocks; blockIdx++)
			{
				std::vector<BufferVariableInfo> vars;

				glGetProgramResourceName(_program, GL_SHADER_STORAGE_BLOCK, blockIdx, 1024, NULL, tempNameAR);

				std::string bufferName(tempNameAR);

				GLint binding = 0;
				{
					GLenum prop[] = { GL_BUFFER_BINDING };
					glGetProgramResourceiv(_program, GL_SHADER_STORAGE_BLOCK, blockIdx, 1, prop, 1, NULL, &binding);
				}

				Log("\t\t" + bufferName + " index " + ToString(blockIdx) + " binding " + ToString(binding));

				GLint vcount = 0;
				{
					GLenum prop[] = { GL_NUM_ACTIVE_VARIABLES };
					glGetProgramResourceiv(_program, GL_SHADER_STORAGE_BLOCK, blockIdx, 1, prop, 1, NULL, &vcount);
				}

				std::vector<GLint> variables(vcount);
				{
					GLenum prop[] = { GL_ACTIVE_VARIABLES };
					glGetProgramResourceiv(_program, GL_SHADER_STORAGE_BLOCK, blockIdx, 1, prop, vcount, NULL, &variables.front());
				}

				GLchar vnameAR[128] = { 0 };
				for (int k = 0; k < vcount; k++)
				{
					GLenum propsAR[] = { GL_OFFSET, GL_TYPE, GL_ARRAY_STRIDE, GL_MATRIX_STRIDE, GL_IS_ROW_MAJOR, GL_TOP_LEVEL_ARRAY_STRIDE };
					GLint paramsAR[sizeof(propsAR) / sizeof(GLenum)];

					glGetProgramResourceiv(_program, GL_BUFFER_VARIABLE, variables[k], sizeof(propsAR) / sizeof(GLenum), propsAR, sizeof(paramsAR) / sizeof(GLenum), NULL, paramsAR);
					glGetProgramResourceName(_program, GL_BUFFER_VARIABLE, variables[k], sizeof(vnameAR), NULL, vnameAR);

					Log("\t\t\t" + std::string(vnameAR) + " offset " + ToString(paramsAR[0]) + " type " + GLUtil::GLSLTypeToStr(GLenum(paramsAR[1])) + " array stride " + ToString(paramsAR[2]) + " top level stride " + ToString(paramsAR[5]));

					vars.push_back(BufferVariableInfo(std::string(vnameAR), paramsAR[0], GLenum(paramsAR[1]), paramsAR[2], paramsAR[3], GLboolean(paramsAR[4]), paramsAR[5]));
				}

				_buffers.insert(std::make_pair(bufferName, BufferInfo(bufferName, blockIdx, vars)));
			}
	}
bool CoreIrcListHelper::dispatchQuery(const NetworkId &netId, const QString &query) {
  CoreNetwork *network = coreSession()->network(netId);
  if(network) {
    _channelLists[netId] = QList<ChannelDescription>();
    network->userInputHandler()->handleList(BufferInfo(), query);
    _queryTimeout[startTimer(10000)] = netId;
    return true;
  } else {
    return false;
  }
}
Beispiel #3
0
bool CoreIrcListHelper::dispatchQuery(const NetworkId &netId, const QString &query)
{
    CoreNetwork *network = coreSession()->network(netId);
    if (network) {
        _channelLists[netId] = QList<ChannelDescription>();
        network->userInputHandler()->handleList(BufferInfo(), query);

        auto timer = std::make_shared<QBasicTimer>();
        timer->start(kTimeoutMs, this);
        _queryTimeoutByNetId[netId] = timer;
        _queryTimeoutByTimerId[timer->timerId()] = netId;

        return true;
    }
    else {
        return false;
    }
}
Beispiel #4
0
BufferInfo BufferInfo::fakeStatusBuffer(NetworkId networkId)
{
    return BufferInfo(0, networkId, StatusBuffer);
}
void SimpleDeferredDemo::renderPost()
{
//	if(1) return;

    ADLASSERT( TILE_SIZE <= 16 );

    int nClusterX = calcNumTiles(g_wWidth, CLUSTER_SIZE);//max2( 1, (g_wWidth/CLUSTER_SIZE)+(!(g_wWidth%CLUSTER_SIZE)?0:1) );
    int nClusterY = calcNumTiles(g_wHeight, CLUSTER_SIZE);//max2( 1, (g_wHeight/CLUSTER_SIZE)+(!(g_wHeight%CLUSTER_SIZE)?0:1) );

    //	todo. define own constant buffer
    ConstantBuffer cb;
    {
        cb.m_world = XMMatrixIdentity();
        cb.m_view = g_ViewTr;
        cb.m_projection = g_ProjectionTr;
    }
    {   //	clear lightIdxBuffer
        BufferInfo bInfo[] = { BufferInfo( &m_tileBuffer ) };

        Launcher launcher( m_deviceData, &m_clearLightIdxKernel );
        launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
//		launcher.pushBackRW( m_tileBuffer );
        launcher.launch1D( nClusterX*nClusterY*MAX_LIGHTS_PER_TILE_IN_32B );
    }

    {   //	set lightIdxBuffer
        BufferInfo bInfo[] = { BufferInfo( &m_lightPosBuffer, true ), BufferInfo( &m_lightColorBuffer, true ),
                               BufferInfo( &m_tileBuffer )
                             };

        Launcher launcher( m_deviceData, &m_buildLightIdxKernel );
        launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
//		launcher.pushBackR( m_lightPosBuffer );
//		launcher.pushBackR( m_lightColorBuffer );
//		launcher.pushBackRW( m_tileBuffer );
        launcher.setConst( g_constBuffer, cb );
        launcher.launch1D( 64 );
    }

    Stopwatch dsw( m_deviceData );
    dsw.start();
    {   //	run CS
        BufferDX11<int> cBuffer;
        cBuffer.m_srv = m_colorRT.m_srv;

        BufferDX11<int> pBuffer;
        pBuffer.m_srv = m_posRT.m_srv;

        BufferDX11<int> nBuffer;
        nBuffer.m_srv = m_normalRT.m_srv;

        BufferInfo bInfo[] = { BufferInfo( &m_lightPosBuffer, true ), BufferInfo( &m_lightColorBuffer, true ), BufferInfo( &cBuffer, true ),
                               BufferInfo( &pBuffer, true ), BufferInfo( &nBuffer, true ), BufferInfo( &m_tileBuffer, true ),
                               BufferInfo( &m_buffer )
                             };

        Launcher launcher( m_deviceData, &m_kernel );
        launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
//		launcher.pushBackR( m_lightPosBuffer );
//		launcher.pushBackR( m_lightColorBuffer );
//		launcher.pushBackR( cBuffer );
//		launcher.pushBackR( pBuffer );
//		launcher.pushBackR( nBuffer );
//		launcher.pushBackR( m_tileBuffer );
//		launcher.pushBackRW( m_buffer );
        launcher.setConst( g_constBuffer, cb );
        launcher.launch2D( nClusterX*TILE_SIZE, nClusterY*TILE_SIZE, TILE_SIZE, TILE_SIZE );
    }
    dsw.stop();

    {
        m_nTxtLines = 0;
        sprintf_s(m_txtBuffer[m_nTxtLines++], LINE_CAPACITY, "%3.3fms", dsw.getMs());
    }

    //

    DeviceDX11* dd = (DeviceDX11*)m_deviceData;

    ID3D11RenderTargetView* pOrigRTV = NULL;
    ID3D11DepthStencilView* pOrigDSV = NULL;
    dd->m_context->OMGetRenderTargets( 1, &pOrigRTV, &pOrigDSV );

    //	release for the renderPre
    pOrigRTV->Release();
    pOrigDSV->Release();

    {
        float ClearColor[4] = { 0.f, 0.f, 0.f, 1.0f };
        ID3D11RenderTargetView* aRTViews[ 1 ] = { pOrigRTV };
        dd->m_context->OMSetRenderTargets( 1, aRTViews, pOrigDSV );
        dd->m_context->ClearDepthStencilView( pOrigDSV, D3D11_CLEAR_DEPTH, 1.0f, 0 );
        dd->m_context->ClearRenderTargetView( pOrigRTV, ClearColor );

        dd->m_context->PSSetShaderResources( 0, 1, ((BufferDX11<float4>*)&m_buffer)->getSRVPtr() );

        //	render to screen
        renderFullQuad( m_deviceData, &g_bufferToRTPixelShader, make_float4((float)g_wWidth, (float)g_wHeight, 0,0 ) );

        ID3D11ShaderResourceView* ppSRVNULL[16] = { 0 };
        dd->m_context->PSSetShaderResources( 0, 1, ppSRVNULL );
    }

    pOrigRTV->Release();
    pOrigDSV->Release();

    g_defaultVertexShader = m_gVShader;
    g_defaultPixelShader = m_gPShader;
}
Beispiel #6
0
	inline void reset()
	{
		*this = BufferInfo();
	}
void BufferItem::setBufferName(const QString &name)
{
    _bufferInfo = BufferInfo(_bufferInfo.bufferId(), _bufferInfo.networkId(), _bufferInfo.type(), _bufferInfo.groupId(), name);
    emit dataChanged(0);
}
Beispiel #8
0
BoxGeometry::BoxGeometry(
		String name,
		const Vector3D& halfExtends,
		bool addTangents,
		bool patchRepresentation,
		const Vector4D& texcoordScale)
: VertexBasedGeometry(name,
		patchRepresentation ? VERTEX_BASED_TRIANGLE_PATCHES : VERTEX_BASED_TRIANGLES),
		mHalfExtends(halfExtends)
  {
	BufferInfo bufferi(
			name + String("BoxGeometryPositionBuffer"),
			ContextTypeFlags(HOST_CONTEXT_TYPE_FLAG | OPEN_GL_CONTEXT_TYPE_FLAG),
			POSITION_SEMANTICS,
			TYPE_VEC4F,
			6* 4 , //because of the normals, the vertices cannot be shared ;(
			BufferElementInfo(4,GPU_DATA_TYPE_FLOAT,32,false),
			VERTEX_ATTRIBUTE_BUFFER_TYPE,
			NO_CONTEXT_TYPE
	);

	setAttributeBuffer(new Buffer(bufferi,false,0));

	bufferi.name = name + String("BoxGeometryNormalBuffer");
	bufferi.bufferSemantics = NORMAL_SEMANTICS;
	setAttributeBuffer(new Buffer(bufferi,false,0));

	if(addTangents)
	{
		bufferi.name = name + String("BoxGeometryTangentBuffer");
		bufferi.bufferSemantics = TANGENT_SEMANTICS;
		setAttributeBuffer( new Buffer( bufferi, false, 0 )	);
	}

	bufferi.name = name + String( "BoxGeometryTexCoordBuffer");
	bufferi.bufferSemantics = TEXCOORD_SEMANTICS;
	setAttributeBuffer(new Buffer(bufferi,false,0));

	setIndexBuffer(
		new Buffer(
			BufferInfo(
				name + String("BoxGeometryIndexBuffer"),
				ContextTypeFlags(HOST_CONTEXT_TYPE_FLAG | OPEN_GL_CONTEXT_TYPE_FLAG),
				INDEX_SEMANTICS,
				TYPE_UINT32,
				6 * 6, //6 faces * 2* triangles @ 3 verts
				BufferElementInfo(1,GPU_DATA_TYPE_UINT,32,false),
				VERTEX_INDEX_BUFFER_TYPE,
				NO_CONTEXT_TYPE
			)
		)
	);


	Vector4D* posBuffer = 	reinterpret_cast<Vector4D*>(getAttributeBuffer(POSITION_SEMANTICS)->getCPUBufferHandle());
	Vector4D* normalBuffer =reinterpret_cast<Vector4D*>(getAttributeBuffer(NORMAL_SEMANTICS)->getCPUBufferHandle());
	Vector4D* tangentBuffer = 0;
	if(addTangents)	{
		tangentBuffer = 	reinterpret_cast<Vector4D*>(getAttributeBuffer(TANGENT_SEMANTICS)->getCPUBufferHandle());
	}
	Vector4D* tcBuffer = 	reinterpret_cast<Vector4D*>(getAttributeBuffer(TEXCOORD_SEMANTICS)->getCPUBufferHandle());
	unsigned int* indexBuffer = reinterpret_cast<unsigned int*>(getIndexBuffer()->getCPUBufferHandle());



	//iterate over the six faces:
	for(int axis=0; axis<3; axis++)
	{
		for(int side = 1; side >= -1; side -= 2)
		{
			Vector3D normal = Vector3D(axis==0?side:0,axis==1?side:0, axis==2?side:0);
			Vector3D left = Vector3D(
					((axis==2) || (axis ==1))	 ? 	-side 	:	0,
					0,
					axis==0?side:0
			);

			Vector3D down= glm::cross(normal,left);

			Vector3D tangent = left * (-1.0f);

			int vertexIndexBase = 8* axis + 4*(1-(side+1)/2);
			int indexIndexBase = 12* axis + 6*(1-(side+1)/2);

			//lower left
			posBuffer[vertexIndexBase + 0] 		= Vector4D( (normal + left + down)* halfExtends, 1 );
			normalBuffer[vertexIndexBase + 0]	= Vector4D( normal, 0 );
			if(addTangents){
				tangentBuffer[vertexIndexBase+0]= Vector4D( tangent, 0 );
			}
			tcBuffer[vertexIndexBase + 0]		= Vector4D(0,0,0, 0 ) * texcoordScale;
			//lower right
			posBuffer[vertexIndexBase + 1] 		= Vector4D( (normal - left + down)* halfExtends , 1 );
			normalBuffer[vertexIndexBase + 1]	= Vector4D( normal, 0 );
			if(addTangents){
				tangentBuffer[vertexIndexBase+1]= Vector4D( tangent, 0 );
			}
			tcBuffer[vertexIndexBase + 1]		= Vector4D(1,0,0, 0 )* texcoordScale;
			//upper right
			posBuffer[vertexIndexBase + 2] 		= Vector4D( (normal - left - down)* halfExtends , 1 );
			normalBuffer[vertexIndexBase + 2]	= Vector4D( normal, 0 );
			if(addTangents){
				tangentBuffer[vertexIndexBase+2]= Vector4D( tangent, 0 );
			}
			tcBuffer[vertexIndexBase + 2]		= Vector4D(1,1,0, 0 )* texcoordScale;
			//upper left
			posBuffer[vertexIndexBase + 3] 		= Vector4D( (normal + left - down)* halfExtends , 1 );
			normalBuffer[vertexIndexBase + 3]	= Vector4D( normal, 0 );
			if(addTangents){
				tangentBuffer[vertexIndexBase+3]= Vector4D( tangent, 0 );
			}
			tcBuffer[vertexIndexBase + 3]		= Vector4D(0,1,0, 0 )* texcoordScale;

			indexBuffer[indexIndexBase + 0]=  vertexIndexBase + 0;
			indexBuffer[indexIndexBase + 1]=  vertexIndexBase + 1;
			indexBuffer[indexIndexBase + 2]=  vertexIndexBase + 2;
			indexBuffer[indexIndexBase + 3]=  vertexIndexBase + 0;
			indexBuffer[indexIndexBase + 4]=  vertexIndexBase + 2;
			indexBuffer[indexIndexBase + 5]=  vertexIndexBase + 3;

//			LOG<<DEBUG_LOG_LEVEL<<"VERTICES OF BOX, face "<<
//					((side>0)?"positive":"negative") <<
//					(	(axis==0)
//							?" X"
//							:( (axis==1)
//								?" Y"
//								:" Z"	)    )
//
//					<< ": \n";
//			for(int i=0;i<4;i++)
//			{
//				LOG<<DEBUG_LOG_LEVEL
//						<<"Index of vertex :"<<vertexIndexBase+i
//						<<"; Vertex coords: "<<posBuffer[vertexIndexBase + i]
//						<<"; Normal: "<<normalBuffer[vertexIndexBase + i]
//						<<"; start index for face in index buffer: "<<indexIndexBase<<";\n"
//		 	    ;
//			}

		}
	}

	getAttributeBuffer(POSITION_SEMANTICS)->copyFromHostToGPU();
	getAttributeBuffer(NORMAL_SEMANTICS)->copyFromHostToGPU();
	if(addTangents){getAttributeBuffer(TANGENT_SEMANTICS)->copyFromHostToGPU();}
	getAttributeBuffer(TEXCOORD_SEMANTICS)->copyFromHostToGPU();
	getIndexBuffer()->copyFromHostToGPU();

}
Beispiel #9
0
void LightSourceManager::init()
{
	if(
		(ShaderManager::getInstance().getGlobalShaderFeatures().lightSourcesLightingFeature
				== LIGHT_SOURCES_LIGHTING_FEATURE_ALL_POINT_LIGHTS )
	 ||	(ShaderManager::getInstance().getGlobalShaderFeatures().lightSourcesLightingFeature
			 == LIGHT_SOURCES_LIGHTING_FEATURE_ALL_SPOT_LIGHTS )
	 ||	(ShaderManager::getInstance().getGlobalShaderFeatures().lightSourcesLightingFeature
			 == LIGHT_SOURCES_LIGHTING_FEATURE_ALL_POINT_OR_SPOT_LIGHTS )
	)
	{
		std::vector<String> memberStrings=
			{
			  "position","diffuseColor","specularColor","direction",
			  "innerSpotCutOff_Radians","outerSpotCutOff_Radians","spotExponent","shadowMapLayer"
			};

		mLightSourceBufferMetaInfo = new UniformBufferMetaInfo(
			mNumMaxLightSources,
			String("LightSourceBuffer"), String("lightSources"),
			memberStrings,
			ShaderManager::getInstance().getUniformBufferOffsetQueryShader(false));

		//queryLightSourceBufferSizeAndOffsets();

		assert( (mLightSourceBufferMetaInfo->mRequiredBufferSize  % BufferHelper::elementSize(TYPE_FLOAT))== 0);
		mLightSourcesUniformBuffer = new Buffer(
			BufferInfo(
				String("LightSourceUniformBuffer"),
				ContextTypeFlags(HOST_CONTEXT_TYPE_FLAG | OPEN_GL_CONTEXT_TYPE_FLAG),
				LIGHT_SOURCE_BUFFER_SEMANTICS,
				TYPE_FLOAT,
				mLightSourceBufferMetaInfo->mRequiredBufferSize / BufferHelper::elementSize(TYPE_FLOAT),
				BufferElementInfo(true),
				UNIFORM_BUFFER_TYPE,
				NO_CONTEXT_TYPE
			),
			//yes, the contents are mostly modded when moving lightsources are involved
			true,
			//set no data yet
			0
		);
	}



	if(ShaderManager::getInstance().getGlobalShaderFeatures().lightSourcesShadowFeature
		 == LIGHT_SOURCES_SHADOW_FEATURE_ALL_SPOT_LIGHTS)
	{
		std::vector<String> memberStrings;//empty on purpose, as the LS uniform buffer has no struct as array elements!

		mShadowCameraTransformBufferMetaInfo_SMGeneration= new UniformBufferMetaInfo(
				mNumMaxLightSources,
				String("ShadowCameraTransformBuffer"), String("shadowCameraviewProjectionMatrices"),
				memberStrings,
				ShaderManager::getInstance().getUniformBufferOffsetQueryShader(true));
		mShadowCameraTransformBufferMetaInfo_SMLookup= new UniformBufferMetaInfo(
				mNumMaxLightSources,
				String("ShadowCameraTransformBuffer"), String("shadowMapLookupMatrices"),
				memberStrings,
				ShaderManager::getInstance().getUniformBufferOffsetQueryShader(false));

		assert("at least the buffers should have the same size" &&
				(mShadowCameraTransformBufferMetaInfo_SMGeneration->mRequiredBufferSize ==
						mShadowCameraTransformBufferMetaInfo_SMLookup->mRequiredBufferSize)
		);
		assert( (mShadowCameraTransformBufferMetaInfo_SMGeneration->mRequiredBufferSize  % BufferHelper::elementSize(TYPE_MATRIX44F))== 0);

		mShadowCameraTransformBuffer = new Buffer(
			BufferInfo(
				String("ShadowMapMatricesUniformBuffer"),
				ContextTypeFlags( HOST_CONTEXT_TYPE_FLAG | OPEN_GL_CONTEXT_TYPE_FLAG),
				TRANSFORMATION_MATRICES_SEMANTICS,
				TYPE_MATRIX44F,
				mShadowCameraTransformBufferMetaInfo_SMGeneration->mRequiredBufferSize
				/ BufferHelper::elementSize(TYPE_MATRIX44F),
				BufferElementInfo(true),
				UNIFORM_BUFFER_TYPE,
				NO_CONTEXT_TYPE
			),
			//yes, the contents are mostly modded when moving lightsources are involved
			true,
			//set no data yet
			0
		);
	}
}
void SSShadowMapDemo::renderPost()
{
	Stopwatch sw( m_deviceData );
	if(1)
	{
		sw.start();

		ConstData cb;
		{
			XMVECTOR v;
//			cb.m_viewInv = XMMatrixInverse( &v, g_ViewTr );
//			cb.m_projInv = XMMatrixInverse( &v, g_ProjectionTr );
			cb.m_viewInv = XMMatrixInverse( &v, XMMatrixMultiply( g_ProjectionTr, g_ViewTr ) );

			cb.m_width = g_wWidth;
			cb.m_height = g_wHeight;
			cb.m_shadowWeight = 0.6f/MAX_SHADOWS;
		}

		{	//	clear
			Buffer<int> normalBuffer; normalBuffer.m_srv = m_normalRT.m_srv;
			BufferInfo bInfo[] = { BufferInfo( &m_shadowAccumBuffer ), 
				BufferInfo( &normalBuffer, true ) };
			Launcher launcher( m_deviceData, &m_clearKernel );
			launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
			launcher.setConst( m_constBuffer, cb );
			launcher.launch1D( g_wWidth*g_wHeight, 64 );
		}

		ID3D11RenderTargetView* m_rtv;
		ID3D11DepthStencilView* m_dsv;
		DeviceDX11* dd = (DeviceDX11*)m_deviceData;
		dd->m_context->OMGetRenderTargets( 1, &m_rtv, &m_dsv );

		for(int lightIdx=0; lightIdx<MAX_SHADOWS; lightIdx++)
		{
			XMMATRIX viewTr;
			XMMATRIX projTr;
			{	//	render light view
				dd->m_context->OMSetRenderTargets( 0, 0, m_depthBuffer[lightIdx].m_depthStencilView );
				dd->m_context->ClearDepthStencilView( m_depthBuffer[lightIdx].m_depthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0 );

				getMatrices<true>( m_lightPos[lightIdx], make_float4(0,0,0), make_float4(1,0,0,0), XM_PI*60.f/180.f, 1.f, 
					0.1f, 50.f, &viewTr, &projTr );
		
				dispatchRenderList( g_deviceData, &g_debugRenderObj, &viewTr, &projTr );
			}

			{	//	run compute shader for accumulation
				dd->m_context->OMSetRenderTargets( 0, 0, 0 );

				{
//					cb.m_lightView = viewTr;
//					cb.m_lightProj = projTr;
					//	== mul( mul( v, view ), proj ) in shader (Matrices are transposed)
					cb.m_lightView = XMMatrixMultiply( projTr, viewTr );
				}

				Buffer<int> depthBuffer;	depthBuffer.m_srv = g_depthStencil.m_srv;
				Buffer<int> shadowBuffer;	shadowBuffer.m_srv = m_depthBuffer[lightIdx].m_srv;

				BufferInfo bInfo[] = { BufferInfo( &m_shadowAccumBuffer ), 
					BufferInfo( &depthBuffer, true ), BufferInfo( &shadowBuffer, true ) };

				Launcher launcher( m_deviceData, &m_shadowAccmKernel );
				launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
				launcher.setConst( m_constBuffer, cb );
				launcher.launch2D( g_wWidth, g_wHeight, 8, 8 );
			}
		}

		m_rtv->Release();
		m_dsv->Release();
	}
	else
	{
		ConstData cb;
		{
			XMVECTOR v;
//			cb.m_viewInv = XMMatrixInverse( &v, g_ViewTr );
//			cb.m_projInv = XMMatrixInverse( &v, g_ProjectionTr );
			cb.m_viewInv = XMMatrixInverse( &v, XMMatrixMultiply( g_ProjectionTr, g_ViewTr ) );

			cb.m_width = g_wWidth;
			cb.m_height = g_wHeight;
			cb.m_shadowWeight = 0.6f/MAX_SHADOWS;
		}

		{	//	clear
			Buffer<int> normalBuffer; normalBuffer.m_srv = m_normalRT.m_srv;
			BufferInfo bInfo[] = { BufferInfo( &m_shadowAccumBuffer ), 
				BufferInfo( &normalBuffer, true ) };
			Launcher launcher( m_deviceData, &m_clearKernel );
			launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
			launcher.setConst( m_constBuffer, cb );
			launcher.launch1D( g_wWidth*g_wHeight, 64 );
		}

		ID3D11RenderTargetView* m_rtv;
		ID3D11DepthStencilView* m_dsv;
		DeviceDX11* dd = (DeviceDX11*)m_deviceData;
		dd->m_context->OMGetRenderTargets( 1, &m_rtv, &m_dsv );

		XMMATRIX viewTr[MAX_SHADOWS];
		XMMATRIX projTr[MAX_SHADOWS];
		for(int lightIdx=0; lightIdx<MAX_SHADOWS; lightIdx++)
		{
			{	//	render light view
				dd->m_context->OMSetRenderTargets( 0, 0, m_depthBuffer[lightIdx].m_depthStencilView );
				dd->m_context->ClearDepthStencilView( m_depthBuffer[lightIdx].m_depthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0 );

				getMatrices<true>( m_lightPos[lightIdx], make_float4(0,0,0), make_float4(1,0,0,0), XM_PI*60.f/180.f, 1.f, 
					0.1f, 50.f, &viewTr[lightIdx], &projTr[lightIdx] );
		
				dispatchRenderList( g_deviceData, &g_debugRenderObj, &viewTr[lightIdx], &projTr[lightIdx] );
			}

			{	//	run compute shader for accumulation
				dd->m_context->OMSetRenderTargets( 0, 0, 0 );

				cb.m_shadowIdx = lightIdx;

				Buffer<int> shadowBuffer;	shadowBuffer.m_srv = m_depthBuffer[lightIdx].m_srv;

				BufferInfo bInfo[] = { BufferInfo( &m_lightMergedBuffer ),
					BufferInfo( &shadowBuffer, true ) };

				Launcher launcher( m_deviceData, &m_copyShadowMapKernel );
				launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
				launcher.setConst( m_constBuffer, cb );
				launcher.launch1D( g_wWidth*g_wHeight, 64 );
			}
		}


		{	//	resolve in a shader
			{
				cb.m_shadowIdx = MAX_SHADOWS;
				for(int i=0; i<MAX_SHADOWS; i++)
				{
					viewTr[i] = XMMatrixMultiply( projTr[i], viewTr[i] );
				}
				m_lightMatrixBuffer.write( viewTr, MAX_SHADOWS );
				DeviceUtils::waitForCompletion( m_deviceData );
			}

			sw.start();

			Buffer<int> depthBuffer;	depthBuffer.m_srv = g_depthStencil.m_srv;
			Buffer<int> shadowBuffer;	shadowBuffer.m_srv = m_depthBuffer[0].m_srv;

			BufferInfo bInfo[] = { BufferInfo( &m_shadowAccumBuffer ), 
				BufferInfo( &depthBuffer, true ), 
				BufferInfo( &m_lightMergedBuffer, true ),
				BufferInfo( &m_lightMatrixBuffer, true ) };

			Launcher launcher( m_deviceData, &m_shadowAccmAllKernel );
			launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
			launcher.setConst( m_constBuffer, cb );
			launcher.launch2D( g_wWidth, g_wHeight, 8, 8 );

		}

		m_rtv->Release();
		m_dsv->Release();
	}
	sw.stop();

	{
		float t = sw.getMs();
		m_nTxtLines = 0;
		sprintf_s(m_txtBuffer[m_nTxtLines++], LINE_CAPACITY, "%dlights, %3.2fms", MAX_SHADOWS, t);
	}

	resolve( &m_shadowAccumBuffer.m_srv );
//	resolveTexture( (void**)&m_colorRT.m_srv );
}
void AdlPrimitivesDemo::test( Buffer<int2>& buf, int size, Stopwatch& sw )
{
	Kernel* kernel = KernelManager::query( m_deviceData, "..\\..\\AdlDemos\\TestBed\\Demos\\AdlPrimitivesDemoKernel", "FillInt4Kernel" );
	Buffer<int4> constBuffer( m_deviceData, 1, BufferBase::BUFFER_CONST );


	int numGroups = (size+128*4-1)/(128*4);
	Buffer<u32> workBuffer0( m_deviceData, numGroups*(16) );
	Buffer<u32> workBuffer1( m_deviceData, numGroups*(16) );

	Buffer<int2> sortBuffer( m_deviceData, size );
	{
		int2* host = new int2[size];
		for(int i=0; i<size; i++)
		{
			host[i] = make_int2( getRandom(0, 0xf), i );
		}
		sortBuffer.write( host, size );
		DeviceUtils::waitForCompletion( m_deviceData );
		delete [] host;
	}

	int4 constData;
	{
		constData.x = size;
		constData.y = 0;
		constData.z = numGroups;
		constData.w = 0;
	}

	sw.start();

	int nThreads = size/4;
	{
		BufferInfo bInfo[] = { BufferInfo( &buf ), BufferInfo( &workBuffer0 ), BufferInfo( &workBuffer1 ) };
		Launcher launcher( m_deviceData, kernel );
		launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
		launcher.setConst( constBuffer, constData );
		launcher.launch1D( nThreads, 128 );
	}

	sw.split();

	{
		constData.w = 1;
		int nThreads = size/4;
		BufferInfo bInfo[] = { BufferInfo( &buf ), BufferInfo( &workBuffer0 ), BufferInfo( &workBuffer1 ) };
		Launcher launcher( m_deviceData, kernel );
		launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
		launcher.setConst( constBuffer, constData );
		launcher.launch1D( nThreads, 128 );
	}

	sw.split();

	{
		constData.w = 2;
		int nThreads = size/4;
		BufferInfo bInfo[] = { BufferInfo( &sortBuffer ), BufferInfo( &workBuffer0 ), BufferInfo( &workBuffer1 ) };
		Launcher launcher( m_deviceData, kernel );
		launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(Launcher::BufferInfo) );
		launcher.setConst( constBuffer, constData );
		launcher.launch1D( nThreads, 128 );
	}

	sw.stop();

	{
		int2* host = new int2[size];
		buf.read( host, size );
		DeviceUtils::waitForCompletion( m_deviceData );

		for(int i=0; i<128*4-1; i++)
		{
			ADLASSERT( host[i].x <= host[i+1].x );
		}

		delete [] host;
	}

	{
		float t[3];
		sw.getMs(t, 3);
		//	(byte * nElems)
		sprintf_s(m_txtBuffer[m_nTxtLines++], LINE_CAPACITY, "LoadStore: %3.2fGB/s (%3.2fns)", (4*8*2)*nThreads/t[0]/1000/1000, t[0]*1000.f);		
		sprintf_s(m_txtBuffer[m_nTxtLines++], LINE_CAPACITY, "GenHistog: %3.2fGB/s (%3.2fns)", (4*(8*2+2))*nThreads/t[1]/1000/1000, t[1]*1000.f);		
		sprintf_s(m_txtBuffer[m_nTxtLines++], LINE_CAPACITY, "FullSort: %3.2fGB/s (%3.2fns)", (4*(8*2+2))*nThreads/t[2]/1000/1000, t[2]*1000.f);		
	}
}