From 55c402a94700f7b6715684c76629746e1fcfb523 Mon Sep 17 00:00:00 2001 From: Christophe Date: Mon, 15 Jun 2026 16:10:38 +0200 Subject: [PATCH] profiles: Add capabilities dependences --- CHANGELOG.md | 2 + CMakeLists.txt | 2 +- layer/profiles_json.cpp | 4 +- .../VP_LUNARG_minimum_requirements.json | 439 ++++++++++++++++-- scripts/gen_profiles_file.py | 2 +- scripts/gen_profiles_tests.py | 2 +- scripts/source/generate_profiles_schema.py | 28 +- scripts/tests/test_vulkan_profiles.py | 4 +- 8 files changed, 432 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5a25996..a45c9f20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ ### Features: - Add `profiles.py` python script, to pull dependent extensions into a source profiles file (ALPHA) +- Add capabilities dependences in JSON schema, version 0.9 +- Add capabilities dependences in minimum requirements profiles - Add the generated `VP_LUNARG_desktop_baseline_2026` profile ### Bugfixes: diff --git a/CMakeLists.txt b/CMakeLists.txt index f0bea577..dfbfc2f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -97,7 +97,7 @@ if (BUILD_TESTS_EXTRA) add_definitions(-DVKU_FORCE_EXTRA_TESTS) endif() -set(PROFILES_SCHEMA_FILENAME "profiles-0.8-latest.json") +set(PROFILES_SCHEMA_FILENAME "profiles-0.9-latest.json") # Generate profiles executable function(add_pyinstaller_target TARGET_NAME) diff --git a/layer/profiles_json.cpp b/layer/profiles_json.cpp index ae84c731..93a8e267 100644 --- a/layer/profiles_json.cpp +++ b/layer/profiles_json.cpp @@ -54,11 +54,11 @@ JsonValidator::~JsonValidator() { bool JsonValidator::Init() { #ifdef __APPLE__ - const std::string schema_path = "/usr/local/share/vulkan/registry/profiles-0.8-latest.json"; + const std::string schema_path = "/usr/local/share/vulkan/registry/profiles-0.9-latest.json"; #else const char *sdk_path = std::getenv("VULKAN_SDK"); if (sdk_path == nullptr) return false; - const std::string schema_path = std::string(sdk_path) + "/share/vulkan/registry/profiles-0.8-latest.json"; + const std::string schema_path = std::string(sdk_path) + "/share/vulkan/registry/profiles-0.9-latest.json"; #endif if (!schema) { diff --git a/profiles/LunarG/VP_LUNARG_minimum_requirements.json b/profiles/LunarG/VP_LUNARG_minimum_requirements.json index acba8ba6..d888e0c3 100644 --- a/profiles/LunarG/VP_LUNARG_minimum_requirements.json +++ b/profiles/LunarG/VP_LUNARG_minimum_requirements.json @@ -1,7 +1,7 @@ { - "$schema": "https://schema.khronos.org/vulkan/profiles-0.8.1-204.json#", + "$schema": "https://schema.khronos.org/vulkan/profiles-0.9.0-354.json#", "capabilities": { - "vulkan10requirements": { + "vulkan_1_0_base": { "features": { "VkPhysicalDeviceFeatures": { "robustBufferAccess": true @@ -165,32 +165,33 @@ "residencyNonResidentStrict": false } } + }, + "formats": { } }, - "vulkan11requirements_split": { - "features": { - "VkPhysicalDeviceMultiviewFeatures": { - "multiview": true + "vulkan_1_0_sparseBinding": { + "depends": { + "features": { + "VkPhysicalDeviceFeatures": { + "sparseBinding": true + } } }, "properties": { - "VkPhysicalDeviceSubgroupProperties": { - "subgroupSize": 1, - "supportedStages": [ "VK_SHADER_STAGE_COMPUTE_BIT" ], - "supportedOperations": [ "VK_SUBGROUP_FEATURE_BASIC_BIT" ] - }, - "VkPhysicalDeviceMultiviewProperties": { - "maxMultiviewViewCount": 6, - "maxMultiviewInstanceIndex": 134217727 - }, - "VkPhysicalDeviceMaintenance3Properties": { - "maxPerSetDescriptors": 1024, - "maxMemoryAllocationSize": 1073741824 + "VkPhysicalDeviceProperties": { + "limits": { + "sparseAddressSpaceSize": 2147483648 + } } - } }, - "vulkan11requirements": { + "vulkan_1_0": { + "requirements": [ + "vulkan_1_0_base", + "vulkan_1_0_sparseBinding" + ] + }, + "vulkan_1_1_base": { "features": { "VkPhysicalDeviceVulkan11Features": { "multiview": true @@ -206,9 +207,71 @@ "maxPerSetDescriptors": 1024, "maxMemoryAllocationSize": 1073741824 } + }, + "formats": { + } }, - "vulkan12requirements": { + "vulkan_1_1_16bit_storage": { + "depends": { + "extensions": { + "VK_KHR_16bit_storage": 1 + } + }, + "features": { + "VkPhysicalDevice16BitStorageFeatures": { + "storageBuffer16BitAccess": true + } + } + }, + "vulkan_1_1_sampler_ycbcr_conversion": { + "depends": { + "extensions": { + "VK_KHR_sampler_ycbcr_conversion": 14 + } + }, + "features": { + "VkPhysicalDeviceSamplerYcbcrConversionFeatures": { + "samplerYcbcrConversion": true + } + }, + "formats": { + } + }, + "vulkan_1_1_shader_draw_parameters": { + "depends": { + "extensions": { + "VK_KHR_shader_draw_parameters": 1 + } + }, + "features": { + "VkPhysicalDeviceShaderDrawParametersFeatures": { + "shaderDrawParameters": true + } + } + }, + "vulkan_1_1_variable_pointers": { + "depends": { + "extensions": { + "VK_KHR_variable_pointers": 1 + } + }, + "features": { + "VkPhysicalDeviceVariablePointersFeatures": { + "variablePointersStorageBuffer": true + } + } + }, + "vulkan_1_1": { + "requirements": [ + "vulkan_1_1_base", + "vulkan_1_1_16bit_storage", + "vulkan_1_1_sampler_ycbcr_conversion", + "vulkan_1_1_shader_draw_parameters", + "vulkan_1_1_variable_pointers" + ] + }, + "vulkan_1_2_base": { "features": { "VkPhysicalDeviceVulkan12Features": { "samplerMirrorClampToEdge": true, @@ -275,9 +338,148 @@ "maxTimelineSemaphoreValueDifference": 2147483647, "framebufferIntegerColorSampleCounts": [ "VK_SAMPLE_COUNT_1_BIT" ] } + }, + "formats": { + } + }, + "vulkan_1_2_8bit_storage": { + "depends": { + "extensions": { + "VK_KHR_8bit_storage": 1 + } + }, + "features": { + "VkPhysicalDeviceVulkan12Features": { + "storageBuffer8BitAccess": true + } + } + }, + "vulkan_1_2_draw_indirect_count": { + "depends": { + "extensions": { + "VK_KHR_draw_indirect_count": 1 + } + }, + "features": { + "VkPhysicalDeviceVulkan12Features": { + "drawIndirectCount": true + } + } + }, + "vulkan_1_2_sampler_mirror_clamp_to_edge": { + "depends": { + "extensions": { + "VK_KHR_sampler_mirror_clamp_to_edge": 3 + } + }, + "features": { + "VkPhysicalDeviceVulkan12Features": { + "samplerMirrorClampToEdge": true + } + } + }, + "vulkan_1_2_descriptor_indexing": { + "depends": { + "extensions": { + "VK_EXT_descriptor_indexing": 2 + } + }, + "features": { + "VkPhysicalDeviceVulkan12Features": { + "descriptorIndexing": true + } + } + }, + "vulkan_1_2_scalar_block_layout": { + "depends": { + "extensions": { + "VK_EXT_scalar_block_layout": 1 + } + }, + "features": { + "VkPhysicalDeviceVulkan12Features": { + "scalarBlockLayout": true + } + } + }, + "vulkan_1_2_shader_viewport_index_layer": { + "depends": { + "extensions": { + "VK_EXT_shader_viewport_index_layer": 1 + } + }, + "features": { + "VkPhysicalDeviceVulkan12Features": { + "shaderOutputViewportIndex": true, + "shaderOutputLayer": true + } + } + }, + "vulkan_1_2_buffer_device_address": { + "depends": { + "extensions": { + "VK_KHR_buffer_device_address": 1 + } + }, + "features": { + "VkPhysicalDeviceVulkan12Features": { + "bufferDeviceAddress": true + } + } + }, + "vulkan_1_2_shader_atomic_int64": { + "depends": { + "extensions": { + "VK_KHR_shader_atomic_int64": 1 + } + }, + "features": { + "VkPhysicalDeviceVulkan12Features": { + "shaderBufferInt64Atomics": true + } + } + }, + "vulkan_1_2_shader_float16_int8": { + "depends": { + "extensions": { + "VK_KHR_shader_float16_int8": 1 + } + }, + "features": { + "VkPhysicalDeviceVulkan12Features": { + "shaderFloat16": true, + "shaderInt8": true + } } }, - "vulkan13requirements": { + "vulkan_1_2_vulkan_memory_model": { + "depends": { + "extensions": { + "VK_KHR_vulkan_memory_model": 3 + } + }, + "features": { + "VkPhysicalDeviceVulkan12Features": { + "vulkanMemoryModel": true + } + } + }, + "vulkan_1_2": { + "requirements": [ + "vulkan_1_2_base", + "vulkan_1_2_8bit_storage", + "vulkan_1_2_draw_indirect_count", + "vulkan_1_2_sampler_mirror_clamp_to_edge", + "vulkan_1_2_descriptor_indexing", + "vulkan_1_2_scalar_block_layout", + "vulkan_1_2_shader_viewport_index_layer", + "vulkan_1_2_buffer_device_address", + "vulkan_1_2_shader_atomic_int64", + "vulkan_1_2_shader_float16_int8", + "vulkan_1_2_vulkan_memory_model" + ] + }, + "vulkan_1_3_base": { "features": { "VkPhysicalDeviceVulkan12Features": { "vulkanMemoryModel": true, @@ -341,9 +543,139 @@ "integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated": false, "maxBufferSize": 1073741824 } + }, + "formats": { + } + }, + "vulkan_1_3_4444_formats": { + "depends": { + "extensions": { + "VK_EXT_4444_formats": 1 + } + }, + "features": { + "VkPhysicalDevice4444FormatsFeaturesEXT": { + "formatA4R4G4B4": true, + "formatA4B4G4R4": true + } + }, + "formats": { + "VK_FORMAT_A4R4G4B4_UNORM_PACK16": { + "VkFormatProperties": { + "optimalTilingFeatures": [ + "VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT", + "VK_FORMAT_FEATURE_BLIT_SRC_BIT", + "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" + ] + } + }, + "VK_FORMAT_A4B4G4R4_UNORM_PACK16": { + "VkFormatProperties": { + "optimalTilingFeatures": [ + "VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT", + "VK_FORMAT_FEATURE_BLIT_SRC_BIT", + "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" + ] + } + }, + "VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT": { + "VkFormatProperties": { + "optimalTilingFeatures": [ + "VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT", + "VK_FORMAT_FEATURE_BLIT_SRC_BIT", + "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" + ] + } + }, + "VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT": { + "VkFormatProperties": { + "optimalTilingFeatures": [ + "VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT", + "VK_FORMAT_FEATURE_BLIT_SRC_BIT", + "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" + ] + } + } + } + }, + "vulkan_1_3_texture_compression_astc_hdr": { + "depends": { + "extensions": { + "VK_EXT_texture_compression_astc_hdr": 1 + } + }, + "features": { + "VkPhysicalDeviceExtendedDynamicStateFeaturesEXT": { + "extendedDynamicState": true + } + }, + "formats": { + "VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + }, + "VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK": { + "VkFormatProperties": { + } + } } }, - "vulkan14requirements": { + "vulkan_1_3": { + "requirements": [ + "vulkan_1_3_base", + "vulkan_1_3_4444_formats", + "vulkan_1_3_texture_compression_astc_hdr" + ] + }, + "vulkan_1_4_base": { "features": { "VkPhysicalDeviceFeatures": { "fullDrawIndexUint32": true, @@ -444,7 +776,7 @@ }, "VkPhysicalDeviceVulkan11Properties": { "subgroupSupportedOperations": [ "VK_SUBGROUP_FEATURE_BASIC_BIT", "VK_SUBGROUP_FEATURE_CLUSTERED_BIT", "VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT" ] - }, + }, "VkPhysicalDeviceVulkan12Properties": { "shaderSignedZeroInfNanPreserveFloat16": true, "shaderSignedZeroInfNanPreserveFloat32": true @@ -454,12 +786,30 @@ } } }, - "vulkan14dependent": { + "vulkan_1_4_protectedMemory": { + "depends": { + "features": { + "VkPhysicalDeviceVulkan11Features": { + "protectedMemory": true + } + } + }, "features": { "VkPhysicalDeviceVulkan14Features": { "pipelineProtectedAccess": true } } + }, + "vulkan_1_4": { + "features": { + "VkPhysicalDeviceVulkan14Features": { + "pipelineProtectedAccess": true + } + }, + "requirements": [ + "vulkan_1_4_base", + "vulkan_1_4_protectedMemory" + ] } }, "profiles": { @@ -469,7 +819,7 @@ "label": "Vulkan 1.0 Minimum Requirements", "description": "Vulkan 1.0 Minimum Requirements.", "capabilities": [ - "vulkan10requirements" + "vulkan_1_0" ] }, "VP_LUNARG_minimum_requirements_1_1": { @@ -478,8 +828,8 @@ "label": "Vulkan 1.1 Minimum Requirements", "description": "Vulkan 1.1 Minimum Requirements.", "capabilities": [ - "vulkan10requirements", - "vulkan11requirements_split" + "vulkan_1_0", + "vulkan_1_1" ] }, "VP_LUNARG_minimum_requirements_1_2": { @@ -488,9 +838,9 @@ "label": "Vulkan 1.2 Minimum Requirements", "description": "Vulkan 1.2 Minimum Requirements.", "capabilities": [ - "vulkan10requirements", - "vulkan11requirements", - "vulkan12requirements" + "vulkan_1_0", + "vulkan_1_1", + "vulkan_1_2" ] }, "VP_LUNARG_minimum_requirements_1_3": { @@ -499,10 +849,10 @@ "label": "Vulkan 1.3 Minimum Requirements", "description": "Vulkan 1.3 Minimum Requirements.", "capabilities": [ - "vulkan10requirements", - "vulkan11requirements", - "vulkan12requirements", - "vulkan13requirements" + "vulkan_1_0", + "vulkan_1_1", + "vulkan_1_2", + "vulkan_1_3" ] }, "VP_LUNARG_minimum_requirements_1_4": { @@ -511,14 +861,11 @@ "label": "Vulkan 1.4 Minimum Requirements", "description": "Vulkan 1.4 Minimum Requirements.", "capabilities": [ - "vulkan10requirements", - "vulkan11requirements", - "vulkan12requirements", - "vulkan13requirements", - "vulkan14requirements" - ], - "optionals": [ - "vulkan14dependent" + "vulkan_1_0", + "vulkan_1_1", + "vulkan_1_2", + "vulkan_1_3", + "vulkan_1_4" ] } }, @@ -530,6 +877,12 @@ } }, "history": [ + { + "revision": 3, + "date": "2026-06-15", + "author": "Christophe Riccio", + "comment": "Refactor profiles definitions and add capabilities dependences" + }, { "revision": 2, "date": "2026-03-05", diff --git a/scripts/gen_profiles_file.py b/scripts/gen_profiles_file.py index 1a719d60..f158279b 100644 --- a/scripts/gen_profiles_file.py +++ b/scripts/gen_profiles_file.py @@ -31,7 +31,7 @@ class ProfileFile(): def __init__(self): self.json_output = dict() - self.json_output['$schema'] = 'https://schema.khronos.org/vulkan/profiles-0.8-latest.json#' + self.json_output['$schema'] = 'https://schema.khronos.org/vulkan/profiles-0.9-latest.json#' self.json_output['capabilities'] = dict() self.json_output['profiles'] = dict() self.json_output['contributors'] = dict() diff --git a/scripts/gen_profiles_tests.py b/scripts/gen_profiles_tests.py index 45dde714..1870d756 100644 --- a/scripts/gen_profiles_tests.py +++ b/scripts/gen_profiles_tests.py @@ -605,7 +605,7 @@ def gen_formats(self, registry): def gen_privateImpl(self, registry): gen = '{\n' - gen += ' "$schema": "https://schema.khronos.org/vulkan/profiles-0.8.0-204.json#",\n' + gen += ' "$schema": "https://schema.khronos.org/vulkan/profiles-0.9.0-354.json#",\n' gen += ' "capabilities": {\n' gen += ' "baseline": {\n' gen += ' "extensions": {' diff --git a/scripts/source/generate_profiles_schema.py b/scripts/source/generate_profiles_schema.py index 1116eed8..8bae6127 100644 --- a/scripts/source/generate_profiles_schema.py +++ b/scripts/source/generate_profiles_schema.py @@ -101,7 +101,7 @@ def gen_schema(self): return OrderedDict({ "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.khronos.org/vulkan/profiles-0.8.2-{0}.json#".format(self.vk.headerVersion), + "$id": "https://schema.khronos.org/vulkan/profiles-0.8.3-{0}.json#".format(self.vk.headerVersion), "title": "Vulkan Profiles Schema for Vulkan {0}".format(versionStr), "additionalProperties": True, "required": [ @@ -117,6 +117,32 @@ def gen_schema(self): "type": "object", "additionalProperties": False, "properties": OrderedDict({ + "requirements": OrderedDict({ + "description": "The block that stores required blocks.", + "type": "array", + "uniqueItems": True, + "items": OrderedDict({ + "type": "string" + }) + }), + "depends": OrderedDict({ + "description": "The block that stores required blocks.", + "type": "object", + "properties": OrderedDict({ + "extensions": OrderedDict({ + "description": "The block that stores required extensions.", + "type": "object", + "additionalProperties": False, + "properties": extensions + }), + "features": OrderedDict({ + "description": "The block that stores features requirements.", + "type": "object", + "additionalProperties": False, + "properties": features + }) + }) + }), "extensions": OrderedDict({ "description": "The block that stores required extensions.", "type": "object", diff --git a/scripts/tests/test_vulkan_profiles.py b/scripts/tests/test_vulkan_profiles.py index 403812da..7fe1e0b3 100644 --- a/scripts/tests/test_vulkan_profiles.py +++ b/scripts/tests/test_vulkan_profiles.py @@ -78,7 +78,7 @@ def test_save_profiles_jsons(self): def test_validate_profiles_json(self): repository_path = Path(__file__).resolve().parent.parent.parent profiles_files_file = repository_path / "profiles/LunarG/VP_LUNARG_minimum_requirements.json" - profiles_schema_file = repository_path / "schema/profiles-0.8-latest.json" + profiles_schema_file = repository_path / "schema/profiles-0.9-latest.json" validated_json = validate_profiles_json(profiles_files_file, profiles_schema_file) self.assertEqual(validated_json, True) @@ -86,7 +86,7 @@ def test_validate_profiles_json(self): def test_validate_profiles_jsons(self): repository_path = Path(__file__).resolve().parent.parent.parent profiles_files_dir = repository_path / "profiles/LunarG" - profiles_schema_file = repository_path / "schema/profiles-0.8-latest.json" + profiles_schema_file = repository_path / "schema/profiles-0.9-latest.json" validated_jsons = validate_profiles_jsons(profiles_files_dir, profiles_schema_file) self.assertEqual(validated_jsons, 2)