Fix layout transition for WSI tests
The initial layout of the renderpass can't be
COLOR_ATTACHMENT_OPTIMAL without any transition
happening upfront.
Affects:
dEQP-VK.wsi.android.display_timing.*
dEQP-VK.wsi.android.incremental_present.*
Components: Vulkan
VK-GL-CTS issue: 565
Change-Id: Ie62f7aee21c52145090bf228db7031c0e4afb347
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp
index 8c2c405..3b2a793 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp
@@ -486,7 +486,7 @@
vk::VK_ATTACHMENT_LOAD_OP_DONT_CARE,
vk::VK_ATTACHMENT_STORE_OP_DONT_CARE,
- vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ vk::VK_IMAGE_LAYOUT_UNDEFINED,
vk::VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
}
};
diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiIncrementalPresentTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiIncrementalPresentTests.cpp
index 2079577..b72a910 100644
--- a/external/vulkancts/modules/vulkan/wsi/vktWsiIncrementalPresentTests.cpp
+++ b/external/vulkancts/modules/vulkan/wsi/vktWsiIncrementalPresentTests.cpp
@@ -363,6 +363,8 @@
vk::VkRenderPass renderPass,
vk::VkFramebuffer framebuffer,
vk::VkPipeline pipeline,
+ vk::VkImage image,
+ bool isFirst,
size_t imageNextFrame,
size_t currentFrame,
deUint32 imageWidth,
@@ -389,6 +391,31 @@
VK_CHECK(vkd.beginCommandBuffer(*commandBuffer, &beginInfo));
{
+ const vk::VkImageSubresourceRange subRange =
+ {
+ vk::VK_IMAGE_ASPECT_COLOR_BIT,
+ 0,
+ 1,
+ 0,
+ 1
+ };
+ const vk::VkImageMemoryBarrier barrier =
+ {
+ vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ DE_NULL,
+ vk::VK_ACCESS_TRANSFER_WRITE_BIT,
+ vk::VK_ACCESS_TRANSFER_READ_BIT | vk::VK_ACCESS_TRANSFER_WRITE_BIT,
+ isFirst ? vk::VK_IMAGE_LAYOUT_UNDEFINED : vk::VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
+ vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_QUEUE_FAMILY_IGNORED,
+ VK_QUEUE_FAMILY_IGNORED,
+ image,
+ subRange
+ };
+ vkd.cmdPipelineBarrier(*commandBuffer, vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, DE_NULL, 0, DE_NULL, 1, &barrier);
+ }
+
+ {
const vk::VkClearValue clearValue = vk::makeClearValueColorF32(0.25f, 0.50f, 0.75f, 1.00f);
const vk::VkRenderPassBeginInfo renderPassBeginInfo =
{
@@ -901,6 +928,7 @@
vk::Move<vk::VkSwapchainKHR> m_swapchain;
std::vector<vk::VkImage> m_swapchainImages;
std::vector<size_t> m_imageNextFrames;
+ std::vector<bool> m_isFirst;
vk::Move<vk::VkRenderPass> m_renderPass;
vk::Move<vk::VkPipeline> m_pipeline;
@@ -1079,6 +1107,7 @@
m_swapchainImages = vk::wsi::getSwapchainImages(m_vkd, *m_device, *m_swapchain);
m_imageNextFrames.resize(m_swapchainImages.size(), 0);
+ m_isFirst.resize(m_swapchainImages.size(), true);
m_renderPass = createRenderPass(m_vkd, *m_device, imageFormat);
m_pipeline = createPipeline(m_vkd, *m_device, *m_renderPass, *m_pipelineLayout, *m_vertexShaderModule, *m_fragmentShaderModule, imageWidth, imageHeight);
@@ -1130,6 +1159,7 @@
m_swapchainImages.clear();
m_imageNextFrames.clear();
+ m_isFirst.clear();
m_swapchain = vk::Move<vk::VkSwapchainKHR>();
m_renderPass = vk::Move<vk::VkRenderPass>();
@@ -1165,8 +1195,9 @@
// Create command buffer
{
imageNextFrame = m_imageNextFrames[imageIndex];
- m_commandBuffers[m_frameNdx % m_commandBuffers.size()] = createCommandBuffer(m_vkd, *m_device, *m_commandPool, *m_pipelineLayout, *m_renderPass, m_framebuffers[imageIndex], *m_pipeline, imageNextFrame, m_frameNdx, width, height).disown();
+ m_commandBuffers[m_frameNdx % m_commandBuffers.size()] = createCommandBuffer(m_vkd, *m_device, *m_commandPool, *m_pipelineLayout, *m_renderPass, m_framebuffers[imageIndex], *m_pipeline, m_swapchainImages[imageIndex], m_isFirst[imageIndex], imageNextFrame, m_frameNdx, width, height).disown();
m_imageNextFrames[imageIndex] = m_frameNdx + 1;
+ m_isFirst[imageIndex] = false;
}
// Submit command buffer