return tcu::TestStatus(results.getResult(), results.getMessage());
}
+tcu::TestStatus extensionCoreVersions (Context& context)
+{
+ deUint32 major;
+ deUint32 minor;
+ const char* extName;
+
+ auto& log = context.getTestContext().getLog();
+ tcu::ResultCollector results (log);
+
+ const auto instanceExtensionProperties = enumerateInstanceExtensionProperties(context.getPlatformInterface(), DE_NULL);
+ const auto deviceExtensionProperties = enumerateDeviceExtensionProperties(context.getInstanceInterface(), context.getPhysicalDevice(), DE_NULL);
+
+ for (const auto& majorMinorName : extensionRequiredCoreVersion)
+ {
+ std::tie(major, minor, extName) = majorMinorName;
+ const RequiredExtension reqExt (extName);
+
+ if ((isExtensionSupported(instanceExtensionProperties, reqExt) || isExtensionSupported(deviceExtensionProperties, reqExt)) &&
+ !context.contextSupports(vk::ApiVersion(major, minor, 0u)))
+ {
+ results.fail("Required core version for " + std::string(extName) + " not met (" + de::toString(major) + "." + de::toString(minor) + ")");
+ }
+ }
+
+ return tcu::TestStatus(results.getResult(), results.getMessage());
+}
+
#define VK_SIZE_OF(STRUCT, MEMBER) (sizeof(((STRUCT*)0)->MEMBER))
#define OFFSET_TABLE_ENTRY(STRUCT, MEMBER) { (size_t)DE_OFFSET_OF(STRUCT, MEMBER), VK_SIZE_OF(STRUCT, MEMBER) }
}
}
-bool requiresYCbCrConversion(VkFormat format)
+bool requiresYCbCrConversion(Context& context, VkFormat format)
{
+ if (format == VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16)
+ {
+ if (!context.isDeviceFunctionalitySupported("VK_EXT_rgba10x6_formats"))
+ return true;
+ VkPhysicalDeviceFeatures2 coreFeatures;
+ VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT rgba10x6features;
+
+ deMemset(&coreFeatures, 0, sizeof(coreFeatures));
+ deMemset(&rgba10x6features, 0, sizeof(rgba10x6features));
+
+ coreFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+ coreFeatures.pNext = &rgba10x6features;
+ rgba10x6features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT;
+
+ const InstanceInterface &vk = context.getInstanceInterface();
+ vk.getPhysicalDeviceFeatures2(context.getPhysicalDevice(), &coreFeatures);
+
+ return !rgba10x6features.formatRgba10x6WithoutYCbCrSampler;
+ }
+
return isYCbCrFormat(format) &&
format != VK_FORMAT_R10X6_UNORM_PACK16 && format != VK_FORMAT_R10X6G10X6_UNORM_2PACK16 &&
format != VK_FORMAT_R12X4_UNORM_PACK16 && format != VK_FORMAT_R12X4G12X4_UNORM_2PACK16;
}
-VkFormatFeatureFlags getAllowedOptimalTilingFeatures (VkFormat format)
+VkFormatFeatureFlags getAllowedOptimalTilingFeatures (Context &context, VkFormat format)
{
// YCbCr formats only support a subset of format feature flags
const VkFormatFeatureFlags ycbcrAllows =
// By default everything is allowed.
VkFormatFeatureFlags allow = (VkFormatFeatureFlags)~0u;
// Formats for which SamplerYCbCrConversion is required may not support certain features.
- if (requiresYCbCrConversion(format))
+ if (requiresYCbCrConversion(context, format))
allow &= ycbcrAllows;
// single-plane formats *may not* support DISJOINT_BIT
if (!isYCbCrFormat(format) || getPlaneCount(format) == 1)
return allow;
}
-VkFormatFeatureFlags getAllowedBufferFeatures (VkFormat format)
+VkFormatFeatureFlags getAllowedBufferFeatures (Context &context, VkFormat format)
{
// TODO: Do we allow non-buffer flags in the bufferFeatures?
- return requiresYCbCrConversion(format) ? (VkFormatFeatureFlags)0 : (VkFormatFeatureFlags)(~VK_FORMAT_FEATURE_DISJOINT_BIT);
+ return requiresYCbCrConversion(context, format) ? (VkFormatFeatureFlags)0 : (VkFormatFeatureFlags)(~VK_FORMAT_FEATURE_DISJOINT_BIT);
}
tcu::TestStatus formatProperties (Context& context, VkFormat format)
const VkFormatFeatureFlags reqImg = getRequiredOptimalTilingFeatures(context, format);
const VkFormatFeatureFlags reqBuf = getRequiredBufferFeatures(format);
- const VkFormatFeatureFlags allowImg = getAllowedOptimalTilingFeatures(format);
- const VkFormatFeatureFlags allowBuf = getAllowedBufferFeatures(format);
+ const VkFormatFeatureFlags allowImg = getAllowedOptimalTilingFeatures(context, format);
+ const VkFormatFeatureFlags allowBuf = getAllowedBufferFeatures(context, format);
const struct feature_req
{
infoTests->addChild(createTestGroup(testCtx, "image_format_properties", "VkGetPhysicalDeviceImageFormatProperties() Tests", createImageFormatTests, imageFormatProperties));
{
+ de::MovePtr<tcu::TestCaseGroup> extCoreVersionGrp (new tcu::TestCaseGroup(testCtx, "extension_core_versions", "Tests checking extension required core versions"));
+
+ addFunctionCase(extCoreVersionGrp.get(), "extension_core_versions", "", extensionCoreVersions);
+
+ infoTests->addChild(extCoreVersionGrp.release());
+ }
+
+ {
de::MovePtr<tcu::TestCaseGroup> extendedPropertiesTests (new tcu::TestCaseGroup(testCtx, "get_physical_device_properties2", "VK_KHR_get_physical_device_properties2"));
addFunctionCase(extendedPropertiesTests.get(), "features", "Extended Device Features", deviceFeatures2);