diff --git a/src/dawn_native/vulkan/BufferVk.cpp b/src/dawn_native/vulkan/BufferVk.cpp index 6bd2987051..cd35b4cf21 100644 --- a/src/dawn_native/vulkan/BufferVk.cpp +++ b/src/dawn_native/vulkan/BufferVk.cpp @@ -165,6 +165,10 @@ namespace dawn_native { namespace vulkan { mMemoryAllocation.GetOffset()), "vkBindBufferMemory")); + if (device->IsToggleEnabled(Toggle::NonzeroClearResourcesOnCreationForTesting)) { + ClearBuffer(device->GetPendingRecordingContext(), ClearValue::NonZero); + } + return {}; } @@ -283,4 +287,20 @@ namespace dawn_native { namespace vulkan { } } + void Buffer::ClearBuffer(CommandRecordingContext* recordingContext, ClearValue clearValue) { + ASSERT(recordingContext != nullptr); + + // TODO(jiawei.shao@intel.com): support buffer lazy-initialization to 0. + ASSERT(clearValue == BufferBase::ClearValue::NonZero); + + constexpr uint32_t kClearBufferValue = 0x01010101; + + TransitionUsageNow(recordingContext, wgpu::BufferUsage::CopyDst); + + Device* device = ToBackend(GetDevice()); + // TODO(jiawei.shao@intel.com): find out why VK_WHOLE_SIZE doesn't work on old Windows Intel + // Vulkan drivers. + device->fn.CmdFillBuffer(recordingContext->commandBuffer, mHandle, 0, GetSize(), + kClearBufferValue); + } }} // namespace dawn_native::vulkan diff --git a/src/dawn_native/vulkan/BufferVk.h b/src/dawn_native/vulkan/BufferVk.h index 93669b61e8..1c04870376 100644 --- a/src/dawn_native/vulkan/BufferVk.h +++ b/src/dawn_native/vulkan/BufferVk.h @@ -49,6 +49,7 @@ namespace dawn_native { namespace vulkan { ~Buffer() override; using BufferBase::BufferBase; MaybeError Initialize(); + void ClearBuffer(CommandRecordingContext* recordingContext, ClearValue clearValue); // Dawn API MaybeError MapReadAsyncImpl(uint32_t serial) override; diff --git a/src/tests/end2end/NonzeroBufferCreationTests.cpp b/src/tests/end2end/NonzeroBufferCreationTests.cpp index 088c10a219..aeb62f9a79 100644 --- a/src/tests/end2end/NonzeroBufferCreationTests.cpp +++ b/src/tests/end2end/NonzeroBufferCreationTests.cpp @@ -51,4 +51,5 @@ TEST_P(NonzeroBufferCreationTests, BufferCreationWithoutCopyDstUsage) { } DAWN_INSTANTIATE_TEST(NonzeroBufferCreationTests, - MetalBackend({"nonzero_clear_resources_on_creation_for_testing"})); + MetalBackend({"nonzero_clear_resources_on_creation_for_testing"}), + VulkanBackend({"nonzero_clear_resources_on_creation_for_testing"}));