Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 3b22559

Browse files
qjia7Commit Bot
authored andcommitted
Fix the DispatchCompute error
The error happens when a RWTexture is used in shader. However, there is no resource binding to it. We should clear the corresponding UAV in case the previous view type is a bufer not a texture. Meanwhile, this patch removes clearSRVs/clearUAVs since we use unsetConflictingSRVs/unsetConflictingUAVs to do the similar thing. Bug: angleproject:3512, angleproject:3548 Change-Id: I01752bb9bc6aca5b767599639c4dc613b4e2e2d2 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1662017 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Jiajia Qin <jiajia.qin@intel.com>
1 parent eb66fe4 commit 3b22559

File tree

3 files changed

+226
-141
lines changed

3 files changed

+226
-141
lines changed

src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp

Lines changed: 47 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
18611782
void 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

28912800
angle::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
{

src/libANGLE/renderer/d3d/d3d11/StateManager11.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,6 @@ class StateManager11 final : angle::NonCopyable
354354
bool readonly,
355355
const gl::ImageUnit &imageUnit);
356356

357-
// Faster than calling setTexture a jillion times
358-
angle::Result clearSRVs(gl::ShaderType shaderType, size_t rangeStart, size_t rangeEnd);
359-
angle::Result clearUAVs(gl::ShaderType shaderType, size_t rangeStart, size_t rangeEnd);
360357
void handleMultiviewDrawFramebufferChange(const gl::Context *context);
361358

362359
angle::Result syncCurrentValueAttribs(

0 commit comments

Comments
 (0)