diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 94fedbaf0..f28ec97d8 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -22,7 +22,7 @@ jobs: # We now refer to the container by its SHA instead of the name, to prevent # caching problems when updating the image. # container: khronosgroup/docker-images:asciidoctor-spec.20240726 - container: khronosgroup/docker-images@sha256:5e021da240f12121f064d2135e06320c021ac231c9ae8abbf6205b6130deb58b + container: khronosgroup/docker-images@sha256:089687083ceb36483a3917389e4278718ab19c594099634f5dd80e22540c960f steps: - uses: actions/checkout@v4 @@ -32,7 +32,7 @@ jobs: terminology-check: name: Run various checker scripts on the spec and XML sources runs-on: ubuntu-latest - container: khronosgroup/docker-images@sha256:5e021da240f12121f064d2135e06320c021ac231c9ae8abbf6205b6130deb58b + container: khronosgroup/docker-images@sha256:089687083ceb36483a3917389e4278718ab19c594099634f5dd80e22540c960f steps: - uses: actions/checkout@v4 @@ -48,7 +48,7 @@ jobs: spec-toolchain: name: Build a test spec and check against expectation, to make sure the spec toolchain works as expected runs-on: ubuntu-latest - container: khronosgroup/docker-images@sha256:5e021da240f12121f064d2135e06320c021ac231c9ae8abbf6205b6130deb58b + container: khronosgroup/docker-images@sha256:089687083ceb36483a3917389e4278718ab19c594099634f5dd80e22540c960f steps: - uses: actions/checkout@v4 @@ -57,7 +57,7 @@ jobs: spec-core: name: Build the core-only spec, to try and catch ifdef errors in extension markup runs-on: ubuntu-latest - container: khronosgroup/docker-images@sha256:5e021da240f12121f064d2135e06320c021ac231c9ae8abbf6205b6130deb58b + container: khronosgroup/docker-images@sha256:089687083ceb36483a3917389e4278718ab19c594099634f5dd80e22540c960f steps: - uses: actions/checkout@v4 @@ -66,7 +66,7 @@ jobs: spec-generate: name: Build the vulkan specification and generate any associated files (such as vulkan.h) runs-on: ubuntu-latest - container: khronosgroup/docker-images@sha256:5e021da240f12121f064d2135e06320c021ac231c9ae8abbf6205b6130deb58b + container: khronosgroup/docker-images@sha256:089687083ceb36483a3917389e4278718ab19c594099634f5dd80e22540c960f steps: - uses: actions/checkout@v4 @@ -194,7 +194,7 @@ jobs: cts-framework-tests: name: Run Vulkan CTS framework tests to validate against XML changes runs-on: ubuntu-latest - container: khronosgroup/docker-images@sha256:5e021da240f12121f064d2135e06320c021ac231c9ae8abbf6205b6130deb58b + container: khronosgroup/docker-images@sha256:089687083ceb36483a3917389e4278718ab19c594099634f5dd80e22540c960f continue-on-error: true steps: diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2db45ff7b..30cb022c8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,8 +6,8 @@ # All stages use the same Docker image, so there are no prerequisites # Refer to the container by its SHA instead of the name, to prevent # caching problems when updating the image. -# image: khronosgroup/docker-images:asciidoctor-spec.20240726 -image: khronosgroup/docker-images@sha256:5e021da240f12121f064d2135e06320c021ac231c9ae8abbf6205b6130deb58b +# image: khronosgroup/docker-images:asciidoctor-spec.20240727 +image: khronosgroup/docker-images@sha256:089687083ceb36483a3917389e4278718ab19c594099634f5dd80e22540c960f # Specify which gitlab runner to use default: diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 72d41f9b5..21beafa77 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -14,6 +14,84 @@ appears frequently in the change log. ''' +Change log for August 16, 2024 Vulkan 1.3.293 spec update: + +Public Issues + + * Fix reference to VkPhysicalDeviceLimits::maxMemoryAllocationCount in + VkMemoryAllocateInfo (public issue 2398). + * Improve vkWriteMicromapsPropertiesEXT VUs 07573 and 07574, and remove + incomplete VU 07575 (public issue 2399). + * Fix markup in vkGetPhysicalDeviceDisplayPropertiesKHR so + VkDisplayPropertiesKHR is formatted as a link (public issue 2401). + * Merge multiple equivalent require blocks in XML and add a script to + detect them (public pull request 2404). + +Internal Issues + + * Refactor and clarify a NOTE in VkSparseMemoryBind (internal issue 3938). + * Require VK_EXT_sample_locations for vkCmdSetSampleLocationsEXT in common + draw VU 06666 (internal issue 3944). + * Update `scripts/extdependency.py` to compute version dependencies, and + use this in the `makeSpec` script instead of a hardcoded list of version + tokens required for the requested API version (internal MR 6823). + * Add glossary entries for basic video coding block types (internal merge + request 6765). + * Add depthBoundsTestEnable language to the <> feature description (internal merge request 6806). + * Clarify VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT to better explain + exactly what it is disabling (internal merge request 6812). + * Fix VkLayerSettingEXT spec language and VU for VK_EXT_layer_settings + (internal merge request 6817). + * Use consistent wording to describe features including removal of + un-needed "`set to`" when referring to a value that is not being set + (internal merge request 6831). + +New Extensions + + * VK_NV_command_buffer_inheritance + +''' + +Change log for August 16, 2024 Vulkan 1.3.293 spec update: + +Public Issues + + * Fix reference to VkPhysicalDeviceLimits::maxMemoryAllocationCount in + VkMemoryAllocateInfo (public issue 2398). + * Improve vkWriteMicromapsPropertiesEXT VUs 07573 and 07574, and remove + incomplete VU 07575 (public issue 2399). + * Fix markup in vkGetPhysicalDeviceDisplayPropertiesKHR so + VkDisplayPropertiesKHR is formatted as a link (public issue 2401). + * Merge multiple equivalent require blocks in XML and add a script to + detect them (public pull request 2404). + +Internal Issues + + * Refactor and clarify a NOTE in VkSparseMemoryBind (internal issue 3938). + * Require VK_EXT_sample_locations for vkCmdSetSampleLocationsEXT in common + draw VU 06666 (internal issue 3944). + * Update `scripts/extdependency.py` to compute version dependencies, and + use this in the `makeSpec` script instead of a hardcoded list of version + tokens required for the requested API version (internal MR 6823). + * Add glossary entries for basic video coding block types (internal merge + request 6765). + * Add depthBoundsTestEnable language to the <> feature description (internal merge request 6806). + * Clarify VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT to better explain + exactly what it is disabling (internal merge request 6812). + * Fix VkLayerSettingEXT spec language and VU for VK_EXT_layer_settings + (internal merge request 6817). + * Use consistent wording to describe features including removal of + un-needed "`set to`" when referring to a value that is not being set + (internal merge request 6831). + +New Extensions + + * VK_NV_command_buffer_inheritance + +''' + Change log for July 26, 2024 Vulkan 1.3.292 spec update: Internal Issues diff --git a/Makefile b/Makefile index eec39d659..2f73da81f 100644 --- a/Makefile +++ b/Makefile @@ -139,7 +139,7 @@ VERBOSE = # ADOCOPTS options for asciidoc->HTML5 output NOTEOPTS = -a editing-notes -a implementation-guide -PATCHVERSION = 292 +PATCHVERSION = 293 BASEOPTS = ifneq (,$(findstring VKSC_VERSION_1_0,$(VERSIONS))) diff --git a/appendices/VK_EXT_layer_settings.adoc b/appendices/VK_EXT_layer_settings.adoc index dab4ea705..ccd9a4b51 100644 --- a/appendices/VK_EXT_layer_settings.adoc +++ b/appendices/VK_EXT_layer_settings.adoc @@ -36,9 +36,19 @@ flink:vkCreateInstance. The structure contains an array of slink:VkLayerSettingEXT structure values that configure specific features of layers. +[NOTE] +==== +The `apiext:VK_EXT_layer_settings` extension subsumes all the functionality +provided in the `apiext:VK_EXT_validation_flags` extension and the +`apiext:VK_EXT_validation_features` extension. +==== + +include::{generated}/interfaces/VK_EXT_layer_settings.adoc[] + === Example -`VK_EXT_layer_settings` is implemented by the Vulkan Profiles layer. +One example usage of `VK_EXT_layer_settings` is as implemented by the Vulkan +Profiles layer. It allows the profiles layer tests used by the profiles layer C.I. to programmatically configure the layer for each test without affecting the @@ -85,14 +95,6 @@ inst_create_info.pNext = &layer_settings_create_info; vkCreateInstance(&inst_create_info, nullptr, &_instances); ---- -[NOTE] -==== -The `apiext:VK_EXT_layer_settings` extension subsumes all the functionality -provided in the `apiext:VK_EXT_validation_flags` extension and the -`apiext:VK_EXT_validation_features` extension. -==== - -include::{generated}/interfaces/VK_EXT_layer_settings.adoc[] === Issues diff --git a/appendices/VK_NV_command_buffer_inheritance.adoc b/appendices/VK_NV_command_buffer_inheritance.adoc new file mode 100644 index 000000000..c96c3aefd --- /dev/null +++ b/appendices/VK_NV_command_buffer_inheritance.adoc @@ -0,0 +1,62 @@ +// Copyright 2024 The Khronos Group Inc. +// +// SPDX-License-Identifier: CC-BY-4.0 + +include::{generated}/meta/{refprefix}VK_NV_command_buffer_inheritance.adoc[] +=== Other Extension Metadata + +*Last Modified Date*:: + 2024-02-15 +*IP Status*:: + No known IP claims. +*Contributors*:: + - Piers Daniell, NVIDIA + - Daniel Story, Nintendo + +=== Description + +This extension allows applications to take advantage of the graphics and +compute state that remains valid in the queue between executions of +submitted command buffers. +This works across both primary and secondary command buffers. + +The state inherited includes the previously bound pipeline state, previously +bound shader objects, previously bound vertex and index buffers, previously +bound descriptor sets and push constants, and all previously set dynamic +state. + +This extension relaxes the requirement that all that state needs to be bound +and set after begin command buffer and before the next draw or dispatch. + +By not having to set state that has been inherited applications can save +both CPU and GPU cycles by not having to set state redundantly, and also +have improved flexibility when reusing secondary command buffers. + +include::{generated}/interfaces/VK_NV_command_buffer_inheritance.adoc[] + +=== Issues + +1) How can the validation layer know when state is valid at draw or dispatch +time if it is inherited at execution time? + +*RESOLVED*: Validation of invalid state at draw and dispatch time cannot be +done while recording those commands. +Instead the validation layer will need to keep track of any unset state when +draw and dispatch commands are recorded, but not report an error at that +time. +It should also keep track of what state is valid at the end of each recorded +command buffer. +When secondary command buffer execution is recorded the validation layer can +update its unset state tracking for that command buffer, and also for draw +and dispatch commands recorded after execution of the secondary as they will +inherit state from the executed secondary. +This can be done recursively so every recorded primary command buffer has a +final tally of any unset state used at draw and dispatch time. +Finally when the primary is submitted to the queue the validation layer will +know the previous primaries submitted to the queue and will know if there is +any unset state used and can report the error then. + +=== Version History + + * Revision 1, 2024-02-15 (Lujin Wang) + ** Internal revisions diff --git a/appendices/glossary.adoc b/appendices/glossary.adoc index 178b5dc1c..6cf84878d 100644 --- a/appendices/glossary.adoc +++ b/appendices/glossary.adoc @@ -217,6 +217,19 @@ Clip Distance:: Clip Volume:: The intersection of the view volume with all clip half-spaces. +ifdef::VK_KHR_video_queue[] +Coding Block (Video):: + An element of a video picture, comprising a rectangular block of texel + values that are coded as a single unit in video coding. + Video coding blocks have a corresponding coding block size (width and + height) defining the dimensions of these elements in units of texels. + These dimensions are usually codec-specific and a single video + compression standard may: support more than one coding block type and + size. + Video compression standards may: use multiple coding block types to + organize coding blocks of different kinds and sizes into hierarchies. +endif::VK_KHR_video_queue[] + Color Attachment:: A subpass attachment point, or image view, that is the target of fragment color outputs and blending. @@ -1016,11 +1029,28 @@ Instance (Resource):: Each such replicated resource is an instance of the resource. endif::VK_VERSION_1_1,VK_KHR_device_group[] +ifdef::VK_KHR_video_queue[] +Inter Block (Video):: + A video coding block that uses inter prediction. + +Inter Prediction (Video):: + Sample prediction derived from reference picture samples or metadata. +endif::VK_KHR_video_queue[] + Internal Synchronization:: A type of synchronization required: of the implementation, where parameters not defined to be externally synchronized may: require internal mutexing to avoid multithreaded race conditions. +ifdef::VK_KHR_video_queue[] +Intra Block (Video):: + A video coding block that only uses intra prediction. + +Intra Prediction (Video):: + Sample prediction that is not derived from reference picture samples or + metadata. +endif::VK_KHR_video_queue[] + Invocation (Shader):: A single execution of an entry point in a SPIR-V module. For example, a single vertex's execution of a vertex shader or a single @@ -1303,6 +1333,15 @@ Physical-Device-Level Object:: Physical device objects. For example, slink:VkPhysicalDevice is a physical-device-level object. +ifdef::VK_KHR_video_queue[] +Picture Partition (Video):: + Collective term that refers to a subregion of a video picture resource + that may: be decoded or encoded independently according to the + partitioning scheme defined in the corresponding video compression + standard. + Picture partitions may: be non-rectangular. +endif::VK_KHR_video_queue[] + Pipeline:: An object controlling how graphics or compute work is executed on the device. diff --git a/chapters/VK_EXT_layer_settings.adoc b/chapters/VK_EXT_layer_settings.adoc index c19d40a2b..be7e57d61 100644 --- a/chapters/VK_EXT_layer_settings.adoc +++ b/chapters/VK_EXT_layer_settings.adoc @@ -16,7 +16,7 @@ include::{generated}/api/structs/VkLayerSettingsCreateInfoEXT.adoc[] structure. * pname:settingCount is the number of settings to configure. * pname:pSettings is a pointer to an array of pname:settingCount - slink:VkLayerSettingEXT values specifying the setting to be configured. + slink:VkLayerSettingEXT values specifying the settings to be configured. include::{generated}/validity/structs/VkLayerSettingsCreateInfoEXT.adoc[] -- @@ -33,17 +33,26 @@ include::{generated}/api/structs/VkLayerSettingEXT.adoc[] the layer to configure the setting from. * pname:pSettingName is a pointer to a null-terminated UTF-8 string naming the setting to configure. - Unknown pname:pSettingName by the layer are ignored. + Values of pname:pSettingName that are unknown to the layer are ignored. * pname:type is a elink:VkLayerSettingTypeEXT value specifying the type of the pname:pValues values. - * pname:count is the number of values used to configure the layer setting. - * pname:pValues is a pointer to an array of pname:count values of the type - indicated by pname:type to configure the layer setting. + * pname:valueCount is the number of values used to configure the layer + setting. + * pname:pValues is a pointer to an array of pname:valueCount values of the + type indicated by pname:type to configure the layer setting. When multiple slink:VkLayerSettingsCreateInfoEXT structures are chained and the same pname:pSettingName is referenced for the same pname:pLayerName, the value of the first reference of the layer setting is used. +.Valid Usage +**** + * [[VUID-VkLayerSettingEXT-valueCount-10070]] + If pname:valueCount is not `0`, pname:pValues must: be a valid pointer + to an array of pname:valueCount values of the type indicated by + pname:type +**** + include::{generated}/validity/structs/VkLayerSettingEXT.adoc[] -- diff --git a/chapters/VK_EXT_opacity_micromap/micromaps.adoc b/chapters/VK_EXT_opacity_micromap/micromaps.adoc index d077cf7ae..a28a898c1 100644 --- a/chapters/VK_EXT_opacity_micromap/micromaps.adoc +++ b/chapters/VK_EXT_opacity_micromap/micromaps.adoc @@ -1068,16 +1068,16 @@ flink:vkCmdWriteMicromapsPropertiesEXT but is executed by the host. .Valid Usage **** include::{chapters}/commonvalidity/write_micromap_properties_common.adoc[] - * [[VUID-vkWriteMicromapsPropertiesEXT-queryType-07573]] + * [[VUID-vkWriteMicromapsPropertiesEXT-queryType-10071]] If pname:queryType is - ename:VK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT, then pname:stride - must: be a multiple of the size of basetype:VkDeviceSize - * [[VUID-vkWriteMicromapsPropertiesEXT-queryType-07574]] - If pname:queryType is - ename:VK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT, then pname:pData - must: point to a basetype:VkDeviceSize - * [[VUID-vkWriteMicromapsPropertiesEXT-queryType-07575]] + ename:VK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT or + ename:VK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT then pname:stride must: + be a multiple of the size of basetype:VkDeviceSize + * [[VUID-vkWriteMicromapsPropertiesEXT-queryType-10072]] If pname:queryType is + ename:VK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT or + ename:VK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT then pname:pData must: + point to a basetype:VkDeviceSize * [[VUID-vkWriteMicromapsPropertiesEXT-dataSize-07576]] pname:dataSize must: be greater than or equal to [eq]#pname:micromapCount*pname:stride# diff --git a/chapters/VK_EXT_validation_features.adoc b/chapters/VK_EXT_validation_features.adoc index 825cfad7f..085583fb9 100644 --- a/chapters/VK_EXT_validation_features.adoc +++ b/chapters/VK_EXT_validation_features.adoc @@ -92,7 +92,12 @@ include::{generated}/api/enums/VkValidationFeatureDisableEXT.adoc[] * ename:VK_VALIDATION_FEATURE_DISABLE_ALL_EXT specifies that all validation checks are disabled. * ename:VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT specifies that shader - validation is disabled. + validation, both runtime and standalone, is disabled. + This validation occurs inside +ifdef::VK_EXT_shader_object[] + slink:VkShaderCreateInfoEXT and +endif::VK_EXT_shader_object[] + slink:VkShaderModuleCreateInfo. This feature is enabled by default. * ename:VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT specifies that thread safety validation is disabled. @@ -106,8 +111,8 @@ include::{generated}/api/enums/VkValidationFeatureDisableEXT.adoc[] * ename:VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT specifies that core validation checks are disabled. This feature is enabled by default. - If this feature is disabled, the shader validation and GPU-assisted - validation features are also disabled. + If this feature is disabled, + ename:VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT is implied. * ename:VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT specifies that protection against duplicate non-dispatchable object handles is disabled. diff --git a/chapters/VK_KHR_display/display.adoc b/chapters/VK_KHR_display/display.adoc index 86d554c48..04b702454 100644 --- a/chapters/VK_KHR_display/display.adoc +++ b/chapters/VK_KHR_display/display.adoc @@ -37,7 +37,7 @@ include::{generated}/api/protos/vkGetPhysicalDeviceDisplayPropertiesKHR.adoc[] * pname:pPropertyCount is a pointer to an integer related to the number of display devices available or queried, as described below. * pname:pProperties is either `NULL` or a pointer to an array of - sname:VkDisplayPropertiesKHR structures. + slink:VkDisplayPropertiesKHR structures. If pname:pProperties is `NULL`, then the number of display devices available for pname:physicalDevice is returned in pname:pPropertyCount. diff --git a/chapters/cmdbuffers.adoc b/chapters/cmdbuffers.adoc index 1e13bc7f1..85edae26e 100644 --- a/chapters/cmdbuffers.adoc +++ b/chapters/cmdbuffers.adoc @@ -1168,6 +1168,20 @@ ename:VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT not set. After the implicit reset, pname:commandBuffer is moved to the <>. +ifdef::VK_NV_command_buffer_inheritance[] +If the <> +feature is enabled, all graphics and compute state including bound pipeline +state, bound shader objects, bound vertex and index buffers, bound +descriptor sets and push constants, and all previously set dynamic state is +inherited by the secondary command buffer from the primary or secondary +command buffer that executes it. +Furthermore, all of the state set by this secondary command buffer is +inherited back to the primary or secondard command buffer that executes it. +If the <> +feature is not enabled there is a limited amount of inheritance of state +into the secondary command buffer as specified below. +endif::VK_NV_command_buffer_inheritance[] + ifdef::VK_EXT_conditional_rendering[] [open,refpage='VkCommandBufferInheritanceConditionalRenderingInfoEXT',desc='Structure specifying command buffer inheritance information',type='structs'] -- diff --git a/chapters/commonvalidity/draw_common.adoc b/chapters/commonvalidity/draw_common.adoc index 8de9a5244..7ada12d64 100644 --- a/chapters/commonvalidity/draw_common.adoc +++ b/chapters/commonvalidity/draw_common.adoc @@ -329,7 +329,7 @@ ifdef::VK_EXT_sample_locations[] attachment, then that attachment must: have been created with the ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set * [[VUID-{refpage}-None-06666]] - If + If the `apiext:VK_EXT_sample_locations` extension is enabled, ifdef::VK_EXT_shader_object[] a shader object is bound to any graphics stage or endif::VK_EXT_shader_object[] diff --git a/chapters/commonvalidity/draw_vertex_binding.adoc b/chapters/commonvalidity/draw_vertex_binding.adoc index e75fd5fb8..f21c28007 100644 --- a/chapters/commonvalidity/draw_vertex_binding.adoc +++ b/chapters/commonvalidity/draw_vertex_binding.adoc @@ -215,7 +215,7 @@ ifdef::VK_EXT_extended_dynamic_state2[] the bound graphics pipeline state was created with the ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE dynamic state enabled endif::VK_EXT_extended_dynamic_state2[] - then flink:vkCmdSetPrimitiveRestartEnable must: be set to ename:VK_FALSE + then flink:vkCmdSetPrimitiveRestartEnable must: be ename:VK_FALSE endif::VK_VERSION_1_3,VK_EXT_extended_dynamic_state2,VK_EXT_shader_object[] ifdef::VK_NV_mesh_shader,VK_EXT_mesh_shader[] * [[VUID-{refpage}-stage-06481]] diff --git a/chapters/features.adoc b/chapters/features.adoc index af6bee646..15e9c2a5b 100644 --- a/chapters/features.adoc +++ b/chapters/features.adoc @@ -448,7 +448,7 @@ endif::VK_EXT_pipeline_robustness[] * [[features-multiDrawIndirect]] pname:multiDrawIndirect specifies whether multiple draw indirect is supported. If this feature is not enabled, the pname:drawCount parameter to the - fname:vkCmdDrawIndirect and fname:vkCmdDrawIndexedIndirect commands + flink:vkCmdDrawIndirect and flink:vkCmdDrawIndexedIndirect commands must: be 0 or 1. The pname:maxDrawIndirectCount member of the sname:VkPhysicalDeviceLimits structure must: also be 1 if this feature @@ -459,12 +459,12 @@ endif::VK_EXT_pipeline_robustness[] parameter. If this feature is not enabled, the pname:firstInstance member of all sname:VkDrawIndirectCommand and sname:VkDrawIndexedIndirectCommand - structures that are provided to the fname:vkCmdDrawIndirect and - fname:vkCmdDrawIndexedIndirect commands must: be 0. + structures that are provided to the flink:vkCmdDrawIndirect and + flink:vkCmdDrawIndexedIndirect commands must: be 0. * [[features-depthClamp]] pname:depthClamp specifies whether depth clamping is supported. If this feature is not enabled, the pname:depthClampEnable member of the - slink:VkPipelineRasterizationStateCreateInfo structure must: be set to + slink:VkPipelineRasterizationStateCreateInfo structure must: be ename:VK_FALSE. Otherwise, setting pname:depthClampEnable to ename:VK_TRUE will enable depth clamping. @@ -473,8 +473,8 @@ endif::VK_EXT_pipeline_robustness[] If this feature is not enabled, the pname:depthBiasClamp member of the slink:VkPipelineRasterizationStateCreateInfo structure must: be set to 0.0 unless the ename:VK_DYNAMIC_STATE_DEPTH_BIAS dynamic state is - enabled, and the pname:depthBiasClamp parameter to - fname:vkCmdSetDepthBias must: be set to 0.0. + enabled, in which case the pname:depthBiasClamp parameter to + flink:vkCmdSetDepthBias must: be set to 0.0. * [[features-fillModeNonSolid]] pname:fillModeNonSolid specifies whether point and wireframe fill modes are supported. If this feature is not enabled, the ename:VK_POLYGON_MODE_POINT and @@ -483,8 +483,11 @@ endif::VK_EXT_pipeline_robustness[] bounds tests are supported. If this feature is not enabled, the pname:depthBoundsTestEnable member of the slink:VkPipelineDepthStencilStateCreateInfo structure must: be - set to ename:VK_FALSE. - When pname:depthBoundsTestEnable is set to ename:VK_FALSE, the + ename:VK_FALSE unless the + ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE dynamic state is + enabled, in which case the pname:depthBoundsTestEnable parameter to + flink:vkCmdSetDepthBoundsTestEnable must: be ename:VK_FALSE. + When pname:depthBoundsTestEnable is ename:VK_FALSE, the pname:minDepthBounds and pname:maxDepthBounds members of the slink:VkPipelineDepthStencilStateCreateInfo structure are ignored. * [[features-wideLines]] pname:wideLines specifies whether lines with @@ -492,8 +495,8 @@ endif::VK_EXT_pipeline_robustness[] If this feature is not enabled, the pname:lineWidth member of the slink:VkPipelineRasterizationStateCreateInfo structure must: be set to 1.0 unless the ename:VK_DYNAMIC_STATE_LINE_WIDTH dynamic state is - enabled, and the pname:lineWidth parameter to fname:vkCmdSetLineWidth - must: be set to 1.0. + enabled, in which case the pname:lineWidth parameter to + flink:vkCmdSetLineWidth must: be set to 1.0. When this feature is supported, the range and granularity of supported line widths are indicated by the pname:lineWidthRange and pname:lineWidthGranularity members of the sname:VkPhysicalDeviceLimits @@ -510,8 +513,8 @@ endif::VK_EXT_pipeline_robustness[] color output in the <> fragment operation. If this feature is not enabled, then the pname:alphaToOneEnable member - of the slink:VkPipelineMultisampleStateCreateInfo structure must: be set - to ename:VK_FALSE. + of the slink:VkPipelineMultisampleStateCreateInfo structure must: be + ename:VK_FALSE. Otherwise setting pname:alphaToOneEnable to ename:VK_TRUE will enable alpha-to-one behavior. * [[features-multiViewport]] pname:multiViewport specifies whether more @@ -520,15 +523,15 @@ endif::VK_EXT_pipeline_robustness[] ** The pname:viewportCount and pname:scissorCount members of the slink:VkPipelineViewportStateCreateInfo structure must: be set to 1. ** The pname:firstViewport and pname:viewportCount parameters to the - fname:vkCmdSetViewport command must: be set to 0 and 1, respectively. + flink:vkCmdSetViewport command must: be set to 0 and 1, respectively. ** The pname:firstScissor and pname:scissorCount parameters to the - fname:vkCmdSetScissor command must: be set to 0 and 1, respectively. + flink:vkCmdSetScissor command must: be set to 0 and 1, respectively. ifdef::VK_NV_scissor_exclusive[] ** The pname:exclusiveScissorCount member of the slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV structure must: be set to 0 or 1. ** The pname:firstExclusiveScissor and pname:exclusiveScissorCount - parameters to the fname:vkCmdSetExclusiveScissorNV command must: be set + parameters to the flink:vkCmdSetExclusiveScissorNV command must: be set to 0 and 1, respectively. endif::VK_NV_scissor_exclusive[] * [[features-samplerAnisotropy]] pname:samplerAnisotropy specifies whether @@ -638,10 +641,10 @@ supported properties of individual formats as normal. Occlusion queries are created in a sname:VkQueryPool by specifying the pname:queryType of ename:VK_QUERY_TYPE_OCCLUSION in the slink:VkQueryPoolCreateInfo structure which is passed to - fname:vkCreateQueryPool. + flink:vkCreateQueryPool. If this feature is enabled, queries of this type can: enable ename:VK_QUERY_CONTROL_PRECISE_BIT in the pname:flags parameter to - fname:vkCmdBeginQuery. + flink:vkCmdBeginQuery. If this feature is not supported, the implementation supports only boolean occlusion queries. When any samples are passed, boolean queries will return a non-zero @@ -878,8 +881,8 @@ ifdef::VKSC_VERSION_1_0[This must: be ename:VK_FALSE in Vulkan SC <>.] resource memory can: be managed at opaque sparse block level instead of at the object level. If this feature is not enabled, resource memory must: be bound only on a - per-object basis using the fname:vkBindBufferMemory and - fname:vkBindImageMemory commands. + per-object basis using the flink:vkBindBufferMemory and + flink:vkBindImageMemory commands. In this case, buffers and images must: not be created with ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT and ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT set in the pname:flags member @@ -7713,6 +7716,30 @@ include::{generated}/validity/structs/VkPhysicalDeviceRawAccessChainsFeaturesNV. -- endif::VK_NV_raw_access_chains[] +ifdef::VK_NV_command_buffer_inheritance[] +[open,refpage='VkPhysicalDeviceCommandBufferInheritanceFeaturesNV',desc='Structure describing whether the command buffer inheritance feature is supported by an implementation',type='structs'] +-- +The sname:VkPhysicalDeviceCommandBufferInheritanceFeaturesNV structure is +defined as: + +include::{generated}/api/structs/VkPhysicalDeviceCommandBufferInheritanceFeaturesNV.adoc[] + +This structure describes the following feature: + + * pname:sType is a elink:VkStructureType value identifying this structure. + * pname:pNext is `NULL` or a pointer to a structure extending this + structure. + * [[features-commandBufferInheritance]] pname:commandBufferInheritance + indicates that command buffers executed in a queue inherit graphics and + compute state from the previously executed command buffer in that queue. + +:refpage: VkPhysicalDeviceCommandBufferInheritanceFeaturesNV +include::{chapters}/features.adoc[tag=features] + +include::{generated}/validity/structs/VkPhysicalDeviceCommandBufferInheritanceFeaturesNV.adoc[] +-- +endif::VK_NV_command_buffer_inheritance[] + ifdef::VK_MESA_image_alignment_control[] [open,refpage='VkPhysicalDeviceImageAlignmentControlFeaturesMESA', desc='Structure describing features supported by VK_MESA_image_alignment_control',type='structs'] -- @@ -8715,6 +8742,10 @@ ifdef::VK_NV_raw_access_chains[] * <>, if the `apiext:VK_NV_raw_access_chains` extension is supported. endif::VK_NV_raw_access_chains[] +ifdef::VK_NV_command_buffer_inheritance[] + * <>, + if the `apiext:VK_NV_command_buffer_inheritance` extension is supported. +endif::VK_NV_command_buffer_inheritance[] ifdef::VK_EXT_custom_border_color[] * <>, if the `apiext:VK_EXT_custom_border_color` extension is supported. diff --git a/chapters/memory.adoc b/chapters/memory.adoc index 852e54d1f..e01b5448a 100644 --- a/chapters/memory.adoc +++ b/chapters/memory.adoc @@ -1280,12 +1280,10 @@ objects whenever possible. ==== Importing memory must: not increase overall heap usage within a system. -ifdef::VK_VERSION_1_1,VK_KHR_maintenance3,VK_EXT_memory_budget[] However, it must: affect the following per-process values: -ifdef::VK_VERSION_1_1,VK_KHR_maintenance3[] - * slink:VkPhysicalDeviceMaintenance3Properties::pname:maxMemoryAllocationCount -endif::VK_VERSION_1_1,VK_KHR_maintenance3[] + * slink:VkPhysicalDeviceLimits::pname:maxMemoryAllocationCount +ifdef::VK_VERSION_1_1,VK_KHR_maintenance3,VK_EXT_memory_budget[] ifdef::VK_EXT_memory_budget[] * slink:VkPhysicalDeviceMemoryBudgetPropertiesEXT::pname:heapUsage endif::VK_EXT_memory_budget[] diff --git a/chapters/pipelines.adoc b/chapters/pipelines.adoc index 72408728e..e6fda6d60 100644 --- a/chapters/pipelines.adoc +++ b/chapters/pipelines.adoc @@ -115,9 +115,30 @@ Any pipeline object state that is specified as <> is not applied to the current state when the pipeline object is bound, but is instead set by dynamic state setting commands. -No state, including dynamic state, is inherited from one command buffer to +ifdef::VK_NV_command_buffer_inheritance[] +If the <> +feature is not enabled, then no +endif::VK_NV_command_buffer_inheritance[] +ifndef::VK_NV_command_buffer_inheritance[] +No +endif::VK_NV_command_buffer_inheritance[] +state, including dynamic state, is inherited from one command buffer to another. +ifdef::VK_NV_command_buffer_inheritance[] +If the <> +feature is enabled, then all graphics and compute state that is valid at the +end of the command buffer executed in a queue is inherited and valid at +beginning of the command buffer next executed in the same queue. +This applies to both primary and secondary command buffers, where a primary +command buffer submitted to a queue will inherit state from the previously +submitted command buffer to that queue, secondary command buffers will +inherit state from the primary or seconard command buffer they are executed +in, and after a seconard command buffer is executed, its state inherited by +the primary or secondary command buffer that executed it. +Command buffers executed in one queue do not inherit state from any command +buffers executed in another queue. +endif::VK_NV_command_buffer_inheritance[] [open,refpage='VkPipeline',desc='Opaque handle to a pipeline object',type='handles'] -- @@ -8572,6 +8593,15 @@ lifetime of the command buffer, or until modified by another dynamic state setting command, or made invalid by binding a pipeline in which that state is statically specified. +ifdef::VK_NV_command_buffer_inheritance[] +If the <> +feature is enabled, all valid state from the previously executed command +buffer in the queue is inherited into the next command buffer executed in +the same queue. +This inherited state does not need to be set again before draw or dispatch +commands. +endif::VK_NV_command_buffer_inheritance[] + [[dynamic-state-current-value]] When a pipeline object is bound, the following applies to each state parameter: diff --git a/chapters/renderpass.adoc b/chapters/renderpass.adoc index 915be3a17..7cdde883b 100644 --- a/chapters/renderpass.adoc +++ b/chapters/renderpass.adoc @@ -7419,7 +7419,7 @@ be in ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL (or equivalent), and the stencil write mask must: be set to 0. Similarly to read from depth while writing stencil, the attachment must: be in ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL (or -equivalent), and depth write enable must: be set to ename:VK_FALSE. +equivalent), and depth write enable must: be ename:VK_FALSE. endif::VK_KHR_maintenance2[] diff --git a/chapters/shaders.adoc b/chapters/shaders.adoc index 81d9dc6cd..a12c39610 100644 --- a/chapters/shaders.adoc +++ b/chapters/shaders.adoc @@ -1192,6 +1192,13 @@ State can: be set either at any time before or after shader objects are bound, but all required state must: be set prior to issuing drawing commands. +ifdef::VK_NV_command_buffer_inheritance[] +If the <> +feature is enabled, graphics and compute state is inherited from the +previously executed command buffer in the queue. +Any valid state inherited in this way does not need to be set again in the +current command buffer. +endif::VK_NV_command_buffer_inheritance[] [[shaders-objects-pipeline-interaction]] === Interaction With Pipelines diff --git a/chapters/sparsemem.adoc b/chapters/sparsemem.adoc index 7d89dc49f..7c86eaa88 100644 --- a/chapters/sparsemem.adoc +++ b/chapters/sparsemem.adoc @@ -1520,29 +1520,17 @@ include::{generated}/api/structs/VkSparseImageOpaqueMemoryBindInfo.adoc[] * pname:pBinds is a pointer to an array of slink:VkSparseMemoryBind structures. -.Valid Usage -**** - * [[VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-01103]] - If the pname:flags member of any element of pname:pBinds contains - ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the binding range defined - must: be within the mip tail region of the metadata aspect of - pname:image -**** - -include::{generated}/validity/structs/VkSparseImageOpaqueMemoryBindInfo.adoc[] --- - [NOTE] ==== -This operation is normally used to bind memory to fully-resident sparse +This structure is normally used to bind memory to fully-resident sparse images or for mip tail regions of partially resident images. However, it can: also be used to bind memory for the entire binding range of partially resident images. -In case pname:flags does not contain -ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the pname:resourceOffset is in the -range [eq]#[0, slink:VkMemoryRequirements::pname:size)#, This range includes -data from all aspects of the image, including metadata. +If the pname:pBinds[i].flags of an element _i_ of pname:pBinds does not +contain ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the pname:resourceOffset +is in the range [eq]#[0, slink:VkMemoryRequirements::pname:size)#, This +range includes data from all aspects of the image, including metadata. For most implementations this will probably mean that the pname:resourceOffset is a simple device address offset within the resource. It is possible for an application to bind a range of memory that includes @@ -1550,9 +1538,9 @@ both resource data and metadata. However, the application would not know what part of the image the memory is used for, or if any range is being used for metadata. -When pname:flags contains ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the -binding range specified must: be within the mip tail region of the metadata -aspect. +If the pname:pBinds[i].flags of an element _i_ of pname:pBinds contains +ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the binding range specified must: +be within the mip tail region of the metadata aspect. In this case the pname:resourceOffset is not required: to be a simple device address offset within the resource. However, it _is_ defined to be within [eq]#[pname:imageMipTailOffset, @@ -1562,6 +1550,18 @@ See slink:VkSparseMemoryBind for the full constraints on binding region with this flag present. ==== +.Valid Usage +**** + * [[VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-01103]] + If the pname:flags member of any element of pname:pBinds contains + ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the binding range defined + must: be within the mip tail region of the metadata aspect of + pname:image +**** + +include::{generated}/validity/structs/VkSparseImageOpaqueMemoryBindInfo.adoc[] +-- + [open,refpage='VkSparseImageMemoryBindInfo',desc='Structure specifying sparse image memory bind information',type='structs'] -- Memory can: be bound to sparse image blocks of sname:VkImage objects created diff --git a/chapters/video/encode.adoc b/chapters/video/encode.adoc index e6d1f194e..3bbfe2f58 100644 --- a/chapters/video/encode.adoc +++ b/chapters/video/encode.adoc @@ -231,8 +231,8 @@ include::{generated}/api/structs/VkVideoEncodeCapabilitiesKHR.adoc[] Implementations must: support at least one quality level. * pname:encodeInputPictureGranularity indicates the granularity at which <> data is encoded and may: - indicate a texel granularity up to the size of the codec-specific coding - block size. + indicate a texel granularity up to the size of the largest supported + codec-specific coding block. This capability does not impose any valid usage constraints on the application, however, depending on the contents of the encode input picture, it may: have effects on the encoded bitstream, as described in diff --git a/chapters/video/h264_encode.adoc b/chapters/video/h264_encode.adoc index e3e68c6b1..648f8d9ce 100644 --- a/chapters/video/h264_encode.adoc +++ b/chapters/video/h264_encode.adoc @@ -175,6 +175,9 @@ reference picture data for sample prediction). H.264 pictures are partitioned into slices, as defined in section 6.3 of the <>. +For the purposes of this specification, the H.264 slices comprising a +picture are referred to as the _picture partitions_ of the picture. + Video encode operations using an <> can: encode slices of different types, as defined in section 7.4.3 of the <>, by specifying the @@ -219,6 +222,13 @@ enumeration type code:StdVideoH264PictureType: frame_. +[[encode-h264-coding-blocks]] +=== H.264 Coding Blocks + +H.264 encode supports a single type of coding block called a _macroblock_, +as defined in section 3.84 of the <>. + + [[encode-h264-profile]] === H.264 Encode Profile @@ -764,7 +774,7 @@ parameter data to the output buffer in the following order: .Valid Usage **** * [[VUID-VkVideoEncodeH264SessionParametersGetInfoKHR-writeStdSPS-08279]] - At least one of pname:writeStdSPS and pname:writeStdPPS must: be set to + At least one of pname:writeStdSPS and pname:writeStdPPS must: be ename:VK_TRUE **** diff --git a/chapters/video/h265_encode.adoc b/chapters/video/h265_encode.adoc index 570326352..ff4cac38c 100644 --- a/chapters/video/h265_encode.adoc +++ b/chapters/video/h265_encode.adoc @@ -171,6 +171,9 @@ reference picture data for sample prediction). H.265 pictures consist of one or more slices, slice segments, and tiles, as defined in section 6.3.1 of the <>. +For the purposes of this specification, the H.265 slice segments comprising +a picture are referred to as the _picture partitions_ of the picture. + Video encode operations using an <> can: encode slice segments of different types, as defined in section 7.4.7.1 of the <>, by @@ -215,6 +218,17 @@ enumeration type code:StdVideoH265PictureType: frame_. +[[encode-h265-coding-blocks]] +=== H.265 Coding Blocks + +H.265 encode supports two types of coding blocks: + + * _Coding tree unit_, as defined in section 3.35 of the <>. + * _Coding unit_, as defined in section 3.36 of the <>. + + [[encode-h265-profile]] === H.265 Encode Profile @@ -872,7 +886,7 @@ parameter data to the output buffer in the following order: **** * [[VUID-VkVideoEncodeH265SessionParametersGetInfoKHR-writeStdVPS-08290]] At least one of pname:writeStdVPS, pname:writeStdSPS, and - pname:writeStdPPS must: be set to ename:VK_TRUE + pname:writeStdPPS must: be ename:VK_TRUE **** include::{generated}/validity/structs/VkVideoEncodeH265SessionParametersGetInfoKHR.adoc[] diff --git a/makeSpec b/makeSpec index a9d6e5484..260f0f2ab 100755 --- a/makeSpec +++ b/makeSpec @@ -78,16 +78,26 @@ if __name__ == '__main__': deps = ApiDependencies(results.registry, results.apiname) # List of versions to build with from the requested -version - # This should come from the extdependency module as well, eventually - #@ Note that at present, building sc1.0 does *not* include Vulkan 1.3 automatically. + # This is constructed from the XML version dependencies versionDict = { '1.0' : [ 'VK_VERSION_1_0' ], - '1.1' : [ 'VK_VERSION_1_0', 'VK_VERSION_1_1' ], - '1.2' : [ 'VK_VERSION_1_0', 'VK_VERSION_1_1', 'VK_VERSION_1_2' ], - '1.3' : [ 'VK_VERSION_1_0', 'VK_VERSION_1_1', 'VK_VERSION_1_2', 'VK_VERSION_1_3' ], - 'sc1.0' : [ 'VK_VERSION_1_0', 'VK_VERSION_1_1', 'VK_VERSION_1_2', 'VKSC_VERSION_1_0' ], + '1.1' : [ 'VK_VERSION_1_1' ], + '1.2' : [ 'VK_VERSION_1_2' ], + '1.3' : [ 'VK_VERSION_1_3' ], + 'sc1.0' : [ 'VKSC_VERSION_1_0' ], } - versions = 'VERSIONS={}'.format(' '.join(versionDict[results.version])) + depversions = set() + reqVer = versionDict[results.version][0] + if reqVer in deps.allVersions(): + depversions.add(reqVer) + for dep in deps.versionChildren(reqVer): + if dep in deps.allVersions(): + depversions.update({dep}) + else: + apitype = f'default apiname' if results.apiname is None else f'requested apiname {results.apiname}' + raise Exception(f'ERROR: unknown version {results.version} for {apitype}') + + versions = 'VERSIONS={}'.format(' '.join(sorted(depversions))) # List of extensions to build with from the requested -spec # Also construct a spec title diff --git a/scripts/extdependency.py b/scripts/extdependency.py index 69dbec3cc..3d274cf59 100755 --- a/scripts/extdependency.py +++ b/scripts/extdependency.py @@ -107,10 +107,25 @@ def __init__(self, self.allExts = set() self.khrExts = set() self.ratifiedExts = set() + self.versions = set() self.graph = DiGraph() self.extensions = {} self.tree = etree.parse(registry_path) + # Loop over all supported features (versions) + for elem in self.tree.findall('feature'): + name = elem.get('name') + api = elem.get('api') + + if api_name in api.split(','): + self.versions.add(name) + + self.graph.add_node(name) + depends = elem.get('depends') + if depends: + for dep in dependencyNames(depends): + self.graph.add_edge(name, dep) + # Loop over all supported extensions, creating a digraph of the # extension dependencies in the 'depends' attribute, which is a # boolean expression of core version and extension names. @@ -163,6 +178,10 @@ def ratifiedExtensions(self): """Returns a set of all ratified extensions in the graph""" return self.ratifiedExts + def allVersions(self): + """Returns a set of all versions in the graph""" + return self.versions + def children(self, extension): """Returns a set of the dependencies of an extension. Throws an exception if the extension is not in the graph.""" @@ -172,6 +191,15 @@ def children(self, extension): return set(self.graph.descendants(extension)) + def versionChildren(self, version): + """Returns a set of the dependencies of a version. + Throws an exception if the version is not in the graph.""" + + if version not in self.versions: + raise Exception(f'Version {version} not found in XML!') + + return set(self.graph.descendants(version)) + # Test script if __name__ == '__main__': diff --git a/xml/registry.rnc b/xml/registry.rnc index 99daa47ba..2821a301d 100644 --- a/xml/registry.rnc +++ b/xml/registry.rnc @@ -641,7 +641,7 @@ SyncPipeline = element syncpipeline { # extend - descriptive name of the video codec category it specializes # value - the VkVideoCodecOperationFlagBitsKHR value identifying the codec # -# Each element defines a video capability structure that +# Each element defines a video capability structure that # is supported by the video codec and has a single struct attribute # identifying the video capability structure. # diff --git a/xml/vk.xml b/xml/vk.xml index 928a73c9d..0e92812c4 100755 --- a/xml/vk.xml +++ b/xml/vk.xml @@ -175,7 +175,7 @@ branch of the member gitlab server. #define VKSC_API_VERSION_1_0 VK_MAKE_API_VERSION(VKSC_API_VARIANT, 1, 0, 0)// Patch version should always be set to 0 // Version of this file -#define VK_HEADER_VERSION 292 +#define VK_HEADER_VERSION 293 // Complete version of this file #define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 3, VK_HEADER_VERSION) // Version of this file @@ -2255,7 +2255,7 @@ typedef void* MTLSharedEvent_id; const char* pSettingName VkLayerSettingTypeEXT typeThe type of the object uint32_t valueCountNumber of values of the setting - const void* pValuesValues to pass for a setting + const void* pValuesValues to pass for a setting VkStructureType sType @@ -9140,6 +9140,11 @@ typedef void* MTLSharedEvent_id; void* pNext VkBool32 shaderRawAccessChains + + VkStructureType sType + void* pNext + VkBool32 commandBufferInheritance + VkStructureType sType void* pNext @@ -24338,10 +24343,12 @@ typedef void* MTLSharedEvent_id; - + - - + + + + @@ -24627,6 +24634,12 @@ typedef void* MTLSharedEvent_id; + + + + + +