From d356f7df6fd64e5938407330e353842f0205af5e Mon Sep 17 00:00:00 2001 From: John Corbally Date: Wed, 30 Oct 2019 11:14:45 +0000 Subject: [PATCH] Fix missing image memory barrier in WSI display timing tests The key part of the missing image memory barrier is changing VK_IMAGE_LAYOUT_UNDEFINED to VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL (for the first time). Affects: dEQP-VK.wsi.android.display_timing.* Components: Vulkan VK-GL-CTS issue: 2079 Change-Id: I79e142c9c2a602e066a51e69e3aca9a1d2c0e650 --- .../vulkan/wsi/vktWsiDisplayTimingTests.cpp | 36 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp b/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp index d5da904..767b787 100644 --- a/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp +++ b/external/vulkancts/modules/vulkan/wsi/vktWsiDisplayTimingTests.cpp @@ -285,6 +285,8 @@ vk::Move createCommandBuffer (const vk::DeviceInterface& vk vk::VkRenderPass renderPass, vk::VkFramebuffer framebuffer, vk::VkPipeline pipeline, + vk::VkImage image, + bool isFirst, size_t frameNdx, deUint32 quadCount, deUint32 imageWidth, @@ -303,7 +305,32 @@ vk::Move createCommandBuffer (const vk::DeviceInterface& vk vk::Move commandBuffer (vk::allocateCommandBuffer(vkd, device, &allocateInfo)); beginCommandBuffer(vkd, *commandBuffer, 0u); - beginRenderPass(vkd, *commandBuffer, renderPass, framebuffer, vk::makeRect2D(0, 0, imageWidth, imageHeight), tcu::Vec4(0.25f, 0.5f, 0.75f, 1.0f)); + { + 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_COLOR_ATTACHMENT_WRITE_BIT, + vk::VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | vk::VK_ACCESS_COLOR_ATTACHMENT_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); + } + + beginRenderPass(vkd, *commandBuffer, renderPass, framebuffer, vk::makeRect2D(imageWidth, imageHeight), tcu::Vec4(0.25f, 0.5f, 0.75f, 1.0f)); cmdRenderFrame(vkd, *commandBuffer, pipelineLayout, pipeline, frameNdx, quadCount); @@ -570,6 +597,7 @@ private: vk::Move m_swapchain; std::vector m_swapchainImages; + std::vector m_isFirst; vk::Move m_renderPass; vk::Move m_pipeline; @@ -745,6 +773,7 @@ void DisplayTimingTestInstance::initSwapchainResources (void) m_swapchain = vk::createSwapchainKHR(m_vkd, *m_device, &m_swapchainConfig); m_swapchainImages = vk::wsi::getSwapchainImages(m_vkd, *m_device, *m_swapchain); + 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); @@ -809,6 +838,7 @@ void DisplayTimingTestInstance::deinitSwapchainResources (void) deinitImageViews(m_vkd, *m_device, m_swapchainImageViews); m_swapchainImages.clear(); + m_isFirst.clear(); m_swapchain = vk::Move(); m_renderPass = vk::Move(); @@ -859,7 +889,9 @@ void DisplayTimingTestInstance::render (void) VK_CHECK(m_vkd.acquireNextImageKHR(*m_device, *m_swapchain, foreverNs, currentAcquireSemaphore, (vk::VkFence)0, &imageIndex)); // Create command buffer - m_commandBuffers[m_frameNdx % m_commandBuffers.size()] = createCommandBuffer(m_vkd, *m_device, *m_commandPool, *m_pipelineLayout, *m_renderPass, m_framebuffers[imageIndex], *m_pipeline, m_frameNdx, m_quadCount, 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], m_frameNdx, m_quadCount, width, height).disown(); + m_isFirst[imageIndex] = false; // Obtain timing data from previous frames if (m_useDisplayTiming) -- 2.7.4