| [[device-generated-commands]] |
| = Device-Generated Commands |
| |
| This chapter discusses the generation of command buffer content on the |
| device. |
| These principle steps are to be taken to generate commands on the device: |
| |
| * Make resource bindings accessible for the device via registering in a |
| sname:VkObjectTableNVX. |
| * Define via sname:VkIndirectCommandsLayoutNVX the sequence of commands |
| which should be generated. |
| * Fill one or more sname:VkBuffer with the appropriate content that gets |
| interpreted by sname:VkIndirectCommandsLayoutNVX. |
| * Reserve command space via flink:vkCmdReserveSpaceForCommandsNVX in a |
| secondary sname:VkCommandBuffer where the generated commands should be |
| recorded. |
| * Generate the actual commands via flink:vkCmdProcessCommandsNVX passing |
| all required data. |
| |
| Execution of such generated commands can either be triggered directly with |
| the generation process, or by executing the secondary sname:VkCommandBuffer |
| that was chosen as optional target. |
| The latter allows re-using generated commands as well. |
| Similar to sname:VkDescriptorSet, special care should: be taken for the |
| lifetime of resources referenced in sname:VkObjectTableNVX, which may be |
| accessed at either generation or execution time. |
| |
| flink:vkCmdProcessCommandsNVX executes in a separate logical pipeline from |
| either graphics or compute. |
| When generating commands into a secondary command buffer, the command |
| generation must: be explicitly synchronized against the secondary command |
| buffer's execution. |
| When not using a secondary command buffer, the command generation is |
| automatically synchronized against the command execution. |
| |
| == Features and Limitations |
| |
| [open,refpage='vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX',desc='Returns device-generated commands related properties of a physical device',type='protos'] |
| -- |
| |
| To query the support of related features and limitations, call: |
| |
| include::../../api/protos/vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX.txt[] |
| |
| * pname:physicalDevice is the handle to the physical device whose |
| properties will be queried. |
| * pname:pFeatures points to an instance of the |
| slink:VkDeviceGeneratedCommandsFeaturesNVX structure, that will be |
| filled with returned information. |
| * pname:pLimits points to an instance of the |
| slink:VkDeviceGeneratedCommandsLimitsNVX structure, that will be filled |
| with returned information. |
| |
| include::../../validity/protos/vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX.txt[] |
| -- |
| |
| [open,refpage='VkDeviceGeneratedCommandsFeaturesNVX',desc='Structure specifying physical device support',type='structs'] |
| -- |
| |
| The sname:VkDeviceGeneratedCommandsFeaturesNVX structure is defined as: |
| |
| include::../../api/structs/VkDeviceGeneratedCommandsFeaturesNVX.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to an extension-specific structure. |
| * pname:computeBindingPointSupport specifies whether the |
| sname:VkObjectTableNVX supports entries with |
| ename:VK_OBJECT_ENTRY_USAGE_GRAPHICS_BIT_NVX bit set and |
| sname:VkIndirectCommandsLayoutNVX supports |
| ename:VK_PIPELINE_BIND_POINT_COMPUTE. |
| |
| include::../../validity/structs/VkDeviceGeneratedCommandsFeaturesNVX.txt[] |
| -- |
| |
| [open,refpage='VkDeviceGeneratedCommandsLimitsNVX',desc='Structure specifying physical device limits',type='structs'] |
| -- |
| |
| The sname:VkDeviceGeneratedCommandsLimitsNVX structure is defined as: |
| |
| include::../../api/structs/VkDeviceGeneratedCommandsLimitsNVX.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to an extension-specific structure. |
| * pname:maxIndirectCommandsLayoutTokenCount the maximum number of tokens |
| in sname:VkIndirectCommandsLayoutNVX. |
| * pname:maxObjectEntryCounts the maximum number of entries per resource |
| type in sname:VkObjectTableNVX. |
| * pname:minSequenceCountBufferOffsetAlignment the minimum alignment for |
| memory addresses optionally used in fname:vkCmdProcessCommandsNVX. |
| * pname:minSequenceIndexBufferOffsetAlignment the minimum alignment for |
| memory addresses optionally used in fname:vkCmdProcessCommandsNVX. |
| * pname:minCommandsTokenBufferOffsetAlignment the minimum alignment for |
| memory addresses optionally used in fname:vkCmdProcessCommandsNVX. |
| |
| include::../../validity/structs/VkDeviceGeneratedCommandsLimitsNVX.txt[] |
| -- |
| |
| include::objecttable.txt[] |
| |
| include::indirectcommands.txt[] |
| |
| include::generation.txt[] |