// 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); }
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); } } }