Example #1
0
// Set the shader and dependent state (SRVs, samplers, UAVs, interfaces)
void CEffect::ApplyShaderBlock(SShaderBlock *pBlock)
{
    UINT i;

    SD3DShaderVTable *pVT = pBlock->pVT;

    // Apply constant buffers first (tbuffers are done later)
    SShaderCBDependency *pCBDep = pBlock->pCBDeps;
    SShaderCBDependency *pLastCBDep = pBlock->pCBDeps + pBlock->CBDepCount;

    for (; pCBDep<pLastCBDep; pCBDep++)
    {
        D3DXASSERT(pCBDep->ppFXPointers);

        for (i = 0; i < pCBDep->Count; ++ i)
        {
            CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)pCBDep->ppFXPointers[i]);
        }

        (m_pContext->*(pVT->pSetConstantBuffers))(pCBDep->StartIndex, pCBDep->Count, pCBDep->ppD3DObjects);
    }

    // Next, apply samplers
    SShaderSamplerDependency *pSampDep = pBlock->pSampDeps;
    SShaderSamplerDependency *pLastSampDep = pBlock->pSampDeps + pBlock->SampDepCount;

    for (; pSampDep<pLastSampDep; pSampDep++)
    {
        D3DXASSERT(pSampDep->ppFXPointers);

        for (i=0; i<pSampDep->Count; i++)
        {
            if ( ApplyRenderStateBlock(pSampDep->ppFXPointers[i]) )
            {
                // If the sampler was updated, its pointer will have changed
                pSampDep->ppD3DObjects[i] = pSampDep->ppFXPointers[i]->pD3DObject;
            }
        }
        (m_pContext->*(pVT->pSetSamplers))(pSampDep->StartIndex, pSampDep->Count, pSampDep->ppD3DObjects);
    }
 
    // TBuffers are funny:
    // We keep two references to them. One is in as a standard texture dep, and that gets used for all sets
    // The other is as a part of the TBufferDeps array, which tells us to rebuild the matching CBs.
    // These two refs could be rolled into one, but then we would have to predicate on each CB or each texture.
    SConstantBuffer **ppTB = pBlock->ppTbufDeps;
    SConstantBuffer **ppLastTB = ppTB + pBlock->TBufferDepCount;

    for (; ppTB<ppLastTB; ppTB++)
    {
        CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)*ppTB);
    }

    // Set the textures
    SShaderResourceDependency *pResourceDep = pBlock->pResourceDeps;
    SShaderResourceDependency *pLastResourceDep = pBlock->pResourceDeps + pBlock->ResourceDepCount;

    for (; pResourceDep<pLastResourceDep; pResourceDep++)
    {
        D3DXASSERT(pResourceDep->ppFXPointers);

        for (i=0; i<pResourceDep->Count; i++)
        {
            pResourceDep->ppD3DObjects[i] = pResourceDep->ppFXPointers[i]->pShaderResource;
        }

        (m_pContext->*(pVT->pSetShaderResources))(pResourceDep->StartIndex, pResourceDep->Count, pResourceDep->ppD3DObjects);
    }

    // Set the UAVs
    // UAV ranges were combined in EffectLoad.  This code remains unchanged, however, so that ranges can be easily split
    D3DXASSERT( pBlock->UAVDepCount < 2 );
    //LOG ("Start OMSet Targets");
    if( pBlock->UAVDepCount > 0 )
    {
        if (SUnorderedAccessViewDependency *pUAVDep = pBlock->pUAVDeps)
        {
        
            D3DXASSERT(pUAVDep->ppFXPointers);

            for (i=0; i<pUAVDep->Count; i++)
            {
                pUAVDep->ppD3DObjects[i] = pUAVDep->ppFXPointers[i]->pUnorderedAccessView;
            }

            if( EOT_ComputeShader5 == pBlock->GetShaderType() )
            {
                //LOG ("OMSet Targets 1");
                m_pContext->CSSetUnorderedAccessViews( pUAVDep->StartIndex, pUAVDep->Count, pUAVDep->ppD3DObjects, g_pNegativeOnes );
                //LOG ("OMSet Targets 3");
            }
            else
            {
            // mdavidson ... change
                //LOG ("OMSet Targets 2");
                // This call could be combined with the call to set render targets if both exist in the pass
                m_pContext->OMSetRenderTargetsAndUnorderedAccessViews( D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL, nullptr, nullptr, pUAVDep->StartIndex, pUAVDep->Count, pUAVDep->ppD3DObjects, g_pNegativeOnes );
               // LOG ("OMSet Targets 4");
            }
        }
    }
    //LOG ("Finished OMSet Targets");

    // Update Interface dependencies
    UINT Interfaces = 0;
    ID3D11ClassInstance** ppClassInstances = nullptr;
    D3DXASSERT( pBlock->InterfaceDepCount < 2 );
    if( pBlock->InterfaceDepCount > 0 )
    {
        SInterfaceDependency *pInterfaceDep = pBlock->pInterfaceDeps;
        D3DXASSERT(pInterfaceDep->ppFXPointers);

        ppClassInstances = pInterfaceDep->ppD3DObjects;
        Interfaces = pInterfaceDep->Count;
        for (i=0; i<pInterfaceDep->Count; i++)
        {
            SClassInstanceGlobalVariable* pCI = pInterfaceDep->ppFXPointers[i]->pClassInstance;
            if( pCI )
            {
                D3DXASSERT( pCI->pMemberData != nullptr );
                pInterfaceDep->ppD3DObjects[i] = pCI->pMemberData->Data.pD3DClassInstance;
            }
            else
            {
                pInterfaceDep->ppD3DObjects[i] = nullptr;
            }
        }
    }

    // Now set the shader
    (m_pContext->*(pVT->pSetShader))(pBlock->pD3DObject, ppClassInstances, Interfaces);
}
Example #2
0
void 
CEffect::CommitChanges( SPassBlock *pBlock )
{
	// update vertex shader
	if (pBlock->BackingStore.pVertexShaderBlock)
	{
		SShaderBlock* shaderBlock = pBlock->BackingStore.pVertexShaderBlock;
		UINT i;
		SD3DShaderVTable *pVT = shaderBlock->pVT;

		// Apply constant buffers first (tbuffers are done later)
		SShaderCBDependency *pCBDep = shaderBlock->pCBDeps;
		SShaderCBDependency *pLastCBDep = shaderBlock->pCBDeps + shaderBlock->CBDepCount;

		for (; pCBDep<pLastCBDep; pCBDep++)
		{
			D3DXASSERT(pCBDep->ppFXPointers);

			for (i = 0; i < pCBDep->Count; ++ i)
			{
				CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)pCBDep->ppFXPointers[i]);
			}

		}

		SConstantBuffer **ppTB = shaderBlock->ppTbufDeps;
		SConstantBuffer **ppLastTB = ppTB + shaderBlock->TBufferDepCount;

		for (; ppTB<ppLastTB; ppTB++)
		{
			CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)*ppTB);
		}

		// Set the textures
		SShaderResourceDependency *pResourceDep = shaderBlock->pResourceDeps;
		SShaderResourceDependency *pLastResourceDep = shaderBlock->pResourceDeps + shaderBlock->ResourceDepCount;

		for (; pResourceDep<pLastResourceDep; pResourceDep++)
		{
			D3DXASSERT(pResourceDep->ppFXPointers);

			for (i=0; i<pResourceDep->Count; i++)
			{
				pResourceDep->ppD3DObjects[i] = pResourceDep->ppFXPointers[i]->pShaderResource;
			}

			(m_pContext->*(pVT->pSetShaderResources))(pResourceDep->StartIndex, pResourceDep->Count, pResourceDep->ppD3DObjects);
		}
	}

	// update pixel shader
	if (pBlock->BackingStore.pPixelShaderBlock)
	{
		SShaderBlock* shaderBlock = pBlock->BackingStore.pPixelShaderBlock;
		UINT i;
		SD3DShaderVTable *pVT = shaderBlock->pVT;

		// Apply constant buffers first (tbuffers are done later)
		SShaderCBDependency *pCBDep = shaderBlock->pCBDeps;
		SShaderCBDependency *pLastCBDep = shaderBlock->pCBDeps + shaderBlock->CBDepCount;

		for (; pCBDep<pLastCBDep; pCBDep++)
		{
			D3DXASSERT(pCBDep->ppFXPointers);

			for (i = 0; i < pCBDep->Count; ++ i)
			{
				CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)pCBDep->ppFXPointers[i]);
			}

		}

		SConstantBuffer **ppTB = shaderBlock->ppTbufDeps;
		SConstantBuffer **ppLastTB = ppTB + shaderBlock->TBufferDepCount;

		for (; ppTB<ppLastTB; ppTB++)
		{
			CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)*ppTB);
		}

		// Set the textures
		SShaderResourceDependency *pResourceDep = shaderBlock->pResourceDeps;
		SShaderResourceDependency *pLastResourceDep = shaderBlock->pResourceDeps + shaderBlock->ResourceDepCount;

		for (; pResourceDep<pLastResourceDep; pResourceDep++)
		{
			D3DXASSERT(pResourceDep->ppFXPointers);

			for (i=0; i<pResourceDep->Count; i++)
			{
				pResourceDep->ppD3DObjects[i] = pResourceDep->ppFXPointers[i]->pShaderResource;
			}

			(m_pContext->*(pVT->pSetShaderResources))(pResourceDep->StartIndex, pResourceDep->Count, pResourceDep->ppD3DObjects);
		}
	}

	// update geometry shader
	if (pBlock->BackingStore.pGeometryShaderBlock)
	{
		SShaderBlock* shaderBlock = pBlock->BackingStore.pGeometryShaderBlock;
		UINT i;
		SD3DShaderVTable *pVT = shaderBlock->pVT;

		// Apply constant buffers first (tbuffers are done later)
		SShaderCBDependency *pCBDep = shaderBlock->pCBDeps;
		SShaderCBDependency *pLastCBDep = shaderBlock->pCBDeps + shaderBlock->CBDepCount;

		for (; pCBDep<pLastCBDep; pCBDep++)
		{
			D3DXASSERT(pCBDep->ppFXPointers);

			for (i = 0; i < pCBDep->Count; ++ i)
			{
				CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)pCBDep->ppFXPointers[i]);
			}

		}

		SConstantBuffer **ppTB = shaderBlock->ppTbufDeps;
		SConstantBuffer **ppLastTB = ppTB + shaderBlock->TBufferDepCount;

		for (; ppTB<ppLastTB; ppTB++)
		{
			CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)*ppTB);
		}

		// Set the textures
		SShaderResourceDependency *pResourceDep = shaderBlock->pResourceDeps;
		SShaderResourceDependency *pLastResourceDep = shaderBlock->pResourceDeps + shaderBlock->ResourceDepCount;

		for (; pResourceDep<pLastResourceDep; pResourceDep++)
		{
			D3DXASSERT(pResourceDep->ppFXPointers);

			for (i=0; i<pResourceDep->Count; i++)
			{
				pResourceDep->ppD3DObjects[i] = pResourceDep->ppFXPointers[i]->pShaderResource;
			}

			(m_pContext->*(pVT->pSetShaderResources))(pResourceDep->StartIndex, pResourceDep->Count, pResourceDep->ppD3DObjects);
		}
	}

	// update hull shader
	if (pBlock->BackingStore.pHullShaderBlock)
	{
		SShaderBlock* shaderBlock = pBlock->BackingStore.pHullShaderBlock;
		UINT i;
		SD3DShaderVTable *pVT = shaderBlock->pVT;

		// Apply constant buffers first (tbuffers are done later)
		SShaderCBDependency *pCBDep = shaderBlock->pCBDeps;
		SShaderCBDependency *pLastCBDep = shaderBlock->pCBDeps + shaderBlock->CBDepCount;

		for (; pCBDep<pLastCBDep; pCBDep++)
		{
			D3DXASSERT(pCBDep->ppFXPointers);

			for (i = 0; i < pCBDep->Count; ++ i)
			{
				CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)pCBDep->ppFXPointers[i]);
			}

		}

		SConstantBuffer **ppTB = shaderBlock->ppTbufDeps;
		SConstantBuffer **ppLastTB = ppTB + shaderBlock->TBufferDepCount;

		for (; ppTB<ppLastTB; ppTB++)
		{
			CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)*ppTB);
		}

		// Set the textures
		SShaderResourceDependency *pResourceDep = shaderBlock->pResourceDeps;
		SShaderResourceDependency *pLastResourceDep = shaderBlock->pResourceDeps + shaderBlock->ResourceDepCount;

		for (; pResourceDep<pLastResourceDep; pResourceDep++)
		{
			D3DXASSERT(pResourceDep->ppFXPointers);

			for (i=0; i<pResourceDep->Count; i++)
			{
				pResourceDep->ppD3DObjects[i] = pResourceDep->ppFXPointers[i]->pShaderResource;
			}

			(m_pContext->*(pVT->pSetShaderResources))(pResourceDep->StartIndex, pResourceDep->Count, pResourceDep->ppD3DObjects);
		}
	}

	// update domain shader
	if (pBlock->BackingStore.pDomainShaderBlock)
	{
		SShaderBlock* shaderBlock = pBlock->BackingStore.pDomainShaderBlock;
		UINT i;
		SD3DShaderVTable *pVT = shaderBlock->pVT;

		// Apply constant buffers first (tbuffers are done later)
		SShaderCBDependency *pCBDep = shaderBlock->pCBDeps;
		SShaderCBDependency *pLastCBDep = shaderBlock->pCBDeps + shaderBlock->CBDepCount;

		for (; pCBDep<pLastCBDep; pCBDep++)
		{
			D3DXASSERT(pCBDep->ppFXPointers);

			for (i = 0; i < pCBDep->Count; ++ i)
			{
				CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)pCBDep->ppFXPointers[i]);
			}

		}

		SConstantBuffer **ppTB = shaderBlock->ppTbufDeps;
		SConstantBuffer **ppLastTB = ppTB + shaderBlock->TBufferDepCount;

		for (; ppTB<ppLastTB; ppTB++)
		{
			CheckAndUpdateCB_FX(m_pContext, (SConstantBuffer*)*ppTB);
		}

		// Set the textures
		SShaderResourceDependency *pResourceDep = shaderBlock->pResourceDeps;
		SShaderResourceDependency *pLastResourceDep = shaderBlock->pResourceDeps + shaderBlock->ResourceDepCount;

		for (; pResourceDep<pLastResourceDep; pResourceDep++)
		{
			D3DXASSERT(pResourceDep->ppFXPointers);

			for (i=0; i<pResourceDep->Count; i++)
			{
				pResourceDep->ppD3DObjects[i] = pResourceDep->ppFXPointers[i]->pShaderResource;
			}

			(m_pContext->*(pVT->pSetShaderResources))(pResourceDep->StartIndex, pResourceDep->Count, pResourceDep->ppD3DObjects);
		}
	}
	
}