| /* | |
| * Copyright 2025 Google LLC | |
| * | |
| * 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 fPipelineProtectedAccessEXT = true; | |
| bool fDriverPropertiesKHR = true; | |
| bool fCreateRenderpass2KHR = true; | |
| bool fLoadStoreOpNoneEXT = true; | |
| bool fLoadStoreOpNoneKHR = true; | |
| bool fConservativeRasterizationEXT = true; | |
| #if defined(SK_BUILD_FOR_ANDROID) | |
| bool fExternalMemoryAHardwareBufferEXT = true; | |
| #endif | |
| bool fPipelineLibraryKHR = true; | |
| bool fCopyCommands2KHR = true; | |
| bool fFormatFeatureFlags2KHR = true; | |
| bool fDepthStencilResolveKHR = true; | |
| #if defined(SK_BUILD_FOR_ANDROID) | |
| bool fQueueFamilyForeignEXT = true; | |
| #endif | |
| bool fShaderDrawParametersKHR = true; | |
| bool fDrawIndirectCountKHR = true; | |
| bool fSamplerMirrorClampToEdgeKHR = true; | |
| bool fDescriptorIndexingEXT = true; | |
| bool fSamplerFilterMinmaxEXT = true; | |
| bool fShaderViewportIndexLayerEXT = true; | |
| bool fPushDescriptorKHR = true; | |
| bool fFrameBoundaryEXT = 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(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(fPipelineProtectedAccessEXT, VK_EXT_PIPELINE_PROTECTED_ACCESS); | |
| 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); | |
| #if defined(SK_BUILD_FOR_ANDROID) | |
| ADD_EXT(fExternalMemoryAHardwareBufferEXT, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER); | |
| #endif | |
| 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); | |
| #if defined(SK_BUILD_FOR_ANDROID) | |
| ADD_EXT(fQueueFamilyForeignEXT, VK_EXT_QUEUE_FAMILY_FOREIGN); | |
| #endif | |
| 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); | |
| ADD_EXT(fFrameBoundaryEXT, VK_EXT_FRAME_BOUNDARY); | |
| #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_IF(fPipelineProtectedAccessEXT, pipelineProtectedAccess)) | |
| 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)) | |
| SET_FEATURES(PIPELINE_PROTECTED_ACCESS_FEATURES, | |
| PipelineProtectedAccessFeatures, | |
| SET_IF(fPipelineProtectedAccessEXT, pipelineProtectedAccess)) | |
| SET_FEATURES(FRAME_BOUNDARY_FEATURES_EXT, | |
| FrameBoundaryFeaturesEXT, | |
| SET_IF(fFrameBoundaryEXT, frameBoundary)) | |
| 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_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_EXT_PIPELINE_PROTECTED_ACCESS); | |
| 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); | |
| #if defined(SK_BUILD_FOR_ANDROID) | |
| CHECK_EXT_ENABLED(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER); | |
| #endif | |
| 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); | |
| #if defined(SK_BUILD_FOR_ANDROID) | |
| CHECK_EXT_ENABLED(VK_EXT_QUEUE_FAMILY_FOREIGN); | |
| #endif | |
| 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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY); | |
| 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); | |
| CHECK_FEATURE_ENABLED(PIPELINE_PROTECTED_ACCESS_FEATURES, | |
| PipelineProtectedAccessFeatures, | |
| pipelineProtectedAccess); | |
| CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT, | |
| FrameBoundaryFeaturesEXT, | |
| frameBoundary); | |
| } | |
| // 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_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_EXT_PIPELINE_PROTECTED_ACCESS); | |
| 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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY); | |
| 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); | |
| CHECK_FEATURE_ENABLED(PIPELINE_PROTECTED_ACCESS_FEATURES, | |
| PipelineProtectedAccessFeatures, | |
| pipelineProtectedAccess); | |
| CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT, | |
| FrameBoundaryFeaturesEXT, | |
| frameBoundary); | |
| } | |
| // 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_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_ENABLED(VK_EXT_PIPELINE_PROTECTED_ACCESS); | |
| 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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY); | |
| 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); | |
| CHECK_FEATURE_ENABLED(PIPELINE_PROTECTED_ACCESS_FEATURES, | |
| PipelineProtectedAccessFeatures, | |
| pipelineProtectedAccess); | |
| CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT, | |
| FrameBoundaryFeaturesEXT, | |
| frameBoundary); | |
| } | |
| // 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_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_EXT_PIPELINE_PROTECTED_ACCESS); | |
| 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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY); | |
| 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_DISABLED(VULKAN_1_4_FEATURES, Vulkan14Features, pipelineProtectedAccess); | |
| 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); | |
| CHECK_FEATURE_DISABLED(PIPELINE_PROTECTED_ACCESS_FEATURES, | |
| PipelineProtectedAccessFeatures, | |
| pipelineProtectedAccess); | |
| CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT, | |
| FrameBoundaryFeaturesEXT, | |
| frameBoundary); | |
| } | |
| #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; | |
| config.fFrameBoundaryEXT = 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_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_EXT_PIPELINE_PROTECTED_ACCESS); | |
| 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_EXT_DISABLED(VK_EXT_FRAME_BOUNDARY); | |
| 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); | |
| CHECK_FEATURE_ENABLED(PIPELINE_PROTECTED_ACCESS_FEATURES, | |
| PipelineProtectedAccessFeatures, | |
| pipelineProtectedAccess); | |
| // 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); | |
| CHECK_FEATURE_DISABLED(FRAME_BOUNDARY_FEATURES_EXT, | |
| FrameBoundaryFeaturesEXT, | |
| frameBoundary); | |
| } | |
| // 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; | |
| config.fFrameBoundaryEXT = 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_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_ENABLED(VK_EXT_PIPELINE_PROTECTED_ACCESS); | |
| 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_EXT_DISABLED(VK_EXT_FRAME_BOUNDARY); | |
| 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); | |
| CHECK_FEATURE_ENABLED(PIPELINE_PROTECTED_ACCESS_FEATURES, | |
| PipelineProtectedAccessFeatures, | |
| pipelineProtectedAccess); | |
| // 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); | |
| CHECK_FEATURE_DISABLED(FRAME_BOUNDARY_FEATURES_EXT, | |
| FrameBoundaryFeaturesEXT, | |
| frameBoundary); | |
| } | |
| // 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_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_ENABLED(VK_EXT_PIPELINE_PROTECTED_ACCESS); | |
| 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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY); | |
| 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); | |
| CHECK_FEATURE_ENABLED(PIPELINE_PROTECTED_ACCESS_FEATURES, | |
| PipelineProtectedAccessFeatures, | |
| pipelineProtectedAccess); | |
| // Features enabled by the app must remain enabled | |
| CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject); | |
| CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT, | |
| FrameBoundaryFeaturesEXT, | |
| frameBoundary); | |
| } | |
| // 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_NOT_CHAINED(PIPELINE_PROTECTED_ACCESS_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_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_EXT_PIPELINE_PROTECTED_ACCESS); | |
| 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_EXT_ENABLED(VK_EXT_FRAME_BOUNDARY); | |
| 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, pipelineProtectedAccess); | |
| 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); | |
| CHECK_FEATURE_DISABLED(PIPELINE_PROTECTED_ACCESS_FEATURES, | |
| PipelineProtectedAccessFeatures, | |
| pipelineProtectedAccess); | |
| // Features enabled by the app must remain enabled | |
| CHECK_FEATURE_ENABLED(SHADER_OBJECT_FEATURES_EXT, ShaderObjectFeaturesEXT, shaderObject); | |
| CHECK_FEATURE_ENABLED(FRAME_BOUNDARY_FEATURES_EXT, | |
| FrameBoundaryFeaturesEXT, | |
| frameBoundary); | |
| } | |
| // 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; | |
| config.fFrameBoundaryEXT = 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_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_ENABLED(VK_EXT_PIPELINE_PROTECTED_ACCESS); | |
| 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_EXT_DISABLED(VK_EXT_FRAME_BOUNDARY); | |
| 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); | |
| CHECK_FEATURE_ENABLED(PIPELINE_PROTECTED_ACCESS_FEATURES, | |
| PipelineProtectedAccessFeatures, | |
| pipelineProtectedAccess); | |
| // 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); | |
| CHECK_FEATURE_DISABLED(FRAME_BOUNDARY_FEATURES_EXT, | |
| FrameBoundaryFeaturesEXT, | |
| frameBoundary); | |
| } | |
| #endif |