Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Test PVRTC extension and always use power-of-two dimensions for PVRTC1 #451

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions external/vulkancts/framework/vulkan/vkImageUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,25 @@ bool isPvrtcFormat (VkFormat format)
return false;
}

bool isPvrtc1Format (VkFormat format)
{
#ifndef CTS_USES_VULKANSC
switch (format)
{
case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
return true;
default:
return false;
}
#else
DE_UNREF(format);
#endif
return false;
}

const std::map<VkFormat, std::string> spirvFormats = {
{ VK_FORMAT_R32G32B32A32_SFLOAT, "Rgba32f" },
{ VK_FORMAT_R32G32_SFLOAT, "Rg32f" },
Expand Down
1 change: 1 addition & 0 deletions external/vulkancts/framework/vulkan/vkImageUtil.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ bool isYCbCrFormat (VkFormat format);
bool isYCbCrExtensionFormat (VkFormat format);
bool isYCbCrConversionFormat (VkFormat format);
bool isPvrtcFormat (VkFormat format);
bool isPvrtc1Format (VkFormat format);
PlanarFormatDescription getPlanarFormatDescription (VkFormat format);
int getPlaneCount (VkFormat format);
deUint32 getMipmapCount (VkFormat format,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,12 +180,23 @@ ImageAllocator::ImageAllocator (deRandom& random, deBool dedicated, std::vector<
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;
if (isPvrtc1Format(m_colorFormat))
{
// See VUID-VkImageCreateInfo-format-09583 and VUID-VkImageCreateInfo-format-09584
// PVRTC1 textures have to have both a width and height that is a power of 2.
m_size = tcu::IVec2(1 << (deRandom_getUint32(&random) % 4 + 1),
1 << (deRandom_getUint32(&random) % 4 + 1));
}
else
{
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));
}

// 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()];
}
Expand Down
1 change: 1 addition & 0 deletions external/vulkancts/modules/vulkan/vktTestCase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ vector<string> filterExtensions (const vector<VkExtensionProperties>& extensions
"VK_NV_representative_fragment_test",
"VK_NV_shader_atomic_float16_vector",
"VK_MVK_macos_surface",
"VK_IMG_format_pvrtc"
};

const char* exclusions[] =
Expand Down
6 changes: 3 additions & 3 deletions framework/delibs/debase/deInt32.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ DE_INLINE deBool deIsPowerOfTwoSize (size_t a)
}

/*--------------------------------------------------------------------*//*!
* \brief Roud a value up to a power-of-two.
* \brief Round a value up to a power-of-two.
* \param a Input value.
* \return Smallest power-of-two value that is greater or equal to an input value.
*//*--------------------------------------------------------------------*/
Expand All @@ -264,7 +264,7 @@ DE_INLINE deUint32 deSmallestGreaterOrEquallPowerOfTwoU32 (deUint32 a)
}

/*--------------------------------------------------------------------*//*!
* \brief Roud a value up to a power-of-two.
* \brief Round a value up to a power-of-two.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for fixing those

* \param a Input value.
* \return Smallest power-of-two value that is greater or equal to an input value.
*//*--------------------------------------------------------------------*/
Expand All @@ -281,7 +281,7 @@ DE_INLINE deUint64 deSmallestGreaterOrEquallPowerOfTwoU64 (deUint64 a)
}

/*--------------------------------------------------------------------*//*!
* \brief Roud a value up to a power-of-two.
* \brief Round a value up to a power-of-two.
* \param a Input value.
* \return Smallest power-of-two value that is greater or equal to an input value.
*//*--------------------------------------------------------------------*/
Expand Down