Vulkan: Enable nonzero_clear_resources_on_creation_for_testing on buffer
This patch enables nonzero_clear_resources_on_creation_for_testing
toggle on buffer on Vulkan backends as a preparation of supporting
buffer lazy-initialization in Dawn.
BUG=dawn:414
TEST=dawn_end2end_tests
Change-Id: I7619d02ae898e30fd15438d35437802a09e959cc
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/22981
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn_native/vulkan/BufferVk.cpp b/src/dawn_native/vulkan/BufferVk.cpp
index 6bd2987..cd35b4c 100644
--- a/src/dawn_native/vulkan/BufferVk.cpp
+++ b/src/dawn_native/vulkan/BufferVk.cpp
@@ -165,6 +165,10 @@
mMemoryAllocation.GetOffset()),
"vkBindBufferMemory"));
+ if (device->IsToggleEnabled(Toggle::NonzeroClearResourcesOnCreationForTesting)) {
+ ClearBuffer(device->GetPendingRecordingContext(), ClearValue::NonZero);
+ }
+
return {};
}
@@ -283,4 +287,20 @@
}
}
+ 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 93669b6..1c048703 100644
--- a/src/dawn_native/vulkan/BufferVk.h
+++ b/src/dawn_native/vulkan/BufferVk.h
@@ -49,6 +49,7 @@
~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 088c10a..aeb62f9 100644
--- a/src/tests/end2end/NonzeroBufferCreationTests.cpp
+++ b/src/tests/end2end/NonzeroBufferCreationTests.cpp
@@ -51,4 +51,5 @@
}
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"}));