D3D11: Support ReadWrite storage texture access Bug: dawn:1972 Test: dawn_end2end_tests Change-Id: Ic917344d9ad7d357a52c443a180c4a11560c9815 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/147440 Reviewed-by: Peng Huang <penghuang@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Jiawei Shao <jiawei.shao@intel.com> Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/native/d3d11/BindGroupTrackerD3D11.cpp b/src/dawn/native/d3d11/BindGroupTrackerD3D11.cpp index 238bf56..4c3deaf 100644 --- a/src/dawn/native/d3d11/BindGroupTrackerD3D11.cpp +++ b/src/dawn/native/d3d11/BindGroupTrackerD3D11.cpp
@@ -188,12 +188,22 @@ } case BindingInfoType::StorageTexture: { - ASSERT(bindingInfo.storageTexture.access == - wgpu::StorageTextureAccess::WriteOnly); - ComPtr<ID3D11UnorderedAccessView> d3d11UAV; - TextureView* view = ToBackend(group->GetBindingAsTextureView(bindingIndex)); - DAWN_TRY_ASSIGN(d3d11UAV, view->CreateD3D11UnorderedAccessView()); - d3d11UAVs.insert(d3d11UAVs.begin(), std::move(d3d11UAV)); + switch (bindingInfo.storageTexture.access) { + case wgpu::StorageTextureAccess::WriteOnly: + case wgpu::StorageTextureAccess::ReadWrite: { + ComPtr<ID3D11UnorderedAccessView> d3d11UAV; + TextureView* view = + ToBackend(group->GetBindingAsTextureView(bindingIndex)); + DAWN_TRY_ASSIGN(d3d11UAV, view->CreateD3D11UnorderedAccessView()); + d3d11UAVs.insert(d3d11UAVs.begin(), std::move(d3d11UAV)); + break; + } + // TODO(dawn:1972): Support ReadOnly storage texture access + case wgpu::StorageTextureAccess::ReadOnly: + default: + UNREACHABLE(); + break; + } break; } case BindingInfoType::Texture: @@ -371,13 +381,22 @@ } case BindingInfoType::StorageTexture: { - ASSERT(bindingInfo.storageTexture.access == wgpu::StorageTextureAccess::WriteOnly); - if (bindingVisibility & wgpu::ShaderStage::Compute) { - ComPtr<ID3D11UnorderedAccessView> d3d11UAV; - TextureView* view = ToBackend(group->GetBindingAsTextureView(bindingIndex)); - DAWN_TRY_ASSIGN(d3d11UAV, view->CreateD3D11UnorderedAccessView()); - deviceContext1->CSSetUnorderedAccessViews(bindingSlot, 1, - d3d11UAV.GetAddressOf(), nullptr); + TextureView* view = ToBackend(group->GetBindingAsTextureView(bindingIndex)); + switch (bindingInfo.storageTexture.access) { + case wgpu::StorageTextureAccess::WriteOnly: + case wgpu::StorageTextureAccess::ReadWrite: { + ComPtr<ID3D11UnorderedAccessView> d3d11UAV; + DAWN_TRY_ASSIGN(d3d11UAV, view->CreateD3D11UnorderedAccessView()); + if (bindingVisibility & wgpu::ShaderStage::Compute) { + deviceContext1->CSSetUnorderedAccessViews( + bindingSlot, 1, d3d11UAV.GetAddressOf(), nullptr); + } + break; + } + // TODO(dawn:1972): Support ReadOnly storage texture access + case wgpu::StorageTextureAccess::ReadOnly: + default: + UNREACHABLE(); } break; } @@ -485,15 +504,25 @@ } case BindingInfoType::StorageTexture: { - ASSERT(bindingInfo.storageTexture.access == wgpu::StorageTextureAccess::WriteOnly); - ID3D11UnorderedAccessView* nullUAV = nullptr; - if (bindingVisibility & wgpu::ShaderStage::Fragment) { - deviceContext1->OMSetRenderTargetsAndUnorderedAccessViews( - D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL, nullptr, nullptr, bindingSlot, - 1, &nullUAV, nullptr); - } - if (bindingVisibility & wgpu::ShaderStage::Compute) { - deviceContext1->CSSetUnorderedAccessViews(bindingSlot, 1, &nullUAV, nullptr); + switch (bindingInfo.storageTexture.access) { + case wgpu::StorageTextureAccess::WriteOnly: + case wgpu::StorageTextureAccess::ReadWrite: { + ID3D11UnorderedAccessView* nullUAV = nullptr; + if (bindingVisibility & wgpu::ShaderStage::Fragment) { + deviceContext1->OMSetRenderTargetsAndUnorderedAccessViews( + D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL, nullptr, nullptr, + bindingSlot, 1, &nullUAV, nullptr); + } + if (bindingVisibility & wgpu::ShaderStage::Compute) { + deviceContext1->CSSetUnorderedAccessViews(bindingSlot, 1, &nullUAV, + nullptr); + } + break; + } + // TODO(dawn:1972): Support ReadOnly storage texture access + case wgpu::StorageTextureAccess::ReadOnly: + default: + UNREACHABLE(); } break; }
diff --git a/src/dawn/native/d3d11/PipelineLayoutD3D11.cpp b/src/dawn/native/d3d11/PipelineLayoutD3D11.cpp index c00e423..b7358b4 100644 --- a/src/dawn/native/d3d11/PipelineLayoutD3D11.cpp +++ b/src/dawn/native/d3d11/PipelineLayoutD3D11.cpp
@@ -75,6 +75,9 @@ break; case BindingInfoType::StorageTexture: + // TODO(dawn:1972): Support ReadOnly storage texture access. + ASSERT(bindingInfo.storageTexture.access != + wgpu::StorageTextureAccess::ReadOnly); mIndexInfo[group][bindingIndex] = --unorderedAccessViewIndex; mUAVBindGroups.set(group); break;
diff --git a/src/dawn/tests/end2end/StorageTextureTests.cpp b/src/dawn/tests/end2end/StorageTextureTests.cpp index faa5b03..186a4a9 100644 --- a/src/dawn/tests/end2end/StorageTextureTests.cpp +++ b/src/dawn/tests/end2end/StorageTextureTests.cpp
@@ -1152,8 +1152,9 @@ expectedData.size() * sizeof(uint32_t)); } -// TODO(dawn:1972): Support ReadWrite storage texture access on D3D11 and OpenGL backends +// TODO(dawn:1972): Support ReadWrite storage texture access on OpenGL DAWN_INSTANTIATE_TEST(ReadWriteStorageTextureTests, + D3D11Backend(), D3D12Backend(), MetalBackend(), VulkanBackend());