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,