blob: 4e900fad7dc4d7f0e0c99c4e345b09be83a86b5f [file] [log] [blame]
/*
* Copyright 2025 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
// This is a Vulkan specific test, ensuring VulkanPreferredFeatures enables extensions and features
// correctly.
#include "include/core/SkTypes.h"
#if defined(SK_VULKAN)
#include "include/gpu/vk/VulkanPreferredFeatures.h"
#include "tests/CtsEnforcement.h"
#include "tests/Test.h"
#include <vulkan/vulkan_core.h>
#include <algorithm>
#include <cstdint>
#include <cstring>
#include <memory>
#include <vector>
// A pretend Vulkan device configuration to expose a subset of Vulkan extensions
//
// Note: Skia doesn't actually enable all of these yet. The test expectations below are commented
// out for the extensions that are planned for the future. Once any extension is enabled, the
// corresponding expectations should be uncommented.
struct VulkanExts {
bool fRasterizationOrderAttachmentAccessARM = true;
bool fRasterizationOrderAttachmentAccessEXT = true;
bool fBlendOperationAdvancedEXT = true;
bool fExtendedDynamicStateEXT = true;
bool fExtendedDynamicState2EXT = true;
bool fVertexInputDynamicStateEXT = true;
bool fGraphicsPipelineLibraryEXT = true;
bool fSamplerYcbcrConversionKHR = true;
bool fRGBA10x6FormatsEXT = true;
bool fSynchronization2KHR = true;
bool fDynamicRenderingKHR = true;
bool fDynamicRenderingLocalReadKHR = true;
bool fMultisampledRenderToSingleSampledEXT = true;
bool fHostImageCopyEXT = true;
bool fPipelineCreationCacheControlEXT = true;
bool fDriverPropertiesKHR = true;
bool fCreateRenderpass2KHR = true;
bool fLoadStoreOpNoneEXT = true;
bool fLoadStoreOpNoneKHR = true;
bool fConservativeRasterizationEXT = true;
bool fPipelineLibraryKHR = true;
bool fCopyCommands2KHR = true;
bool fFormatFeatureFlags2KHR = true;
bool fDepthStencilResolveKHR = true;
bool fShaderDrawParametersKHR = true;
bool fDrawIndirectCountKHR = true;
bool fSamplerMirrorClampToEdgeKHR = true;
bool fDescriptorIndexingEXT = true;
bool fSamplerFilterMinmaxEXT = true;
bool fShaderViewportIndexLayerEXT = true;
bool fPushDescriptorKHR = true;
};
static std::vector<VkExtensionProperties> get_device_exts(const VulkanExts& config) {
std::vector<VkExtensionProperties> exts;
#define ADD_EXT(fFlag, EXTNAME) \
do { \
if (config.fFlag) { \
VkExtensionProperties ext = {}; \
strcpy(ext.extensionName, EXTNAME##_EXTENSION_NAME); \
ext.specVersion = 1; \
exts.push_back(ext); \
} \
} while (0)
ADD_EXT(fRasterizationOrderAttachmentAccessARM, VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
ADD_EXT(fRasterizationOrderAttachmentAccessEXT, VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
ADD_EXT(fBlendOperationAdvancedEXT, VK_EXT_BLEND_OPERATION_ADVANCED);
ADD_EXT(fExtendedDynamicStateEXT, VK_EXT_EXTENDED_DYNAMIC_STATE);
ADD_EXT(fExtendedDynamicState2EXT, VK_EXT_EXTENDED_DYNAMIC_STATE_2);
ADD_EXT(fVertexInputDynamicStateEXT, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
ADD_EXT(fGraphicsPipelineLibraryEXT, VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
ADD_EXT(fSamplerYcbcrConversionKHR, VK_KHR_SAMPLER_YCBCR_CONVERSION);
ADD_EXT(fRGBA10x6FormatsEXT, VK_EXT_RGBA10X6_FORMATS);
ADD_EXT(fSynchronization2KHR, VK_KHR_SYNCHRONIZATION_2);
ADD_EXT(fDynamicRenderingKHR, VK_KHR_DYNAMIC_RENDERING);
ADD_EXT(fDynamicRenderingLocalReadKHR, VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
ADD_EXT(fMultisampledRenderToSingleSampledEXT, VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
ADD_EXT(fHostImageCopyEXT, VK_EXT_HOST_IMAGE_COPY);
ADD_EXT(fPipelineCreationCacheControlEXT, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
ADD_EXT(fDriverPropertiesKHR, VK_KHR_DRIVER_PROPERTIES);
ADD_EXT(fCreateRenderpass2KHR, VK_KHR_CREATE_RENDERPASS_2);
ADD_EXT(fLoadStoreOpNoneEXT, VK_EXT_LOAD_STORE_OP_NONE);
ADD_EXT(fLoadStoreOpNoneKHR, VK_KHR_LOAD_STORE_OP_NONE);
ADD_EXT(fConservativeRasterizationEXT, VK_EXT_CONSERVATIVE_RASTERIZATION);
ADD_EXT(fPipelineLibraryKHR, VK_KHR_PIPELINE_LIBRARY);
ADD_EXT(fCopyCommands2KHR, VK_KHR_COPY_COMMANDS_2);
ADD_EXT(fFormatFeatureFlags2KHR, VK_KHR_FORMAT_FEATURE_FLAGS_2);
ADD_EXT(fDepthStencilResolveKHR, VK_KHR_DEPTH_STENCIL_RESOLVE);
ADD_EXT(fShaderDrawParametersKHR, VK_KHR_SHADER_DRAW_PARAMETERS);
ADD_EXT(fDrawIndirectCountKHR, VK_KHR_DRAW_INDIRECT_COUNT);
ADD_EXT(fSamplerMirrorClampToEdgeKHR, VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
ADD_EXT(fDescriptorIndexingEXT, VK_EXT_DESCRIPTOR_INDEXING);
ADD_EXT(fSamplerFilterMinmaxEXT, VK_EXT_SAMPLER_FILTER_MINMAX);
ADD_EXT(fShaderViewportIndexLayerEXT, VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
ADD_EXT(fPushDescriptorKHR, VK_KHR_PUSH_DESCRIPTOR);
#undef ADD_EXT
return exts;
}
static void enable_device_features(const VulkanExts& config, void* basePNext) {
#define SET_IF(fFlag, name) \
do { \
if (config.fFlag) { \
features->name = VK_TRUE; \
} \
} while (0)
#define SET_FEATURES(STRUCT_NAME, StructName, set) \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME: { \
auto* features = reinterpret_cast<VkPhysicalDevice##StructName*>(pNext); \
set; \
break; \
}
VkBaseOutStructure* pNext = static_cast<VkBaseOutStructure*>(basePNext);
while (pNext) {
switch (pNext->sType) {
SET_FEATURES(VULKAN_1_1_FEATURES,
Vulkan11Features,
SET_IF(fSamplerYcbcrConversionKHR, samplerYcbcrConversion);
SET_IF(fShaderDrawParametersKHR, shaderDrawParameters))
SET_FEATURES(VULKAN_1_2_FEATURES,
Vulkan12Features,
SET_IF(fSamplerMirrorClampToEdgeKHR, samplerMirrorClampToEdge);
SET_IF(fDrawIndirectCountKHR, drawIndirectCount);
SET_IF(fDescriptorIndexingEXT, descriptorIndexing);
SET_IF(fSamplerFilterMinmaxEXT, samplerFilterMinmax);
SET_IF(fShaderViewportIndexLayerEXT, shaderOutputViewportIndex);
SET_IF(fShaderViewportIndexLayerEXT, shaderOutputLayer))
SET_FEATURES(VULKAN_1_3_FEATURES,
Vulkan13Features,
SET_IF(fPipelineCreationCacheControlEXT, pipelineCreationCacheControl);
SET_IF(fSynchronization2KHR, synchronization2);
SET_IF(fDynamicRenderingKHR, dynamicRendering))
SET_FEATURES(VULKAN_1_4_FEATURES,
Vulkan14Features,
SET_IF(fDynamicRenderingLocalReadKHR, dynamicRenderingLocalRead);
SET_IF(fHostImageCopyEXT, hostImageCopy))
SET_FEATURES(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
SET_IF(fRasterizationOrderAttachmentAccessARM,
rasterizationOrderColorAttachmentAccess);
SET_IF(fRasterizationOrderAttachmentAccessARM,
rasterizationOrderDepthAttachmentAccess);
SET_IF(fRasterizationOrderAttachmentAccessARM,
rasterizationOrderStencilAttachmentAccess);
SET_IF(fRasterizationOrderAttachmentAccessEXT,
rasterizationOrderColorAttachmentAccess);
SET_IF(fRasterizationOrderAttachmentAccessEXT,
rasterizationOrderDepthAttachmentAccess);
SET_IF(fRasterizationOrderAttachmentAccessEXT,
rasterizationOrderStencilAttachmentAccess))
SET_FEATURES(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
BlendOperationAdvancedFeaturesEXT,
SET_IF(fBlendOperationAdvancedEXT, advancedBlendCoherentOperations))
SET_FEATURES(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
ExtendedDynamicStateFeaturesEXT,
SET_IF(fExtendedDynamicStateEXT, extendedDynamicState))
SET_FEATURES(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
SET_IF(fExtendedDynamicState2EXT, extendedDynamicState2);
SET_IF(fExtendedDynamicState2EXT, extendedDynamicState2LogicOp);
SET_IF(fExtendedDynamicState2EXT, extendedDynamicState2PatchControlPoints))
SET_FEATURES(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
VertexInputDynamicStateFeaturesEXT,
SET_IF(fVertexInputDynamicStateEXT, vertexInputDynamicState))
SET_FEATURES(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
GraphicsPipelineLibraryFeaturesEXT,
SET_IF(fGraphicsPipelineLibraryEXT, graphicsPipelineLibrary))
SET_FEATURES(SAMPLER_YCBCR_CONVERSION_FEATURES,
SamplerYcbcrConversionFeatures,
SET_IF(fSamplerYcbcrConversionKHR, samplerYcbcrConversion))
SET_FEATURES(RGBA10X6_FORMATS_FEATURES_EXT,
RGBA10X6FormatsFeaturesEXT,
SET_IF(fRGBA10x6FormatsEXT, formatRgba10x6WithoutYCbCrSampler))
SET_FEATURES(SYNCHRONIZATION_2_FEATURES,
Synchronization2Features,
SET_IF(fSynchronization2KHR, synchronization2))
SET_FEATURES(DYNAMIC_RENDERING_FEATURES,
DynamicRenderingFeatures,
SET_IF(fDynamicRenderingKHR, dynamicRendering))
SET_FEATURES(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
DynamicRenderingLocalReadFeatures,
SET_IF(fDynamicRenderingLocalReadKHR, dynamicRenderingLocalRead))
SET_FEATURES(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
MultisampledRenderToSingleSampledFeaturesEXT,
SET_IF(fMultisampledRenderToSingleSampledEXT,
multisampledRenderToSingleSampled))
SET_FEATURES(HOST_IMAGE_COPY_FEATURES,
HostImageCopyFeatures,
SET_IF(fHostImageCopyEXT, hostImageCopy))
SET_FEATURES(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
PipelineCreationCacheControlFeatures,
SET_IF(fPipelineCreationCacheControlEXT, pipelineCreationCacheControl))
default:
break;
}
pNext = pNext->pNext;
}
#undef SET_FEATURES
#undef SET_IF
}
static size_t count_ext(const std::vector<const char*> enabledExts, const char* to_find) {
return std::count_if(enabledExts.begin(), enabledExts.end(), [to_find](const char* ext) {
return strcmp(ext, to_find) == 0;
});
}
static size_t count_struct(const void* basePNext, VkStructureType structureType) {
size_t count = 0;
const VkBaseInStructure* pNext = static_cast<const VkBaseInStructure*>(basePNext);
while (pNext) {
if (pNext->sType == structureType) {
++count;
}
pNext = pNext->pNext;
}
return count;
}
template <typename VulkanStruct, VkBool32 VulkanStruct::* Feature>
static bool get_feature(skiatest::Reporter* reporter,
const void* basePNext,
VkStructureType structureType) {
bool foundBefore = false;
bool enabled = false;
const VkBaseInStructure* pNext = static_cast<const VkBaseInStructure*>(basePNext);
while (pNext) {
if (pNext->sType == structureType) {
// Verify no duplicate instances of the struct.
REPORTER_ASSERT(reporter, !foundBefore);
foundBefore = true;
const auto* feature = reinterpret_cast<const VulkanStruct*>(pNext);
enabled = feature->*Feature;
}
pNext = pNext->pNext;
}
return enabled;
}
static bool check_exclusive(skiatest::Reporter* reporter,
const void* basePNext,
VkStructureType structureType1,
VkStructureType structureType2) {
bool foundStructureType1 = false;
bool foundStructureType2 = false;
const VkBaseInStructure* pNext = static_cast<const VkBaseInStructure*>(basePNext);
while (pNext) {
if (pNext->sType == structureType1) {
// Verify no duplicate instances of the struct.
REPORTER_ASSERT(reporter, !foundStructureType1);
foundStructureType1 = true;
} else if (pNext->sType == structureType2) {
// Verify no duplicate instances of the struct.
REPORTER_ASSERT(reporter, !foundStructureType2);
foundStructureType2 = true;
}
pNext = pNext->pNext;
}
return !foundStructureType1 || !foundStructureType2;
}
#define CHECK_EXT_ENABLED(EXTNAME) \
REPORTER_ASSERT(reporter, count_ext(enabledExts, EXTNAME##_EXTENSION_NAME) == 1)
#define CHECK_EXT_DISABLED(EXTNAME) \
REPORTER_ASSERT(reporter, count_ext(enabledExts, EXTNAME##_EXTENSION_NAME) == 0)
#define CHECK_CHAINED(STRUCT_NAME) \
REPORTER_ASSERT( \
reporter, \
count_struct(features.pNext, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME) == 1)
#define CHECK_NOT_CHAINED(STRUCT_NAME) \
REPORTER_ASSERT( \
reporter, \
count_struct(features.pNext, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME) == 0)
#define CHECK_EXCLUSIVE(STRUCT_NAME1, STRUCT_NAME2) \
REPORTER_ASSERT(reporter, \
check_exclusive(reporter, \
features.pNext, \
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME1, \
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME2))
#define CHECK_FEATURE_ENABLED(STRUCT_NAME, StructName, member) \
do { \
const bool member##Enabled = \
get_feature<VkPhysicalDevice##StructName, &VkPhysicalDevice##StructName::member>( \
reporter, \
features.pNext, \
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME); \
REPORTER_ASSERT(reporter, member##Enabled); \
} while (0)
#define CHECK_FEATURE_DISABLED(STRUCT_NAME, StructName, member) \
do { \
const bool member##Enabled = \
get_feature<VkPhysicalDevice##StructName, &VkPhysicalDevice##StructName::member>( \
reporter, \
features.pNext, \
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME); \
REPORTER_ASSERT(reporter, !member##Enabled); \
} while (0)
// A test where the application adds no features and extensions and lets Skia choose them. Uses
// Vulkan 1.1 as the API version.
DEF_TEST(VkPreferredFeaturesTest_BasicVulkan11, reporter) {
VulkanExts config;
const std::vector<VkExtensionProperties> exts = get_device_exts(config);
skgpu::VulkanPreferredFeatures preferred;
preferred.init(VK_API_VERSION_1_1);
{
std::vector<const char*> instanceExts;
preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
}
VkPhysicalDeviceFeatures2 features = {};
features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
// Ask Skia to add its features to query
preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
// Populate the requested features
enable_device_features(config, features.pNext);
// Ask Skia to enable available features
std::vector<const char*> enabledExts;
preferred.addFeaturesToEnable(enabledExts, features);
CHECK_NOT_CHAINED(VULKAN_1_1_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_2_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_3_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);
CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
CHECK_EXT_ENABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
CHECK_EXT_ENABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
CHECK_EXT_ENABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
CHECK_EXT_ENABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
//CHECK_EXT_ENABLED(VK_KHR_SYNCHRONIZATION_2);
//CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING);
//CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
//CHECK_EXT_ENABLED(VK_EXT_HOST_IMAGE_COPY);
CHECK_EXT_ENABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
CHECK_EXT_ENABLED(VK_KHR_DRIVER_PROPERTIES);
CHECK_EXT_ENABLED(VK_KHR_CREATE_RENDERPASS_2);
CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
//CHECK_EXT_ENABLED(VK_KHR_COPY_COMMANDS_2);
//CHECK_EXT_ENABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
CHECK_EXT_ENABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
CHECK_EXT_DISABLED(VK_KHR_PUSH_DESCRIPTOR);
CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderColorAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderDepthAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderStencilAttachmentAccess);
CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
BlendOperationAdvancedFeaturesEXT,
advancedBlendCoherentOperations);
CHECK_FEATURE_ENABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
ExtendedDynamicStateFeaturesEXT,
extendedDynamicState);
CHECK_FEATURE_ENABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2LogicOp);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2PatchControlPoints);
CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
VertexInputDynamicStateFeaturesEXT,
vertexInputDynamicState);
CHECK_FEATURE_ENABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
GraphicsPipelineLibraryFeaturesEXT,
graphicsPipelineLibrary);
CHECK_FEATURE_ENABLED(SAMPLER_YCBCR_CONVERSION_FEATURES,
SamplerYcbcrConversionFeatures,
samplerYcbcrConversion);
CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
RGBA10X6FormatsFeaturesEXT,
formatRgba10x6WithoutYCbCrSampler);
//CHECK_FEATURE_ENABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);
//CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);
//CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
// DynamicRenderingLocalReadFeatures,
// dynamicRenderingLocalRead);
CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
MultisampledRenderToSingleSampledFeaturesEXT,
multisampledRenderToSingleSampled);
//CHECK_FEATURE_ENABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);
CHECK_FEATURE_ENABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
PipelineCreationCacheControlFeatures,
pipelineCreationCacheControl);
}
// A test where the application adds no features and extensions and lets Skia choose them. Uses
// Vulkan 1.2 as the API version.
DEF_TEST(VkPreferredFeaturesTest_BasicVulkan12, reporter) {
VulkanExts config;
const std::vector<VkExtensionProperties> exts = get_device_exts(config);
skgpu::VulkanPreferredFeatures preferred;
preferred.init(VK_API_VERSION_1_2);
{
std::vector<const char*> instanceExts;
preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
}
VkPhysicalDeviceFeatures2 features = {};
features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
// Ask Skia to add its features to query
preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
// Populate the requested features
enable_device_features(config, features.pNext);
// Ask Skia to enable available features
std::vector<const char*> enabledExts;
preferred.addFeaturesToEnable(enabledExts, features);
CHECK_CHAINED(VULKAN_1_1_FEATURES);
CHECK_CHAINED(VULKAN_1_2_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_3_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);
CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
CHECK_EXT_ENABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
CHECK_EXT_ENABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
CHECK_EXT_ENABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
//CHECK_EXT_ENABLED(VK_KHR_SYNCHRONIZATION_2);
//CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING);
//CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
//CHECK_EXT_ENABLED(VK_EXT_HOST_IMAGE_COPY);
CHECK_EXT_ENABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
//CHECK_EXT_ENABLED(VK_KHR_COPY_COMMANDS_2);
//CHECK_EXT_ENABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
CHECK_EXT_DISABLED(VK_KHR_PUSH_DESCRIPTOR);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, 16BIT_STORAGE_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, MULTIVIEW_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, VARIABLE_POINTERS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, PROTECTED_MEMORY_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, SHADER_DRAW_PARAMETERS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, 8BIT_STORAGE_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_ATOMIC_INT64_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_FLOAT16_INT8_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, DESCRIPTOR_INDEXING_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SCALAR_BLOCK_LAYOUT_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, IMAGELESS_FRAMEBUFFER_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, HOST_QUERY_RESET_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, TIMELINE_SEMAPHORE_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, BUFFER_DEVICE_ADDRESS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, VULKAN_MEMORY_MODEL_FEATURES);
CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);
CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderColorAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderDepthAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderStencilAttachmentAccess);
CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
BlendOperationAdvancedFeaturesEXT,
advancedBlendCoherentOperations);
CHECK_FEATURE_ENABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
ExtendedDynamicStateFeaturesEXT,
extendedDynamicState);
CHECK_FEATURE_ENABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2LogicOp);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2PatchControlPoints);
CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
VertexInputDynamicStateFeaturesEXT,
vertexInputDynamicState);
CHECK_FEATURE_ENABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
GraphicsPipelineLibraryFeaturesEXT,
graphicsPipelineLibrary);
CHECK_FEATURE_DISABLED(SAMPLER_YCBCR_CONVERSION_FEATURES,
SamplerYcbcrConversionFeatures,
samplerYcbcrConversion);
CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
RGBA10X6FormatsFeaturesEXT,
formatRgba10x6WithoutYCbCrSampler);
//CHECK_FEATURE_ENABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);
//CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);
//CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
// DynamicRenderingLocalReadFeatures,
// dynamicRenderingLocalRead);
CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
MultisampledRenderToSingleSampledFeaturesEXT,
multisampledRenderToSingleSampled);
//CHECK_FEATURE_ENABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);
CHECK_FEATURE_ENABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
PipelineCreationCacheControlFeatures,
pipelineCreationCacheControl);
}
// A test where the application adds no features and extensions and lets Skia choose them. Uses
// Vulkan 1.3 as the API version.
DEF_TEST(VkPreferredFeaturesTest_BasicVulkan13, reporter) {
VulkanExts config;
const std::vector<VkExtensionProperties> exts = get_device_exts(config);
skgpu::VulkanPreferredFeatures preferred;
preferred.init(VK_API_VERSION_1_3);
{
std::vector<const char*> instanceExts;
preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
}
VkPhysicalDeviceFeatures2 features = {};
features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
// Ask Skia to add its features to query
preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
// Populate the requested features
enable_device_features(config, features.pNext);
// Ask Skia to enable available features
std::vector<const char*> enabledExts;
preferred.addFeaturesToEnable(enabledExts, features);
CHECK_CHAINED(VULKAN_1_1_FEATURES);
CHECK_CHAINED(VULKAN_1_2_FEATURES);
CHECK_CHAINED(VULKAN_1_3_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);
CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
CHECK_EXT_ENABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
CHECK_EXT_DISABLED(VK_KHR_SYNCHRONIZATION_2);
CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING);
//CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
//CHECK_EXT_ENABLED(VK_EXT_HOST_IMAGE_COPY);
CHECK_EXT_DISABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_COPY_COMMANDS_2);
CHECK_EXT_DISABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
CHECK_EXT_DISABLED(VK_KHR_PUSH_DESCRIPTOR);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, 16BIT_STORAGE_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, MULTIVIEW_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, VARIABLE_POINTERS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, PROTECTED_MEMORY_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, SHADER_DRAW_PARAMETERS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, 8BIT_STORAGE_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_ATOMIC_INT64_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_FLOAT16_INT8_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, DESCRIPTOR_INDEXING_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SCALAR_BLOCK_LAYOUT_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, IMAGELESS_FRAMEBUFFER_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, HOST_QUERY_RESET_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, TIMELINE_SEMAPHORE_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, BUFFER_DEVICE_ADDRESS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, VULKAN_MEMORY_MODEL_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, IMAGE_ROBUSTNESS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, INLINE_UNIFORM_BLOCK_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, MAINTENANCE_4_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, PRIVATE_DATA_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_INTEGER_DOT_PRODUCT_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_TERMINATE_INVOCATION_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SUBGROUP_SIZE_CONTROL_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, TEXTURE_COMPRESSION_ASTC_HDR_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES);
CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, pipelineCreationCacheControl);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, synchronization2);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, dynamicRendering);
CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderColorAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderDepthAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderStencilAttachmentAccess);
CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
BlendOperationAdvancedFeaturesEXT,
advancedBlendCoherentOperations);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
ExtendedDynamicStateFeaturesEXT,
extendedDynamicState);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2LogicOp);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2PatchControlPoints);
CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
VertexInputDynamicStateFeaturesEXT,
vertexInputDynamicState);
CHECK_FEATURE_ENABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
GraphicsPipelineLibraryFeaturesEXT,
graphicsPipelineLibrary);
CHECK_FEATURE_DISABLED(SAMPLER_YCBCR_CONVERSION_FEATURES,
SamplerYcbcrConversionFeatures,
samplerYcbcrConversion);
CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
RGBA10X6FormatsFeaturesEXT,
formatRgba10x6WithoutYCbCrSampler);
CHECK_FEATURE_DISABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);
CHECK_FEATURE_DISABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);
//CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
// DynamicRenderingLocalReadFeatures,
// dynamicRenderingLocalRead);
CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
MultisampledRenderToSingleSampledFeaturesEXT,
multisampledRenderToSingleSampled);
//CHECK_FEATURE_ENABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);
CHECK_FEATURE_DISABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
PipelineCreationCacheControlFeatures,
pipelineCreationCacheControl);
}
// A test where the application adds no features and extensions and lets Skia choose them. Uses
// Vulkan 1.4 as the API version.
DEF_TEST(VkPreferredFeaturesTest_BasicVulkan14, reporter) {
VulkanExts config;
const std::vector<VkExtensionProperties> exts = get_device_exts(config);
skgpu::VulkanPreferredFeatures preferred;
preferred.init(VK_API_VERSION_1_4);
{
std::vector<const char*> instanceExts;
preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
}
VkPhysicalDeviceFeatures2 features = {};
features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
// Ask Skia to add its features to query
preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
// Populate the requested features
enable_device_features(config, features.pNext);
// Ask Skia to enable available features
std::vector<const char*> enabledExts;
preferred.addFeaturesToEnable(enabledExts, features);
CHECK_CHAINED(VULKAN_1_1_FEATURES);
CHECK_CHAINED(VULKAN_1_2_FEATURES);
CHECK_CHAINED(VULKAN_1_3_FEATURES);
CHECK_CHAINED(VULKAN_1_4_FEATURES);
CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
CHECK_EXT_ENABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
CHECK_EXT_DISABLED(VK_KHR_SYNCHRONIZATION_2);
CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING);
CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
CHECK_EXT_DISABLED(VK_EXT_HOST_IMAGE_COPY);
CHECK_EXT_DISABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
CHECK_EXT_DISABLED(VK_KHR_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_COPY_COMMANDS_2);
CHECK_EXT_DISABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
CHECK_EXT_DISABLED(VK_KHR_PUSH_DESCRIPTOR);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, 16BIT_STORAGE_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, MULTIVIEW_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, VARIABLE_POINTERS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, PROTECTED_MEMORY_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_1_FEATURES, SHADER_DRAW_PARAMETERS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, 8BIT_STORAGE_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_ATOMIC_INT64_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_FLOAT16_INT8_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, DESCRIPTOR_INDEXING_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SCALAR_BLOCK_LAYOUT_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, IMAGELESS_FRAMEBUFFER_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, HOST_QUERY_RESET_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, TIMELINE_SEMAPHORE_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, BUFFER_DEVICE_ADDRESS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_2_FEATURES, VULKAN_MEMORY_MODEL_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, IMAGE_ROBUSTNESS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, INLINE_UNIFORM_BLOCK_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, MAINTENANCE_4_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, PRIVATE_DATA_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_INTEGER_DOT_PRODUCT_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SHADER_TERMINATE_INVOCATION_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, SUBGROUP_SIZE_CONTROL_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, TEXTURE_COMPRESSION_ASTC_HDR_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_3_FEATURES, ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, GLOBAL_PRIORITY_QUERY_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, SHADER_SUBGROUP_ROTATE_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, SHADER_FLOAT_CONTROLS_2_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, SHADER_EXPECT_ASSUME_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, LINE_RASTERIZATION_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, VERTEX_ATTRIBUTE_DIVISOR_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, INDEX_TYPE_UINT8_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, MAINTENANCE_5_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, MAINTENANCE_6_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, PIPELINE_PROTECTED_ACCESS_FEATURES);
CHECK_EXCLUSIVE(VULKAN_1_4_FEATURES, PIPELINE_ROBUSTNESS_FEATURES);
CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, pipelineCreationCacheControl);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, synchronization2);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, dynamicRendering);
CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, dynamicRenderingLocalRead);
CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, hostImageCopy);
CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderColorAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderDepthAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderStencilAttachmentAccess);
CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
BlendOperationAdvancedFeaturesEXT,
advancedBlendCoherentOperations);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
ExtendedDynamicStateFeaturesEXT,
extendedDynamicState);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2LogicOp);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2PatchControlPoints);
CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
VertexInputDynamicStateFeaturesEXT,
vertexInputDynamicState);
CHECK_FEATURE_ENABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
GraphicsPipelineLibraryFeaturesEXT,
graphicsPipelineLibrary);
CHECK_FEATURE_DISABLED(SAMPLER_YCBCR_CONVERSION_FEATURES,
SamplerYcbcrConversionFeatures,
samplerYcbcrConversion);
CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
RGBA10X6FormatsFeaturesEXT,
formatRgba10x6WithoutYCbCrSampler);
CHECK_FEATURE_DISABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);
CHECK_FEATURE_DISABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);
CHECK_FEATURE_DISABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
DynamicRenderingLocalReadFeatures,
dynamicRenderingLocalRead);
CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
MultisampledRenderToSingleSampledFeaturesEXT,
multisampledRenderToSingleSampled);
CHECK_FEATURE_DISABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);
CHECK_FEATURE_DISABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
PipelineCreationCacheControlFeatures,
pipelineCreationCacheControl);
}
#define CHAIN(STRUCT_NAME, StructName, Feature) \
VkPhysicalDevice##StructName app##StructName = {}; \
app##StructName.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_##STRUCT_NAME; \
app##StructName.pNext = features.pNext; \
app##StructName.Feature = VK_TRUE; \
features.pNext = &app##StructName
#define ADDEXT(EXTNAME) enabledExts.push_back(EXTNAME##_EXTENSION_NAME)
// A test where the application adds some features and extensions and lets Skia add to them. At the
// same time, support for some extensions is disabled. Uses Vulkan 1.1 as the API version.
DEF_TEST(VkPreferredFeaturesTest_CustomVulkan11, reporter) {
VulkanExts config;
config.fSamplerFilterMinmaxEXT = false;
config.fDynamicRenderingKHR = false;
config.fDynamicRenderingLocalReadKHR = false;
config.fRasterizationOrderAttachmentAccessARM = false;
config.fSamplerYcbcrConversionKHR = false;
config.fLoadStoreOpNoneKHR = false;
config.fPushDescriptorKHR = false;
config.fDepthStencilResolveKHR = false;
config.fMultisampledRenderToSingleSampledEXT = false;
config.fGraphicsPipelineLibraryEXT = false;
config.fExtendedDynamicState2EXT = false;
config.fCreateRenderpass2KHR = false;
const std::vector<VkExtensionProperties> exts = get_device_exts(config);
skgpu::VulkanPreferredFeatures preferred;
preferred.init(VK_API_VERSION_1_1);
{
std::vector<const char*> instanceExts;
preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
}
VkPhysicalDeviceFeatures2 features = {};
features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
CHAIN(SUBGROUP_SIZE_CONTROL_FEATURES, SubgroupSizeControlFeatures, subgroupSizeControl);
CHAIN(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
CHAIN(MAINTENANCE_5_FEATURES, Maintenance5Features, maintenance5);
CHAIN(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);
// Ask Skia to add its features to query
preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
// Populate the requested features
enable_device_features(config, features.pNext);
std::vector<const char*> enabledExts;
ADDEXT(VK_EXT_SUBGROUP_SIZE_CONTROL);
ADDEXT(VK_KHR_MAINTENANCE_4);
ADDEXT(VK_KHR_PUSH_DESCRIPTOR);
// Ask Skia to enable available features
preferred.addFeaturesToEnable(enabledExts, features);
CHECK_NOT_CHAINED(VULKAN_1_1_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_2_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_3_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);
CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
CHECK_EXT_ENABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
//CHECK_EXT_ENABLED(VK_KHR_SYNCHRONIZATION_2);
CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING);
CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
CHECK_EXT_DISABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
//CHECK_EXT_ENABLED(VK_EXT_HOST_IMAGE_COPY);
CHECK_EXT_ENABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
CHECK_EXT_ENABLED(VK_KHR_DRIVER_PROPERTIES);
CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
CHECK_EXT_ENABLED(VK_EXT_LOAD_STORE_OP_NONE);
CHECK_EXT_DISABLED(VK_KHR_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
CHECK_EXT_DISABLED(VK_KHR_PIPELINE_LIBRARY);
//CHECK_EXT_ENABLED(VK_KHR_COPY_COMMANDS_2);
//CHECK_EXT_ENABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
// Extensions enabled by the app must remain enabled
CHECK_EXT_ENABLED(VK_EXT_SUBGROUP_SIZE_CONTROL);
CHECK_EXT_ENABLED(VK_KHR_MAINTENANCE_4);
CHECK_EXT_ENABLED(VK_KHR_PUSH_DESCRIPTOR);
CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderColorAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderDepthAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderStencilAttachmentAccess);
CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
BlendOperationAdvancedFeaturesEXT,
advancedBlendCoherentOperations);
CHECK_FEATURE_ENABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
ExtendedDynamicStateFeaturesEXT,
extendedDynamicState);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2LogicOp);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2PatchControlPoints);
CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
VertexInputDynamicStateFeaturesEXT,
vertexInputDynamicState);
CHECK_FEATURE_DISABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
GraphicsPipelineLibraryFeaturesEXT,
graphicsPipelineLibrary);
CHECK_FEATURE_DISABLED(SAMPLER_YCBCR_CONVERSION_FEATURES,
SamplerYcbcrConversionFeatures,
samplerYcbcrConversion);
CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
RGBA10X6FormatsFeaturesEXT,
formatRgba10x6WithoutYCbCrSampler);
//CHECK_FEATURE_ENABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);
CHECK_FEATURE_DISABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);
CHECK_FEATURE_DISABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
DynamicRenderingLocalReadFeatures,
dynamicRenderingLocalRead);
CHECK_FEATURE_DISABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
MultisampledRenderToSingleSampledFeaturesEXT,
multisampledRenderToSingleSampled);
CHECK_FEATURE_ENABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
PipelineCreationCacheControlFeatures,
pipelineCreationCacheControl);
// Features enabled by the app must remain enabled
CHECK_FEATURE_ENABLED(
SUBGROUP_SIZE_CONTROL_FEATURES, SubgroupSizeControlFeatures, subgroupSizeControl);
CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
CHECK_FEATURE_ENABLED(MAINTENANCE_5_FEATURES, Maintenance5Features, maintenance5);
CHECK_FEATURE_ENABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);
}
// A test where the application adds some features and extensions and lets Skia add to them. At the
// same time, support for some extensions is disabled. Uses Vulkan 1.2 as the API version.
DEF_TEST(VkPreferredFeaturesTest_CustomVulkan12, reporter) {
VulkanExts config;
config.fSamplerFilterMinmaxEXT = false;
config.fShaderViewportIndexLayerEXT = false;
config.fRGBA10x6FormatsEXT = false;
config.fHostImageCopyEXT = false;
config.fVertexInputDynamicStateEXT = false;
config.fExtendedDynamicStateEXT = false;
config.fExtendedDynamicState2EXT = false;
const std::vector<VkExtensionProperties> exts = get_device_exts(config);
skgpu::VulkanPreferredFeatures preferred;
preferred.init(VK_API_VERSION_1_2);
{
std::vector<const char*> instanceExts;
preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
}
VkPhysicalDeviceFeatures2 features = {};
features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
CHAIN(SUBGROUP_SIZE_CONTROL_FEATURES, SubgroupSizeControlFeatures, subgroupSizeControl);
CHAIN(DESCRIPTOR_INDEXING_FEATURES,
DescriptorIndexingFeatures,
shaderUniformTexelBufferArrayNonUniformIndexing);
appDescriptorIndexingFeatures.runtimeDescriptorArray = VK_TRUE;
CHAIN(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
CHAIN(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
PipelineCreationCacheControlFeatures,
pipelineCreationCacheControl);
CHAIN(SHADER_ATOMIC_INT64_FEATURES, ShaderAtomicInt64Features, shaderSharedInt64Atomics);
// Ask Skia to add its features to query
preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
// Populate the requested features
enable_device_features(config, features.pNext);
std::vector<const char*> enabledExts;
ADDEXT(VK_EXT_SHADER_OBJECT);
ADDEXT(VK_EXT_RGBA10X6_FORMATS);
ADDEXT(VK_KHR_PUSH_DESCRIPTOR);
ADDEXT(VK_KHR_SHADER_DRAW_PARAMETERS);
ADDEXT(VK_EXT_DESCRIPTOR_INDEXING);
ADDEXT(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
// Ask Skia to enable available features
preferred.addFeaturesToEnable(enabledExts, features);
CHECK_CHAINED(VULKAN_1_1_FEATURES);
CHECK_CHAINED(VULKAN_1_2_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_3_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);
CHECK_NOT_CHAINED(SAMPLER_YCBCR_CONVERSION_FEATURES);
CHECK_NOT_CHAINED(DESCRIPTOR_INDEXING_FEATURES);
CHECK_NOT_CHAINED(SHADER_ATOMIC_INT64_FEATURES);
CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
CHECK_EXT_DISABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
CHECK_EXT_ENABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
//CHECK_EXT_ENABLED(VK_KHR_SYNCHRONIZATION_2);
//CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING);
//CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
CHECK_EXT_DISABLED(VK_EXT_HOST_IMAGE_COPY);
CHECK_EXT_ENABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
//CHECK_EXT_ENABLED(VK_KHR_COPY_COMMANDS_2);
//CHECK_EXT_ENABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
// Extensions enabled by the app must remain enabled
CHECK_EXT_ENABLED(VK_EXT_SHADER_OBJECT);
CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
CHECK_EXT_ENABLED(VK_KHR_PUSH_DESCRIPTOR);
CHECK_EXT_ENABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
CHECK_EXT_ENABLED(VK_EXT_DESCRIPTOR_INDEXING);
CHECK_EXT_ENABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderInputAttachmentArrayDynamicIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformTexelBufferArrayDynamicIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageTexelBufferArrayDynamicIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformBufferArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderSampledImageArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageBufferArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageImageArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderInputAttachmentArrayNonUniformIndexing);
CHECK_FEATURE_ENABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformTexelBufferArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageTexelBufferArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingUniformBufferUpdateAfterBind);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingSampledImageUpdateAfterBind);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingStorageImageUpdateAfterBind);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingStorageBufferUpdateAfterBind);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES,
Vulkan12Features,
descriptorBindingUniformTexelBufferUpdateAfterBind);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES,
Vulkan12Features,
descriptorBindingStorageTexelBufferUpdateAfterBind);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingUpdateUnusedWhilePending);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingPartiallyBound);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingVariableDescriptorCount);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, runtimeDescriptorArray);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderBufferInt64Atomics);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderSharedInt64Atomics);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);
CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderColorAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderDepthAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderStencilAttachmentAccess);
CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
BlendOperationAdvancedFeaturesEXT,
advancedBlendCoherentOperations);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
ExtendedDynamicStateFeaturesEXT,
extendedDynamicState);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2LogicOp);
CHECK_FEATURE_DISABLED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT,
ExtendedDynamicState2FeaturesEXT,
extendedDynamicState2PatchControlPoints);
CHECK_FEATURE_DISABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
VertexInputDynamicStateFeaturesEXT,
vertexInputDynamicState);
CHECK_FEATURE_ENABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
GraphicsPipelineLibraryFeaturesEXT,
graphicsPipelineLibrary);
CHECK_FEATURE_DISABLED(RGBA10X6_FORMATS_FEATURES_EXT,
RGBA10X6FormatsFeaturesEXT,
formatRgba10x6WithoutYCbCrSampler);
//CHECK_FEATURE_ENABLED(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);
//CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);
//CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
// DynamicRenderingLocalReadFeatures,
// dynamicRenderingLocalRead);
CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
MultisampledRenderToSingleSampledFeaturesEXT,
multisampledRenderToSingleSampled);
CHECK_FEATURE_DISABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);
// Features enabled by the app must remain enabled
CHECK_FEATURE_ENABLED(
SUBGROUP_SIZE_CONTROL_FEATURES, SubgroupSizeControlFeatures, subgroupSizeControl);
CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
CHECK_FEATURE_ENABLED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
PipelineCreationCacheControlFeatures,
pipelineCreationCacheControl);
}
// A test where the application adds some features and extensions and lets Skia add to them. At the
// same time, support for some extensions is disabled. Uses Vulkan 1.3 as the API version.
DEF_TEST(VkPreferredFeaturesTest_CustomVulkan13, reporter) {
VulkanExts config;
config.fDrawIndirectCountKHR = false;
config.fSamplerYcbcrConversionKHR = false;
config.fGraphicsPipelineLibraryEXT = false;
config.fRGBA10x6FormatsEXT = false;
config.fHostImageCopyEXT = false;
config.fVertexInputDynamicStateEXT = false;
const std::vector<VkExtensionProperties> exts = get_device_exts(config);
skgpu::VulkanPreferredFeatures preferred;
preferred.init(VK_API_VERSION_1_3);
{
std::vector<const char*> instanceExts;
preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
}
VkPhysicalDeviceFeatures2 features = {};
features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
CHAIN(VULKAN_1_1_FEATURES, Vulkan11Features, multiview);
CHAIN(VULKAN_1_2_FEATURES, Vulkan12Features, vulkanMemoryModel);
appVulkan12Features.bufferDeviceAddress = VK_TRUE;
appVulkan12Features.shaderFloat16 = VK_TRUE;
appVulkan12Features.scalarBlockLayout = VK_TRUE;
CHAIN(VULKAN_1_3_FEATURES, Vulkan13Features, shaderZeroInitializeWorkgroupMemory);
CHAIN(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);
CHAIN(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
DynamicRenderingLocalReadFeatures,
dynamicRenderingLocalRead);
CHAIN(SYNCHRONIZATION_2_FEATURES, Synchronization2Features, synchronization2);
CHAIN(SHADER_INTEGER_DOT_PRODUCT_FEATURES,
ShaderIntegerDotProductFeatures,
shaderIntegerDotProduct);
CHAIN(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
CHAIN(PIPELINE_CREATION_CACHE_CONTROL_FEATURES,
PipelineCreationCacheControlFeatures,
pipelineCreationCacheControl);
// Ask Skia to add its features to query
preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
// Populate the requested features
enable_device_features(config, features.pNext);
std::vector<const char*> enabledExts;
ADDEXT(VK_EXT_SHADER_OBJECT);
ADDEXT(VK_KHR_PIPELINE_LIBRARY);
ADDEXT(VK_KHR_PUSH_DESCRIPTOR);
ADDEXT(VK_KHR_DRIVER_PROPERTIES);
ADDEXT(VK_KHR_SHADER_DRAW_PARAMETERS);
ADDEXT(VK_EXT_DESCRIPTOR_INDEXING);
ADDEXT(VK_KHR_DYNAMIC_RENDERING);
// Ask Skia to enable available features
preferred.addFeaturesToEnable(enabledExts, features);
CHECK_CHAINED(VULKAN_1_1_FEATURES);
CHECK_CHAINED(VULKAN_1_2_FEATURES);
CHECK_CHAINED(VULKAN_1_3_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);
CHECK_NOT_CHAINED(SAMPLER_YCBCR_CONVERSION_FEATURES);
CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT);
CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT);
CHECK_NOT_CHAINED(DYNAMIC_RENDERING_FEATURES);
CHECK_NOT_CHAINED(SYNCHRONIZATION_2_FEATURES);
CHECK_NOT_CHAINED(SHADER_INTEGER_DOT_PRODUCT_FEATURES);
CHECK_NOT_CHAINED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES);
CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
CHECK_EXT_DISABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
CHECK_EXT_DISABLED(VK_EXT_RGBA10X6_FORMATS);
CHECK_EXT_DISABLED(VK_KHR_SYNCHRONIZATION_2);
//CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
CHECK_EXT_DISABLED(VK_EXT_HOST_IMAGE_COPY);
CHECK_EXT_DISABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
CHECK_EXT_ENABLED(VK_KHR_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_COPY_COMMANDS_2);
CHECK_EXT_DISABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
// Extensions enabled by the app must remain enabled
CHECK_EXT_ENABLED(VK_EXT_SHADER_OBJECT);
CHECK_EXT_ENABLED(VK_KHR_PUSH_DESCRIPTOR);
CHECK_EXT_ENABLED(VK_KHR_DRIVER_PROPERTIES);
CHECK_EXT_ENABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
CHECK_EXT_ENABLED(VK_EXT_DESCRIPTOR_INDEXING);
CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING);
CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, multiview);
CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderInputAttachmentArrayDynamicIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformTexelBufferArrayDynamicIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageTexelBufferArrayDynamicIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformBufferArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderSampledImageArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageBufferArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageImageArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderInputAttachmentArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderUniformTexelBufferArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, shaderStorageTexelBufferArrayNonUniformIndexing);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingUniformBufferUpdateAfterBind);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingSampledImageUpdateAfterBind);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingStorageImageUpdateAfterBind);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingStorageBufferUpdateAfterBind);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES,
Vulkan12Features,
descriptorBindingUniformTexelBufferUpdateAfterBind);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES,
Vulkan12Features,
descriptorBindingStorageTexelBufferUpdateAfterBind);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingUpdateUnusedWhilePending);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingPartiallyBound);
CHECK_FEATURE_DISABLED(
VULKAN_1_2_FEATURES, Vulkan12Features, descriptorBindingVariableDescriptorCount);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, runtimeDescriptorArray);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderBufferInt64Atomics);
CHECK_FEATURE_DISABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderSharedInt64Atomics);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, vulkanMemoryModel);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, bufferDeviceAddress);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderFloat16);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, scalarBlockLayout);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, dynamicRendering);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, synchronization2);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, pipelineCreationCacheControl);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, shaderIntegerDotProduct);
CHECK_FEATURE_ENABLED(
VULKAN_1_3_FEATURES, Vulkan13Features, shaderZeroInitializeWorkgroupMemory);
CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderColorAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderDepthAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderStencilAttachmentAccess);
CHECK_FEATURE_ENABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
BlendOperationAdvancedFeaturesEXT,
advancedBlendCoherentOperations);
CHECK_FEATURE_DISABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
VertexInputDynamicStateFeaturesEXT,
vertexInputDynamicState);
CHECK_FEATURE_DISABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
GraphicsPipelineLibraryFeaturesEXT,
graphicsPipelineLibrary);
CHECK_FEATURE_DISABLED(RGBA10X6_FORMATS_FEATURES_EXT,
RGBA10X6FormatsFeaturesEXT,
formatRgba10x6WithoutYCbCrSampler);
//CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
// DynamicRenderingLocalReadFeatures,
// dynamicRenderingLocalRead);
CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
MultisampledRenderToSingleSampledFeaturesEXT,
multisampledRenderToSingleSampled);
CHECK_FEATURE_DISABLED(HOST_IMAGE_COPY_FEATURES, HostImageCopyFeatures, hostImageCopy);
// Features enabled by the app must remain enabled
CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
}
// A test where the application adds some features and extensions and lets Skia add to them. At the
// same time, support for some extensions is disabled. Uses Vulkan 1.4 as the API version.
DEF_TEST(VkPreferredFeaturesTest_CustomVulkan14, reporter) {
VulkanExts config;
config.fConservativeRasterizationEXT = false;
config.fRasterizationOrderAttachmentAccessEXT = false;
config.fGraphicsPipelineLibraryEXT = false;
config.fPipelineLibraryKHR = false;
config.fBlendOperationAdvancedEXT = false;
const std::vector<VkExtensionProperties> exts = get_device_exts(config);
skgpu::VulkanPreferredFeatures preferred;
preferred.init(VK_API_VERSION_1_4);
{
std::vector<const char*> instanceExts;
preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
}
VkPhysicalDeviceFeatures2 features = {};
features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
CHAIN(VULKAN_1_2_FEATURES, Vulkan12Features, subgroupBroadcastDynamicId);
appVulkan12Features.uniformAndStorageBuffer8BitAccess = VK_TRUE;
CHAIN(VULKAN_1_4_FEATURES, Vulkan14Features, stippledRectangularLines);
CHAIN(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
DynamicRenderingLocalReadFeatures,
dynamicRenderingLocalRead);
CHAIN(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
CHAIN(MAINTENANCE_5_FEATURES, Maintenance5Features, maintenance5);
CHAIN(MAINTENANCE_6_FEATURES, Maintenance6Features, maintenance6);
// Ask Skia to add its features to query
preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
// Populate the requested features
enable_device_features(config, features.pNext);
std::vector<const char*> enabledExts;
ADDEXT(VK_KHR_MAINTENANCE_5);
ADDEXT(VK_KHR_PUSH_DESCRIPTOR);
ADDEXT(VK_EXT_SHADER_OBJECT);
ADDEXT(VK_EXT_DESCRIPTOR_INDEXING);
ADDEXT(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
// Ask Skia to enable available features
preferred.addFeaturesToEnable(enabledExts, features);
CHECK_CHAINED(VULKAN_1_1_FEATURES);
CHECK_CHAINED(VULKAN_1_2_FEATURES);
CHECK_CHAINED(VULKAN_1_3_FEATURES);
CHECK_CHAINED(VULKAN_1_4_FEATURES);
CHECK_NOT_CHAINED(SAMPLER_YCBCR_CONVERSION_FEATURES);
CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT);
CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT);
CHECK_NOT_CHAINED(DYNAMIC_RENDERING_FEATURES);
CHECK_NOT_CHAINED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES);
CHECK_NOT_CHAINED(SYNCHRONIZATION_2_FEATURES);
CHECK_NOT_CHAINED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES);
CHECK_NOT_CHAINED(HOST_IMAGE_COPY_FEATURES);
CHECK_EXT_ENABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_DISABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_DISABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
CHECK_EXT_DISABLED(VK_KHR_SYNCHRONIZATION_2);
CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING);
CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
CHECK_EXT_DISABLED(VK_EXT_HOST_IMAGE_COPY);
CHECK_EXT_DISABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
CHECK_EXT_DISABLED(VK_KHR_LOAD_STORE_OP_NONE);
CHECK_EXT_DISABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
CHECK_EXT_DISABLED(VK_KHR_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_COPY_COMMANDS_2);
CHECK_EXT_DISABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
// Extensions enabled by the app must remain enabled
CHECK_EXT_ENABLED(VK_KHR_MAINTENANCE_5);
CHECK_EXT_ENABLED(VK_KHR_PUSH_DESCRIPTOR);
CHECK_EXT_ENABLED(VK_EXT_SHADER_OBJECT);
CHECK_EXT_ENABLED(VK_EXT_DESCRIPTOR_INDEXING);
CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, subgroupBroadcastDynamicId);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, uniformAndStorageBuffer8BitAccess);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, dynamicRendering);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, synchronization2);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, pipelineCreationCacheControl);
CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, maintenance5);
CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, maintenance6);
CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, dynamicRenderingLocalRead);
CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, hostImageCopy);
CHECK_FEATURE_ENABLED(VULKAN_1_4_FEATURES, Vulkan14Features, pushDescriptor);
CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderColorAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderDepthAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderStencilAttachmentAccess);
CHECK_FEATURE_DISABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
BlendOperationAdvancedFeaturesEXT,
advancedBlendCoherentOperations);
CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
VertexInputDynamicStateFeaturesEXT,
vertexInputDynamicState);
CHECK_FEATURE_DISABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
GraphicsPipelineLibraryFeaturesEXT,
graphicsPipelineLibrary);
CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
RGBA10X6FormatsFeaturesEXT,
formatRgba10x6WithoutYCbCrSampler);
CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
MultisampledRenderToSingleSampledFeaturesEXT,
multisampledRenderToSingleSampled);
// Features enabled by the app must remain enabled
CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
}
// A similar test to VkPreferredFeaturesTest_CustomVulkan*, except the chain passed to
// addFeaturesToEnable does not include all the structs passed to addFeaturesToQuery.
// addFeaturesToEnable should automatically add back the structs that addFeaturesToQuery had decided
// to chain.
DEF_TEST(VkPreferredFeaturesTest_EmptyEnableChain, reporter) {
VulkanExts config;
config.fGraphicsPipelineLibraryEXT = false;
config.fPipelineLibraryKHR = false;
config.fBlendOperationAdvancedEXT = false;
const std::vector<VkExtensionProperties> exts = get_device_exts(config);
skgpu::VulkanPreferredFeatures preferred;
preferred.init(VK_API_VERSION_1_3);
{
std::vector<const char*> instanceExts;
preferred.addToInstanceExtensions(nullptr, 0, instanceExts);
}
VkPhysicalDeviceFeatures2 features = {};
features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
CHAIN(VULKAN_1_2_FEATURES, Vulkan12Features, subgroupBroadcastDynamicId);
CHAIN(DYNAMIC_RENDERING_FEATURES, DynamicRenderingFeatures, dynamicRendering);
CHAIN(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
CHAIN(MAINTENANCE_5_FEATURES, Maintenance5Features, maintenance5);
// Ask Skia to add its features to query
preferred.addFeaturesToQuery(exts.data(), exts.size(), features);
// Populate the requested features
enable_device_features(config, features.pNext);
std::vector<const char*> enabledExts;
ADDEXT(VK_KHR_MAINTENANCE_5);
ADDEXT(VK_KHR_PUSH_DESCRIPTOR);
ADDEXT(VK_EXT_SHADER_OBJECT);
// Start a new chain of features, only the ones the app has enabled.
features.pNext = &appVulkan12Features;
appVulkan12Features.pNext = &appDynamicRenderingFeatures;
appDynamicRenderingFeatures.pNext = &appShaderObjectFeaturesEXT;
appShaderObjectFeaturesEXT.pNext = &appMaintenance5Features;
appMaintenance5Features.pNext = nullptr;
// Ask Skia to enable available features
preferred.addFeaturesToEnable(enabledExts, features);
CHECK_CHAINED(VULKAN_1_1_FEATURES);
CHECK_CHAINED(VULKAN_1_2_FEATURES);
CHECK_CHAINED(VULKAN_1_3_FEATURES);
CHECK_NOT_CHAINED(VULKAN_1_4_FEATURES);
CHECK_NOT_CHAINED(SAMPLER_YCBCR_CONVERSION_FEATURES);
CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_FEATURES_EXT);
CHECK_NOT_CHAINED(EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT);
CHECK_NOT_CHAINED(DYNAMIC_RENDERING_FEATURES);
CHECK_NOT_CHAINED(SYNCHRONIZATION_2_FEATURES);
CHECK_NOT_CHAINED(PIPELINE_CREATION_CACHE_CONTROL_FEATURES);
CHECK_EXT_DISABLED(VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_ENABLED(VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS);
CHECK_EXT_DISABLED(VK_EXT_BLEND_OPERATION_ADVANCED);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_EXTENDED_DYNAMIC_STATE_2);
CHECK_EXT_ENABLED(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE);
CHECK_EXT_DISABLED(VK_EXT_GRAPHICS_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_YCBCR_CONVERSION);
CHECK_EXT_ENABLED(VK_EXT_RGBA10X6_FORMATS);
CHECK_EXT_DISABLED(VK_KHR_SYNCHRONIZATION_2);
CHECK_EXT_DISABLED(VK_KHR_DYNAMIC_RENDERING);
//CHECK_EXT_ENABLED(VK_KHR_DYNAMIC_RENDERING_LOCAL_READ);
CHECK_EXT_ENABLED(VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED);
//CHECK_EXT_ENABLED(VK_EXT_HOST_IMAGE_COPY);
CHECK_EXT_DISABLED(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL);
CHECK_EXT_DISABLED(VK_KHR_DRIVER_PROPERTIES);
CHECK_EXT_DISABLED(VK_KHR_CREATE_RENDERPASS_2);
CHECK_EXT_DISABLED(VK_EXT_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_KHR_LOAD_STORE_OP_NONE);
CHECK_EXT_ENABLED(VK_EXT_CONSERVATIVE_RASTERIZATION);
CHECK_EXT_DISABLED(VK_KHR_PIPELINE_LIBRARY);
CHECK_EXT_DISABLED(VK_KHR_COPY_COMMANDS_2);
CHECK_EXT_DISABLED(VK_KHR_FORMAT_FEATURE_FLAGS_2);
CHECK_EXT_DISABLED(VK_KHR_DEPTH_STENCIL_RESOLVE);
CHECK_EXT_DISABLED(VK_KHR_SHADER_DRAW_PARAMETERS);
CHECK_EXT_DISABLED(VK_KHR_DRAW_INDIRECT_COUNT);
CHECK_EXT_DISABLED(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE);
CHECK_EXT_DISABLED(VK_EXT_DESCRIPTOR_INDEXING);
CHECK_EXT_DISABLED(VK_EXT_SAMPLER_FILTER_MINMAX);
CHECK_EXT_DISABLED(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER);
// Extensions enabled by the app must remain enabled
CHECK_EXT_ENABLED(VK_KHR_MAINTENANCE_5);
CHECK_EXT_ENABLED(VK_KHR_PUSH_DESCRIPTOR);
CHECK_EXT_ENABLED(VK_EXT_SHADER_OBJECT);
CHECK_FEATURE_ENABLED(VULKAN_1_1_FEATURES, Vulkan11Features, samplerYcbcrConversion);
CHECK_FEATURE_DISABLED(VULKAN_1_1_FEATURES, Vulkan11Features, shaderDrawParameters);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerMirrorClampToEdge);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, drawIndirectCount);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, descriptorIndexing);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, samplerFilterMinmax);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputViewportIndex);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, shaderOutputLayer);
CHECK_FEATURE_ENABLED(VULKAN_1_2_FEATURES, Vulkan12Features, subgroupBroadcastDynamicId);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, dynamicRendering);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, synchronization2);
CHECK_FEATURE_ENABLED(VULKAN_1_3_FEATURES, Vulkan13Features, pipelineCreationCacheControl);
CHECK_FEATURE_ENABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderColorAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderDepthAttachmentAccess);
CHECK_FEATURE_DISABLED(RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
RasterizationOrderAttachmentAccessFeaturesEXT,
rasterizationOrderStencilAttachmentAccess);
CHECK_FEATURE_DISABLED(BLEND_OPERATION_ADVANCED_FEATURES_EXT,
BlendOperationAdvancedFeaturesEXT,
advancedBlendCoherentOperations);
CHECK_FEATURE_ENABLED(VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT,
VertexInputDynamicStateFeaturesEXT,
vertexInputDynamicState);
CHECK_FEATURE_DISABLED(GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT,
GraphicsPipelineLibraryFeaturesEXT,
graphicsPipelineLibrary);
CHECK_FEATURE_ENABLED(RGBA10X6_FORMATS_FEATURES_EXT,
RGBA10X6FormatsFeaturesEXT,
formatRgba10x6WithoutYCbCrSampler);
//CHECK_FEATURE_ENABLED(DYNAMIC_RENDERING_LOCAL_READ_FEATURES,
// DynamicRenderingLocalReadFeatures,
// dynamicRenderingLocalRead);
CHECK_FEATURE_ENABLED(MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT,
MultisampledRenderToSingleSampledFeaturesEXT,
multisampledRenderToSingleSampled);
// Features enabled by the app must remain enabled
CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject);
CHECK_FEATURE_ENABLED(MAINTENANCE_5_FEATURES, Maintenance5Features, maintenance5);
}
#endif