Fix validation layer error for ClearImage benchmarks
An image layout transition is necessary before images can be used by
the device.
VUID-VkImageCreateInfo-initialLayout-00993 states that "initialLayout
must be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED".
VUID-vkCmdClearColorImage-imageLayout-00005 states that
"imageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or
.K_IMAGE_LAYOUT_GENERAL"
Bug: b/158231104
Change-Id: I91859af9d6a5c8ed7c0e78eb068bc6d763ccde98
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/62210
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/tests/VulkanBenchmarks/ClearImageBenchmarks.cpp b/tests/VulkanBenchmarks/ClearImageBenchmarks.cpp
index 72a6db2..ed32677 100644
--- a/tests/VulkanBenchmarks/ClearImageBenchmarks.cpp
+++ b/tests/VulkanBenchmarks/ClearImageBenchmarks.cpp
@@ -14,9 +14,11 @@
#include "Util.hpp"
#include "VulkanTester.hpp"
+
#include "benchmark/benchmark.h"
#include <cassert>
+
class ClearImageBenchmark
{
public:
@@ -30,7 +32,7 @@
imageInfo.imageType = vk::ImageType::e2D;
imageInfo.format = clearFormat;
imageInfo.tiling = vk::ImageTiling::eOptimal;
- imageInfo.initialLayout = vk::ImageLayout::eGeneral;
+ imageInfo.initialLayout = vk::ImageLayout::eUndefined;
imageInfo.usage = vk::ImageUsageFlagBits::eTransferDst;
imageInfo.samples = vk::SampleCountFlagBits::e4;
imageInfo.extent = vk::Extent3D(1024, 1024, 1);
@@ -65,6 +67,16 @@
commandBuffer.begin(commandBufferBeginInfo);
+ vk::ImageMemoryBarrier imageMemoryBarrier;
+ imageMemoryBarrier.image = image;
+ imageMemoryBarrier.subresourceRange.aspectMask = clearAspect;
+ imageMemoryBarrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
+ imageMemoryBarrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
+ imageMemoryBarrier.oldLayout = vk::ImageLayout::eUndefined;
+ imageMemoryBarrier.newLayout = vk::ImageLayout::eGeneral;
+ commandBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eAllCommands, vk::PipelineStageFlagBits::eTopOfPipe,
+ vk::DependencyFlagBits::eDeviceGroup, {}, {}, imageMemoryBarrier);
+
vk::ImageSubresourceRange range;
range.aspectMask = clearAspect;
range.baseMipLevel = 0;