Fix the verification of multi-layered decode images

The layer of the image must be taken into account when
doing layout transition and copy when using multi-layered video decode images that coincide with DPB.

No functional change.

Affects:
    dEQP-VK.video.decode.*

VK-GL-CTS issue: 4745

Components: Vulkan

Change-Id: I12ce8cea57f1fe7c51059a6e0940872a36442564
(cherry picked from commit 4db0471ddb6d21ac14895db5d4f51295b00ad57e)
diff --git a/external/fetch_sources.py b/external/fetch_sources.py
index b480098..625a39c 100644
--- a/external/fetch_sources.py
+++ b/external/fetch_sources.py
@@ -340,7 +340,7 @@
 	GitRepo(
 		"https://github.com/Igalia/vk_video_samples.git",
 		"git@github.com:Igalia/vk_video_samples.git",
-		"cts-integration-0.9.9-1",
+		"cts-integration-0.9.9-2",
 		"nvidia-video-samples"),
 	GitRepo(
 		"https://github.com/Igalia/ESExtractor.git",
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.cpp b/external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.cpp
index 3da9904..c70334a 100644
--- a/external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.cpp
+++ b/external/vulkancts/modules/vulkan/video/vktVideoBaseDecodeUtils.cpp
@@ -1396,6 +1396,10 @@
 	{
 		// For the Output Coincide, the DPB and destination output resources are the same.
 		pPicParams->decodeFrameInfo.dstPictureResource = pPicParams->dpbSetupPictureResource;
+
+		// Also, when we are copying the output we need to know which layer is used for the current frame.
+		// This is if a multi-layered image is used for the DPB and the output (since they coincide).
+		cachedParameters->decodedPictureInfo.imageLayerIndex = pPicParams->dpbSetupPictureResource.baseArrayLayer;
 	}
 	else if (pOutputPictureResourceInfo)
 	{
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.cpp b/external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.cpp
index 2fe0b81..b8e595b 100644
--- a/external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.cpp
+++ b/external/vulkancts/modules/vulkan/video/vktVideoDecodeTests.cpp
@@ -550,11 +550,12 @@
 	const VkExtent2D						 imageExtent{(deUint32)frame->displayWidth, (deUint32)frame->displayHeight};
 	const VkImage							 image	= frame->outputImageView->GetImageResource()->GetImage();
 	const VkFormat							 format = frame->outputImageView->GetImageResource()->GetImageCreateInfo().format;
+	const uint32_t							 videoImageLayerIndex = frame->imageLayerIndex;
 
 	MovePtr<vkt::ycbcr::MultiPlaneImageData> multiPlaneImageData(new vkt::ycbcr::MultiPlaneImageData(format, tcu::UVec2(imageExtent.width, imageExtent.height)));
 	const VkQueue							 queueDecode				   = getDeviceQueue(vkd, device, queueFamilyIndexDecode, 0u);
 	const VkQueue							 queueTransfer				   = getDeviceQueue(vkd, device, queueFamilyIndexTransfer, 0u);
-	const VkImageSubresourceRange			 imageSubresourceRange		   = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1);
+	const VkImageSubresourceRange			 imageSubresourceRange		   = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, videoImageLayerIndex, 1);
 	const VkImageMemoryBarrier2KHR			 imageBarrierDecode			   = makeImageMemoryBarrier2(VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR,
 																				 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,
 																				 VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR,
@@ -646,7 +647,9 @@
 
 	VK_CHECK(vkd.waitForFences(device, DE_LENGTH_OF_ARRAY(fences), fences, DE_TRUE, ~0ull));
 
-	vkt::ycbcr::downloadImage(vkd, device, queueFamilyIndexTransfer, devctx.allocator(), image, multiPlaneImageData.get(), 0, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+	vkt::ycbcr::downloadImage(vkd, device, queueFamilyIndexTransfer, devctx.allocator(), image,
+	                          multiPlaneImageData.get(), 0, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+	                          videoImageLayerIndex);
 
 	const VkImageMemoryBarrier2KHR imageBarrierTransfer2 = makeImageMemoryBarrier2(VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR,
 																				   VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR,
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoFrameBuffer.cpp b/external/vulkancts/modules/vulkan/video/vktVideoFrameBuffer.cpp
index 4604aff..6b14413 100644
--- a/external/vulkancts/modules/vulkan/video/vktVideoFrameBuffer.cpp
+++ b/external/vulkancts/modules/vulkan/video/vktVideoFrameBuffer.cpp
@@ -618,6 +618,8 @@
 	if ((deUint32)pictureIndex < m_perFrameDecodeImageSet.size()) {
 		pDecodedFrame->pictureIndex = pictureIndex;
 
+		pDecodedFrame->imageLayerIndex = m_perFrameDecodeImageSet[pictureIndex].m_picDispInfo.imageLayerIndex;
+
 		pDecodedFrame->decodedImageView = m_perFrameDecodeImageSet[pictureIndex].GetFrameImageView();
 		pDecodedFrame->outputImageView = m_perFrameDecodeImageSet[pictureIndex].GetDisplayImageView();
 
diff --git a/external/vulkancts/modules/vulkan/video/vktVideoFrameBuffer.hpp b/external/vulkancts/modules/vulkan/video/vktVideoFrameBuffer.hpp
index 179c070..b3d913a 100644
--- a/external/vulkancts/modules/vulkan/video/vktVideoFrameBuffer.hpp
+++ b/external/vulkancts/modules/vulkan/video/vktVideoFrameBuffer.hpp
@@ -152,6 +152,7 @@
 struct DecodedFrame
 {
 	int32_t								 pictureIndex;
+	uint32_t							 imageLayerIndex; // The layer of a multi-layered images. Always "0" for single layered images
 	int32_t								 displayWidth;
 	int32_t								 displayHeight;
 	VkSharedBaseObj<VkImageResourceView> decodedImageView;
@@ -176,6 +177,7 @@
 	void								 Reset()
 	{
 		pictureIndex				= -1;
+		imageLayerIndex				= 0;
 		displayWidth				= 0;
 		displayHeight				= 0;
 		decodedImageView			= nullptr;
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp
index 8e1e7e6..341379d 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.cpp
@@ -562,7 +562,8 @@
 					VkImage					image,
 					MultiPlaneImageData*	imageData,
 					VkAccessFlags			prevAccess,
-					VkImageLayout			initialLayout)
+					VkImageLayout			initialLayout,
+					uint32_t			baseArrayLayer)
 {
 	const VkQueue					queue			= getDeviceQueue(vkd, device, queueFamilyNdx, 0u);
 	const Unique<VkCommandPool>		cmdPool			(createCommandPool(vkd, device, (VkCommandPoolCreateFlags)0, queueFamilyNdx));
@@ -597,7 +598,7 @@
 					static_cast<vk::VkImageAspectFlags>(aspect),
 					0u,
 					1u,
-					0u,
+					baseArrayLayer,
 					1u
 				}
 			};
@@ -621,7 +622,7 @@
 				0u,		// bufferOffset
 				0u,		// bufferRowLength
 				0u,		// bufferImageHeight
-				{ (VkImageAspectFlags)aspect, 0u, 0u, 1u },
+				{ (VkImageAspectFlags)aspect, 0u, baseArrayLayer, 1u },
 				makeOffset3D(0u, 0u, 0u),
 				planeExtent
 			};
diff --git a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.hpp b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.hpp
index 7de80ed..780dd83 100644
--- a/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.hpp
+++ b/external/vulkancts/modules/vulkan/ycbcr/vktYCbCrUtil.hpp
@@ -124,7 +124,8 @@
 																		 vk::VkImage				image,
 																		 MultiPlaneImageData*		imageData,
 																		 vk::VkAccessFlags			prevAccess,
-																		 vk::VkImageLayout			initialLayout);
+																		 vk::VkImageLayout			initialLayout,
+																		 uint32_t				baseArrayLayer = 0);
 
 void										readImageMemory				(const vk::DeviceInterface&							vkd,
 																		 vk::VkDevice										device,