mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-06-08 15:43:41 +00:00
D3D12: Fix UBO and sampler heap encoding test.
The test failed to switch out because the same bindgroups were being de-duped. This change encodes as many bindgroups required to switch. BUG=dawn:155 Change-Id: I238cd0cebf2f8372046fe0cf83a18570aca41761 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/20241 Reviewed-by: Austin Eng <enga@chromium.org> Commit-Queue: Bryan Bernhart <bryan.bernhart@intel.com>
This commit is contained in:
parent
642009261e
commit
b46d002057
@ -580,8 +580,11 @@ TEST_P(D3D12DescriptorHeapTests, EncodeReuseUBOMultipleSubmits) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Verify encoding many sampler and ubo worth of bindgroups.
|
// Verify encoding many sampler and ubo worth of bindgroups.
|
||||||
// Shader-visible heaps should switch out |kNumOfHeaps| times.
|
// Shader-visible heaps should switch out |kNumOfViewHeaps| times.
|
||||||
TEST_P(D3D12DescriptorHeapTests, EncodeManyUBOAndSamplers) {
|
TEST_P(D3D12DescriptorHeapTests, EncodeManyUBOAndSamplers) {
|
||||||
|
DAWN_SKIP_TEST_IF(!mD3DDevice->IsToggleEnabled(
|
||||||
|
dawn_native::Toggle::UseD3D12SmallShaderVisibleHeapForTesting));
|
||||||
|
|
||||||
// Create a solid filled texture.
|
// Create a solid filled texture.
|
||||||
wgpu::TextureDescriptor descriptor;
|
wgpu::TextureDescriptor descriptor;
|
||||||
descriptor.dimension = wgpu::TextureDimension::e2D;
|
descriptor.dimension = wgpu::TextureDimension::e2D;
|
||||||
@ -658,9 +661,26 @@ TEST_P(D3D12DescriptorHeapTests, EncodeManyUBOAndSamplers) {
|
|||||||
wgpu::SamplerDescriptor samplerDescriptor;
|
wgpu::SamplerDescriptor samplerDescriptor;
|
||||||
wgpu::Sampler sampler = device.CreateSampler(&samplerDescriptor);
|
wgpu::Sampler sampler = device.CreateSampler(&samplerDescriptor);
|
||||||
|
|
||||||
constexpr uint32_t kNumOfBindGroups = 4;
|
ShaderVisibleDescriptorAllocator* allocator =
|
||||||
|
mD3DDevice->GetShaderVisibleDescriptorAllocator();
|
||||||
|
|
||||||
|
const Serial heapSerial = allocator->GetShaderVisibleHeapsSerial();
|
||||||
|
|
||||||
|
const uint32_t viewHeapSize =
|
||||||
|
GetShaderVisibleHeapSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
|
||||||
|
|
||||||
|
// "Small" view heap is always 2 x sampler heap size and encodes 3x the descriptors per
|
||||||
|
// group. This means the count of heaps switches is determined by the total number of views
|
||||||
|
// to encode. Compute the number of bindgroups to encode by counting the required views for
|
||||||
|
// |kNumOfViewHeaps| heaps worth.
|
||||||
|
constexpr uint32_t kViewsPerBindGroup = 3;
|
||||||
|
constexpr uint32_t kNumOfViewHeaps = 5;
|
||||||
|
|
||||||
|
const uint32_t numOfEncodedBindGroups =
|
||||||
|
(viewHeapSize * kNumOfViewHeaps) / kViewsPerBindGroup;
|
||||||
|
|
||||||
std::vector<wgpu::BindGroup> bindGroups;
|
std::vector<wgpu::BindGroup> bindGroups;
|
||||||
for (uint32_t i = 0; i < kNumOfBindGroups - 1; i++) {
|
for (uint32_t i = 0; i < numOfEncodedBindGroups - 1; i++) {
|
||||||
std::array<float, 4> fillColor = GetSolidColor(i + 1); // Avoid black
|
std::array<float, 4> fillColor = GetSolidColor(i + 1); // Avoid black
|
||||||
wgpu::Buffer uniformBuffer = utils::CreateBufferFromData(
|
wgpu::Buffer uniformBuffer = utils::CreateBufferFromData(
|
||||||
device, &fillColor, sizeof(fillColor), wgpu::BufferUsage::Uniform);
|
device, &fillColor, sizeof(fillColor), wgpu::BufferUsage::Uniform);
|
||||||
@ -688,16 +708,8 @@ TEST_P(D3D12DescriptorHeapTests, EncodeManyUBOAndSamplers) {
|
|||||||
|
|
||||||
pass.SetPipeline(pipeline);
|
pass.SetPipeline(pipeline);
|
||||||
|
|
||||||
constexpr uint32_t kBindingsPerGroup = 4;
|
for (uint32_t i = 0; i < numOfEncodedBindGroups; ++i) {
|
||||||
constexpr uint32_t kNumOfHeaps = 5;
|
pass.SetBindGroup(0, bindGroups[i]);
|
||||||
|
|
||||||
const uint32_t heapSize = GetShaderVisibleHeapSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
|
|
||||||
const uint32_t bindGroupsPerHeap = heapSize / kBindingsPerGroup;
|
|
||||||
|
|
||||||
ASSERT_TRUE(heapSize % kBindingsPerGroup == 0);
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < kNumOfHeaps * bindGroupsPerHeap; ++i) {
|
|
||||||
pass.SetBindGroup(0, bindGroups[i % kNumOfBindGroups]);
|
|
||||||
pass.Draw(3);
|
pass.Draw(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -711,6 +723,8 @@ TEST_P(D3D12DescriptorHeapTests, EncodeManyUBOAndSamplers) {
|
|||||||
RGBA8 notFilled(0, 0, 0, 0);
|
RGBA8 notFilled(0, 0, 0, 0);
|
||||||
EXPECT_PIXEL_RGBA8_EQ(filled, renderPass.color, 0, 0);
|
EXPECT_PIXEL_RGBA8_EQ(filled, renderPass.color, 0, 0);
|
||||||
EXPECT_PIXEL_RGBA8_EQ(notFilled, renderPass.color, kRTSize - 1, 0);
|
EXPECT_PIXEL_RGBA8_EQ(notFilled, renderPass.color, kRTSize - 1, 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(allocator->GetShaderVisibleHeapsSerial(), heapSerial + kNumOfViewHeaps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user