@@ -771,24 +771,19 @@ void StateManager11::setShaderResourceInternal(gl::ShaderType shaderType,
771771 {
772772 ID3D11DeviceContext *deviceContext = mRenderer ->getDeviceContext ();
773773 ID3D11ShaderResourceView *srvPtr = srv ? srv->get () : nullptr ;
774+ if (srvPtr)
775+ {
776+ uintptr_t resource = reinterpret_cast <uintptr_t >(GetViewResource (srvPtr));
777+ unsetConflictingUAVs (gl::PipelineType::GraphicsPipeline, gl::ShaderType::Compute,
778+ resource, nullptr );
779+ }
780+
774781 switch (shaderType)
775782 {
776783 case gl::ShaderType::Vertex:
777- if (srvPtr)
778- {
779- uintptr_t resource = reinterpret_cast <uintptr_t >(GetViewResource (srvPtr));
780- unsetConflictingUAVs (gl::PipelineType::GraphicsPipeline,
781- gl::ShaderType::Compute, resource, nullptr );
782- }
783784 deviceContext->VSSetShaderResources (resourceSlot, 1 , &srvPtr);
784785 break ;
785786 case gl::ShaderType::Fragment:
786- if (srvPtr)
787- {
788- uintptr_t resource = reinterpret_cast <uintptr_t >(GetViewResource (srvPtr));
789- unsetConflictingUAVs (gl::PipelineType::GraphicsPipeline,
790- gl::ShaderType::Compute, resource, nullptr );
791- }
792787 deviceContext->PSSetShaderResources (resourceSlot, 1 , &srvPtr);
793788 break ;
794789 case gl::ShaderType::Compute:
@@ -824,6 +819,8 @@ void StateManager11::setUnorderedAccessViewInternal(gl::ShaderType shaderType,
824819 resource, nullptr , false );
825820 unsetConflictingSRVs (gl::PipelineType::ComputePipeline, gl::ShaderType::Fragment,
826821 resource, nullptr , false );
822+ unsetConflictingSRVs (gl::PipelineType::ComputePipeline, gl::ShaderType::Compute,
823+ resource, nullptr , false );
827824 }
828825 deviceContext->CSSetUnorderedAccessViews (resourceSlot, 1 , &uavPtr, nullptr );
829826
@@ -1782,82 +1779,6 @@ angle::Result StateManager11::onMakeCurrent(const gl::Context *context)
17821779 return angle::Result::Continue;
17831780}
17841781
1785- angle::Result StateManager11::clearSRVs (gl::ShaderType shaderType,
1786- size_t rangeStart,
1787- size_t rangeEnd)
1788- {
1789- if (rangeStart == rangeEnd)
1790- {
1791- return angle::Result::Continue;
1792- }
1793-
1794- auto *currentSRVs = getSRVCache (shaderType);
1795- gl::Range<size_t > clearRange (rangeStart, std::min (rangeEnd, currentSRVs->highestUsed ()));
1796- if (clearRange.empty ())
1797- {
1798- return angle::Result::Continue;
1799- }
1800-
1801- ID3D11DeviceContext *deviceContext = mRenderer ->getDeviceContext ();
1802- switch (shaderType)
1803- {
1804- case gl::ShaderType::Vertex:
1805- deviceContext->VSSetShaderResources (static_cast <unsigned int >(clearRange.low ()),
1806- static_cast <unsigned int >(clearRange.length ()),
1807- &mNullSRVs [0 ]);
1808- break ;
1809- case gl::ShaderType::Fragment:
1810- deviceContext->PSSetShaderResources (static_cast <unsigned int >(clearRange.low ()),
1811- static_cast <unsigned int >(clearRange.length ()),
1812- &mNullSRVs [0 ]);
1813- break ;
1814- case gl::ShaderType::Compute:
1815- deviceContext->CSSetShaderResources (static_cast <unsigned int >(clearRange.low ()),
1816- static_cast <unsigned int >(clearRange.length ()),
1817- &mNullSRVs [0 ]);
1818- break ;
1819- default :
1820- UNREACHABLE ();
1821- break ;
1822- }
1823-
1824- for (size_t samplerIndex : clearRange)
1825- {
1826- currentSRVs->update (samplerIndex, nullptr );
1827- }
1828-
1829- return angle::Result::Continue;
1830- }
1831-
1832- angle::Result StateManager11::clearUAVs (gl::ShaderType shaderType,
1833- size_t rangeStart,
1834- size_t rangeEnd)
1835- {
1836- ASSERT (shaderType == gl::ShaderType::Compute);
1837- if (rangeStart == rangeEnd)
1838- {
1839- return angle::Result::Continue;
1840- }
1841-
1842- gl::Range<size_t > clearRange (rangeStart, std::min (rangeEnd, mCurComputeUAVs .highestUsed ()));
1843- if (clearRange.empty ())
1844- {
1845- return angle::Result::Continue;
1846- }
1847-
1848- ID3D11DeviceContext *deviceContext = mRenderer ->getDeviceContext ();
1849- deviceContext->CSSetUnorderedAccessViews (static_cast <unsigned int >(clearRange.low ()),
1850- static_cast <unsigned int >(clearRange.length ()),
1851- &mNullUAVs [0 ], nullptr );
1852-
1853- for (size_t index : clearRange)
1854- {
1855- mCurComputeUAVs .update (index, nullptr );
1856- }
1857-
1858- return angle::Result::Continue;
1859- }
1860-
18611782void StateManager11::unsetConflictingView (gl::PipelineType pipeline,
18621783 ID3D11View *view,
18631784 bool isRenderTarget)
@@ -2848,15 +2769,6 @@ angle::Result StateManager11::applyTexturesForSRVs(const gl::Context *context,
28482769 ANGLE_TRY (setTextureForImage (context, shaderType, readonlyImageIndex, true , imageUnit));
28492770 }
28502771
2851- size_t samplerCount = caps.maxShaderTextureImageUnits [shaderType];
2852- size_t readonlyImageCount =
2853- context->getClientVersion () >= gl::Version (3 , 1 ) ? caps.maxImageUnits : 0 ;
2854-
2855- // Samplers and readonly images share the SRVs here, their range is
2856- // [0, max(samplerRange.high(), readonlyImageRange.high()).
2857- ANGLE_TRY (clearSRVs (shaderType, std::max (samplerRange.high (), readonlyImageRange.high ()),
2858- samplerCount + readonlyImageCount));
2859-
28602772 return angle::Result::Continue;
28612773}
28622774
@@ -2882,18 +2794,11 @@ angle::Result StateManager11::applyTexturesForUAVs(const gl::Context *context,
28822794 ANGLE_TRY (setTextureForImage (context, shaderType, imageIndex, false , imageUnit));
28832795 }
28842796
2885- size_t imageCount = caps.maxImageUnits ;
2886- ANGLE_TRY (clearUAVs (shaderType, imageRange.high (), imageCount));
2887-
28882797 return angle::Result::Continue;
28892798}
28902799
28912800angle::Result StateManager11::syncTexturesForCompute (const gl::Context *context)
28922801{
2893- // applyTexturesForUAVs must be earlier than applyTexturesForSRVs since we need to do clearUVAs
2894- // before set resources to SRVs. Otherwise, it will report the following error:
2895- // ID3D11DeviceContext::CSSetShaderResources: Resource being set to CS shader resource slot 0 is
2896- // still bound on output! Forcing to NULL.
28972802 ANGLE_TRY (applyTexturesForUAVs (context, gl::ShaderType::Compute));
28982803 ANGLE_TRY (applyTexturesForSRVs (context, gl::ShaderType::Compute));
28992804 return angle::Result::Continue;
@@ -2908,6 +2813,21 @@ angle::Result StateManager11::setTextureForImage(const gl::Context *context,
29082813 TextureD3D *textureImpl = nullptr ;
29092814 if (!imageUnit.texture .get ())
29102815 {
2816+ // The texture is used in shader. However, there is no resource binding to it. We
2817+ // should clear the corresponding UAV/SRV in case the previous view type is a buffer not a
2818+ // texture. Otherwise, below error will be reported. The Unordered Access View dimension
2819+ // declared in the shader code (TEXTURE2D) does not match the view type bound to slot 0
2820+ // of the Compute Shader unit (BUFFER).
2821+ if (readonly)
2822+ {
2823+ setShaderResourceInternal<d3d11::ShaderResourceView>(type, static_cast <UINT>(index),
2824+ nullptr );
2825+ }
2826+ else
2827+ {
2828+ setUnorderedAccessViewInternal<d3d11::UnorderedAccessView>(
2829+ type, static_cast <UINT>(index), nullptr );
2830+ }
29112831 return angle::Result::Continue;
29122832 }
29132833
@@ -3718,9 +3638,20 @@ angle::Result StateManager11::syncShaderStorageBuffersForShader(const gl::Contex
37183638 blockIndex++)
37193639 {
37203640 GLuint binding = program->getShaderStorageBlockBinding (static_cast <GLuint>(blockIndex));
3641+ const unsigned int registerIndex = mProgramD3D ->getShaderStorageBufferRegisterIndex (
3642+ static_cast <GLuint>(blockIndex), shaderType);
3643+ // It means this block is active but not statically used.
3644+ if (registerIndex == GL_INVALID_INDEX)
3645+ {
3646+ continue ;
3647+ }
37213648 const auto &shaderStorageBuffer = glState.getIndexedShaderStorageBuffer (binding);
37223649 if (shaderStorageBuffer.get () == nullptr )
37233650 {
3651+ // We didn't see a driver error like atomic buffer did. But theoretically, the same
3652+ // thing should be done.
3653+ setUnorderedAccessViewInternal<d3d11::UnorderedAccessView>(shaderType, registerIndex,
3654+ nullptr );
37243655 continue ;
37253656 }
37263657
@@ -3750,29 +3681,11 @@ angle::Result StateManager11::syncShaderStorageBuffersForShader(const gl::Contex
37503681 ANGLE_TRY (bufferStorage->getRawUAVRange (context, shaderStorageBuffer.getOffset (), viewSize,
37513682 &uavPtr));
37523683
3753- // We need to make sure that resource being set to UnorderedAccessView slot |registerIndex|
3754- // is not bound on SRV.
3755- if (uavPtr)
3756- {
3757- unsetConflictingView (gl::GetPipelineType (shaderType), uavPtr->get (), false );
3758- }
3759-
3760- const unsigned int registerIndex = mProgramD3D ->getShaderStorageBufferRegisterIndex (
3761- static_cast <GLuint>(blockIndex), shaderType);
3762-
3763- // It means this block is active but not statically used.
3764- if (registerIndex == GL_INVALID_INDEX)
3765- {
3766- continue ;
3767- }
3768-
37693684 switch (shaderType)
37703685 {
37713686 case gl::ShaderType::Compute:
37723687 {
3773- ID3D11UnorderedAccessView *uav = uavPtr->get ();
3774- ID3D11DeviceContext *deviceContext = mRenderer ->getDeviceContext ();
3775- deviceContext->CSSetUnorderedAccessViews (registerIndex, 1 , &uav, nullptr );
3688+ setUnorderedAccessViewInternal (shaderType, registerIndex, uavPtr);
37763689 break ;
37773690 }
37783691
@@ -3831,9 +3744,18 @@ angle::Result StateManager11::syncAtomicCounterBuffersForShader(const gl::Contex
38313744 {
38323745 GLuint binding = atomicCounterBuffer.binding ;
38333746 const auto &buffer = glState.getIndexedAtomicCounterBuffer (binding);
3834-
3747+ const unsigned int registerIndex =
3748+ mProgramD3D ->getAtomicCounterBufferRegisterIndex (binding, shaderType);
3749+ ASSERT (registerIndex != GL_INVALID_INDEX);
38353750 if (buffer.get () == nullptr )
38363751 {
3752+ // The atomic counter is used in shader. However, there is no buffer binding to it. We
3753+ // should clear the corresponding UAV in case the previous view type is a texture not a
3754+ // buffer. Otherwise, below error will be reported. The Unordered Access View dimension
3755+ // declared in the shader code (BUFFER) does not match the view type bound to slot 0
3756+ // of the Compute Shader unit (TEXTURE2D).
3757+ setUnorderedAccessViewInternal<d3d11::UnorderedAccessView>(shaderType, registerIndex,
3758+ nullptr );
38373759 continue ;
38383760 }
38393761
@@ -3847,21 +3769,9 @@ angle::Result StateManager11::syncAtomicCounterBuffersForShader(const gl::Contex
38473769 d3d11::UnorderedAccessView *uavPtr = nullptr ;
38483770 ANGLE_TRY (bufferStorage->getRawUAVRange (context, buffer.getOffset (), viewSize, &uavPtr));
38493771
3850- // We need to make sure that resource being set to UnorderedAccessView slot |registerIndex|
3851- // is not bound on SRV.
3852- if (uavPtr)
3853- {
3854- unsetConflictingView (gl::GetPipelineType (shaderType), uavPtr->get (), false );
3855- }
3856-
3857- const unsigned int registerIndex =
3858- mProgramD3D ->getAtomicCounterBufferRegisterIndex (binding, shaderType);
3859-
38603772 if (shaderType == gl::ShaderType::Compute)
38613773 {
3862- ID3D11UnorderedAccessView *uav = uavPtr->get ();
3863- ID3D11DeviceContext *deviceContext = mRenderer ->getDeviceContext ();
3864- deviceContext->CSSetUnorderedAccessViews (registerIndex, 1 , &uav, nullptr );
3774+ setUnorderedAccessViewInternal (shaderType, registerIndex, uavPtr);
38653775 }
38663776 else
38673777 {
0 commit comments