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