From ee8e5f078e5d6e1d6baded08de6f156457309bc1 Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Thu, 2 May 2019 23:13:14 +0200 Subject: [PATCH] Fix image sizes for formats that need a multiple of 2. All these have in their format definition something like "Images in this format must be defined with a width that is a multiple of two." in their format definition. This patch makes sure we actually use even sizes for images with these formats. It is not ideal that I have to hardcode these lists but I don't know a better source to get them from. Affects: dEQP-VK.api.invariance.random Components: Vulkan VK-GL-CTS issue: 1766 Change-Id: Ie19583db56e7ae483136e1fb4651ae625efb9c02 --- .../vulkancts/framework/vulkan/vkImageUtil.cpp | 46 ++++++++++++++++++++++ .../vulkancts/framework/vulkan/vkImageUtil.hpp | 2 + .../api/vktApiMemoryRequirementInvarianceTests.cpp | 15 ++++--- 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/external/vulkancts/framework/vulkan/vkImageUtil.cpp b/external/vulkancts/framework/vulkan/vkImageUtil.cpp index b2a02ab..95ece26 100644 --- a/external/vulkancts/framework/vulkan/vkImageUtil.cpp +++ b/external/vulkancts/framework/vulkan/vkImageUtil.cpp @@ -199,6 +199,52 @@ bool isYCbCrFormat (VkFormat format) } } +bool isYCbCr420Format (VkFormat format) +{ + switch (format) + { + case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR: + case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR: + case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR: + case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR: + case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR: + case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR: + case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR: + case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR: + return true; + + default: + return false; + } +} + +bool isYCbCr422Format (VkFormat format) +{ + switch (format) + { + case VK_FORMAT_G8B8G8R8_422_UNORM_KHR: + case VK_FORMAT_B8G8R8G8_422_UNORM_KHR: + case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR: + case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR: + case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR: + case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR: + case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR: + case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR: + case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR: + case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR: + case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR: + case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR: + case VK_FORMAT_G16B16G16R16_422_UNORM_KHR: + case VK_FORMAT_B16G16R16G16_422_UNORM_KHR: + case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR: + case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR: + return true; + + default: + return false; + } +} + const PlanarFormatDescription& getYCbCrPlanarFormatDescription (VkFormat format) { using tcu::TextureFormat; diff --git a/external/vulkancts/framework/vulkan/vkImageUtil.hpp b/external/vulkancts/framework/vulkan/vkImageUtil.hpp index 6dc4a8f..6c43baa 100644 --- a/external/vulkancts/framework/vulkan/vkImageUtil.hpp +++ b/external/vulkancts/framework/vulkan/vkImageUtil.hpp @@ -126,6 +126,8 @@ int getPlaneCount (VkFormat format); VkImageAspectFlagBits getPlaneAspect (deUint32 planeNdx); deUint32 getAspectPlaneNdx (VkImageAspectFlagBits planeAspect); bool isChromaSubsampled (VkFormat format); +bool isYCbCr422Format (VkFormat format); +bool isYCbCr420Format (VkFormat format); tcu::PixelBufferAccess getChannelAccess (const PlanarFormatDescription& formatInfo, const tcu::UVec2& size, diff --git a/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp b/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp index a7685cf..2063159 100644 --- a/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp +++ b/external/vulkancts/modules/vulkan/api/vktApiMemoryRequirementInvarianceTests.cpp @@ -26,6 +26,7 @@ #include "vkQueryUtil.hpp" #include "vkMemUtil.hpp" #include "vkRefUtil.hpp" +#include "vkImageUtil.hpp" namespace vkt @@ -166,16 +167,20 @@ ImageAllocator::ImageAllocator (deRandom& random, deBool dedicated, std::vector< m_dedicated = dedicated && deRandom_getBool(&random); // If linear formats are supported, pick it randomly m_linear = (linearformats.size() > 0) && deRandom_getBool(&random); - // Random small size for causing potential alignment issues - m_size = tcu::IVec2(deRandom_getUint32(&random) % 16 + 3, - deRandom_getUint32(&random) % 16 + 3); - // Pick random memory type from the supported set - m_memoryType = memoryTypes[deRandom_getUint32(&random) % memoryTypes.size()]; if (m_linear) m_colorFormat = (VkFormat)linearformats[deRandom_getUint32(&random) % linearformats.size()]; else m_colorFormat = (VkFormat)optimalformats[deRandom_getUint32(&random) % optimalformats.size()]; + + int widthAlignment = (isYCbCr420Format(m_colorFormat) || isYCbCr422Format(m_colorFormat)) ? 2 : 1; + int heightAlignment = isYCbCr420Format(m_colorFormat) ? 2 : 1; + + // Random small size for causing potential alignment issues + m_size = tcu::IVec2((deRandom_getUint32(&random) % 16 + 3) & ~(widthAlignment - 1), + (deRandom_getUint32(&random) % 16 + 3) & ~(heightAlignment - 1)); + // Pick random memory type from the supported set + m_memoryType = memoryTypes[deRandom_getUint32(&random) % memoryTypes.size()]; } ImageAllocator::~ImageAllocator () -- 2.7.4