| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Vulkan.Extensions.VK_NV_device_generated_commands
Description
Name
VK_NV_device_generated_commands - device extension
VK_NV_device_generated_commands
- Name String
VK_NV_device_generated_commands
- Extension Type
- Device extension
- Registered Extension Number
- 278
- Revision
- 3
- Extension and Version Dependencies
- Requires Vulkan 1.1
- Requires
VK_KHR_buffer_device_address
- Contact
Other Extension Metadata
- Last Modified Date
- 2020-02-20
- Interactions and External Dependencies
- This extension requires Vulkan 1.1
- This extension requires
VK_EXT_buffer_device_addressorVK_KHR_buffer_device_addressor Vulkan 1.2 for the ability to bind vertex and index buffers on the device. - This extension interacts with
VK_NV_mesh_shader. If the latter extension is not supported, remove the command token to initiate mesh tasks drawing in this extension.
- Contributors
- Christoph Kubisch, NVIDIA
- Pierre Boudier, NVIDIA
- Jeff Bolz, NVIDIA
- Eric Werness, NVIDIA
- Yuriy O’Donnell, Epic Games
- Baldur Karlsson, Valve
- Mathias Schott, NVIDIA
- Tyson Smith, NVIDIA
- Ingo Esser, NVIDIA
Description
This extension allows the device to generate a number of critical graphics commands for command buffers.
When rendering a large number of objects, the device can be leveraged to implement a number of critical functions, like updating matrices, or implementing occlusion culling, frustum culling, front to back sorting, etc. Implementing those on the device does not require any special extension, since an application is free to define its own data structures, and just process them using shaders.
However, if the application desires to quickly kick off the rendering of the final stream of objects, then unextended Vulkan forces the application to read back the processed stream and issue graphics command from the host. For very large scenes, the synchronization overhead and cost to generate the command buffer can become the bottleneck. This extension allows an application to generate a device side stream of state changes and commands, and convert it efficiently into a command buffer without having to read it back to the host.
Furthermore, it allows incremental changes to such command buffers by manipulating only partial sections of a command stream — for example pipeline bindings. Unextended Vulkan requires re-creation of entire command buffers in such a scenario, or updates synchronized on the host.
The intended usage for this extension is for the application to:
- create
Bufferobjects and retrieve physical addresses from them viagetBufferDeviceAddressEXT - create a graphics pipeline using
GraphicsPipelineShaderGroupsCreateInfoNVfor the ability to change shaders on the device. - create a
IndirectCommandsLayoutNV, which lists theIndirectCommandsTokenTypeNVit wants to dynamically execute as an atomic command sequence. This step likely involves some internal device code compilation, since the intent is for the GPU to generate the command buffer in the pipeline. - fill the input stream buffers with the data for each of the inputs it needs. Each input is an array that will be filled with token-dependent data.
- set up a preprocess
Bufferthat uses memory according to the information retrieved viagetGeneratedCommandsMemoryRequirementsNV. - optionally preprocess the generated content using
cmdPreprocessGeneratedCommandsNV, for example on an asynchronous compute queue, or for the purpose of re-using the data in multiple executions. - call
cmdExecuteGeneratedCommandsNVto create and execute the actual device commands for all sequences based on the inputs provided.
For each draw in a sequence, the following can be specified:
- a different shader group
- a number of vertex buffer bindings
- a different index buffer, with an optional dynamic offset and index type
- a number of different push constants
- a flag that encodes the primitive winding
While the GPU can be faster than a CPU to generate the commands, it will not happen asynchronously to the device, therefore the primary use-case is generating “less” total work (occlusion culling, classification to use specialized shaders, etc.).
New Object Types
New Commands
cmdExecuteGeneratedCommandsNVcmdPreprocessGeneratedCommandsNVcreateIndirectCommandsLayoutNVdestroyIndirectCommandsLayoutNVgetGeneratedCommandsMemoryRequirementsNV
New Structures
BindShaderGroupIndirectCommandNVBindVertexBufferIndirectCommandNVGeneratedCommandsInfoNVGeneratedCommandsMemoryRequirementsInfoNVGraphicsShaderGroupCreateInfoNVIndirectCommandsLayoutCreateInfoNVIndirectCommandsLayoutTokenNVIndirectCommandsStreamNVSetStateFlagsIndirectCommandNVExtending
GraphicsPipelineCreateInfo:Extending
PhysicalDeviceFeatures2,DeviceCreateInfo:Extending
PhysicalDeviceProperties2:
New Enums
New Bitmasks
New Enum Constants
NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSIONExtending
AccessFlagBits:Extending
ObjectType:Extending
PipelineCreateFlagBits:Extending
PipelineStageFlagBits:Extending
StructureType:STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NVSTRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NVSTRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NVSTRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NVSTRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NVSTRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NVSTRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NVSTRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV
Issues
1) How to name this extension ?
VK_NV_device_generated_commands
As usual, one of the hardest issues ;)
Alternatives: VK_gpu_commands, VK_execute_commands,
VK_device_commands, VK_device_execute_commands, VK_device_execute,
VK_device_created_commands, VK_device_recorded_commands,
VK_device_generated_commands VK_indirect_generated_commands
2) Should we use a serial stateful token stream or stateless sequence descriptions?
Similarly to Pipeline, fixed layouts have the
most likelihood to be cross-vendor adoptable. They also benefit from
being processable in parallel. This is a different design choice
compared to the serial command stream generated through
GL_NV_command_list.
3) How to name a sequence description?
VkIndirectCommandsLayout as in the NVX extension predecessor.
Alternative: VkGeneratedCommandsLayout
4) Do we want to provide indirectCommands inputs with layout or at
indirectCommands time?
Separate layout from data as Vulkan does. Provide full flexibility for
indirectCommands.
5) Should the input be provided as SoA or AoS?
Both ways are desireable. AoS can provide portability to other APIs and easier to setup, while SoA allows to update individual inputs in a cache-efficient manner, when others remain static.
6) How do we make developers aware of the memory requirements of implementation-dependent data used for the generated commands?
Make the API explicit and introduce a preprocess
Buffer. Developers have to allocate it using
getGeneratedCommandsMemoryRequirementsNV.
In the NVX version the requirements were hidden implicitly as part of
the command buffer reservation process, however as the memory
requirements can be substantial, we want to give developers the ability
to budget the memory themselves. By lowering the maxSequencesCount the
memory consumption can be reduced. Furthermore reuse of the memory is
possible, for example for doing explicit preprocessing and execution in
a ping-pong fashion.
The actual buffer size is implementation-dependent and may be zero, i.e. not always required.
When making use of Graphics Shader Groups, the programs should behave similar with regards to vertex inputs, clipping and culling outputs of the geometry stage, as well as sample shading behavior in fragment shaders, to reduce the amount of the worst-case memory approximation.
7) Should we allow additional per-sequence dynamic state changes?
Yes
Introduced a lightweight indirect state flag IndirectStateFlagBitsNV.
So far only switching front face winding state is exposed. Especially in
CAD/DCC mirrored transforms that require such changes are common, and
similar flexibility is given in the ray tracing instance description.
The flag could be extended further, for example to switch between primitive-lists or -strips, or make other state modifications.
Furthermore, as new tokens can be added easily, future extension could
add the ability to change any
DynamicState.
8) How do we allow re-using already “generated” indirectCommands?
Expose a preprocessBuffer to reuse implementation-dependencyFlags
data. Set the isPreprocessed to true in
cmdExecuteGeneratedCommandsNV.
9) Under which conditions is cmdExecuteGeneratedCommandsNV legal?
It behaves like a regular draw call command.
10) Is cmdPreprocessGeneratedCommandsNV copying the input data or
referencing it?
There are multiple implementations possible:
- one could have some emulation code that parses the inputs, and generates an output command buffer, therefore copying the inputs.
- one could just reference the inputs, and have the processing done in pipe at execution time.
If the data is mandated to be copied, then it puts a penalty on implementation that could process the inputs directly in pipe. If the data is “referenced”, then it allows both types of implementation.
The inputs are “referenced”, and must not be modified after the call
to cmdExecuteGeneratedCommandsNV has completed.
11) Which buffer usage flags are required for the buffers referenced by
GeneratedCommandsInfoNV ?
Reuse existing
BUFFER_USAGE_INDIRECT_BUFFER_BIT
GeneratedCommandsInfoNV::preprocessBufferGeneratedCommandsInfoNV::sequencesCountBufferGeneratedCommandsInfoNV::sequencesIndexBufferIndirectCommandsStreamNV::buffer
12) In which pipeline stage does the device generated command expansion happen?
cmdPreprocessGeneratedCommandsNV is treated as if it occurs in a
separate logical pipeline from either graphics or compute, and that
pipeline only includes
PIPELINE_STAGE_TOP_OF_PIPE_BIT,
a new stage
PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV,
and
PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT.
This new stage has two corresponding new access types,
ACCESS_COMMAND_PREPROCESS_READ_BIT_NV
and
ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV,
used to synchronize reading the buffer inputs and writing the preprocess
memory output.
The generated output written in the preprocess buffer memory by
cmdExecuteGeneratedCommandsNV is considered to be consumed by the
PIPELINE_STAGE_DRAW_INDIRECT_BIT
pipeline stage.
Thus, to synchronize from writing the input buffers to preprocessing via
cmdPreprocessGeneratedCommandsNV, use:
dstStageMask=PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NVdstAccessMask=ACCESS_COMMAND_PREPROCESS_READ_BIT_NV
To synchronize from cmdPreprocessGeneratedCommandsNV to executing the
generated commands by cmdExecuteGeneratedCommandsNV, use:
srcStageMask=PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NVsrcAccessMask=ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NVdstStageMask=PIPELINE_STAGE_DRAW_INDIRECT_BITdstAccessMask=ACCESS_INDIRECT_COMMAND_READ_BIT
When cmdExecuteGeneratedCommandsNV is used with a isPreprocessed of
FALSE, the generated commands are
implicitly preprocessed, therefore one only needs to synchronize the
inputs via:
dstStageMask=PIPELINE_STAGE_DRAW_INDIRECT_BITdstAccessMask=ACCESS_INDIRECT_COMMAND_READ_BIT
13) What if most token data is “static”, but we frequently want to render a subsection?
Added “sequencesIndexBuffer”. This allows to easier sort and filter what should actually be executed.
14) What are the changes compared to the previous NVX extension?
- Compute dispatch support was removed (was never implemented in drivers). There are different approaches how dispatching from the device should work, hence we defer this to a future extension.
- The
ObjectTableNVXwas replaced by using physical buffer addresses and introducing Shader Groups for the graphics pipeline. - Less state changes are possible overall, but the important operations are still there (reduces complexity of implementation).
- The API was redesigned so all inputs must be passed at both preprocessing and execution time (this was implicit in NVX, now it is explicit)
- The reservation of intermediate command space is now mandatory and explicit through a preprocess buffer.
- The
IndirectStateFlagBitsNVwere introduced
15) When porting from other APIs, their indirect buffers may use different enums, for example for index buffer types. How to solve this?
Added “pIndexTypeValues” to map custom uint32_t values to
corresponding IndexType.
16) Do we need more shader group state overrides?
The NVX version allowed all PSO states to be different, however as the goal is not to replace all state setup, but focus on highly-frequent state changes for drawing lots of objects, we reduced the amount of state overrides. Especially VkPipelineLayout as well as VkRenderPass configuration should be left static, the rest is still open for discussion.
The current focus is just to allow VertexInput changes as well as shaders, while all shader groups use the same shader stages.
Too much flexibility will increase the test coverage requirement as well. However, further extensions could allow more dynamic state as well.
17) Do we need more detailed physical device feature queries/enables?
An EXT version would need detailed implementor feedback to come up with a good set of features. Please contact us if you are interested, we are happy to make more features optional, or add further restrictions to reduce the minimum feature set of an EXT.
18) Is there an interaction with VK_KHR_pipeline_library planned?
Yes, a future version of this extension will detail the interaction, once VK_KHR_pipeline_library is no longer provisional.
Example Code
Open-Source samples illustrating the usage of the extension can be found at the following location (may not yet exist at time of writing):
https://github.com/nvpro-samples/vk_device_generated_cmds
Version History
Revision 1, 2020-02-20 (Christoph Kubisch)
- Initial version
Revision 2, 2020-03-09 (Christoph Kubisch)
- Remove VK_EXT_debug_report interactions
Revision 3, 2020-03-09 (Christoph Kubisch)
- Fix naming VkPhysicalDeviceGenerated to VkPhysicalDeviceDeviceGenerated
See Also
BindIndexBufferIndirectCommandNV, BindShaderGroupIndirectCommandNV,
BindVertexBufferIndirectCommandNV, GeneratedCommandsInfoNV,
GeneratedCommandsMemoryRequirementsInfoNV,
GraphicsPipelineShaderGroupsCreateInfoNV,
GraphicsShaderGroupCreateInfoNV, IndirectCommandsLayoutCreateInfoNV,
IndirectCommandsLayoutNV,
IndirectCommandsLayoutTokenNV,
IndirectCommandsLayoutUsageFlagBitsNV,
IndirectCommandsLayoutUsageFlagsNV, IndirectCommandsStreamNV,
IndirectCommandsTokenTypeNV, IndirectStateFlagBitsNV,
IndirectStateFlagsNV,
PhysicalDeviceDeviceGeneratedCommandsFeaturesNV,
PhysicalDeviceDeviceGeneratedCommandsPropertiesNV,
SetStateFlagsIndirectCommandNV, cmdBindPipelineShaderGroupNV,
cmdExecuteGeneratedCommandsNV, cmdPreprocessGeneratedCommandsNV,
createIndirectCommandsLayoutNV, destroyIndirectCommandsLayoutNV,
getGeneratedCommandsMemoryRequirementsNV
Document Notes
For more information, see the Vulkan Specification
This page is a generated document. Fixes and changes should be made to the generator scripts, not directly.
Synopsis
- cmdExecuteGeneratedCommandsNV :: forall io. MonadIO io => CommandBuffer -> ("isPreprocessed" ::: Bool) -> GeneratedCommandsInfoNV -> io ()
- cmdPreprocessGeneratedCommandsNV :: forall io. MonadIO io => CommandBuffer -> GeneratedCommandsInfoNV -> io ()
- cmdBindPipelineShaderGroupNV :: forall io. MonadIO io => CommandBuffer -> PipelineBindPoint -> Pipeline -> ("groupIndex" ::: Word32) -> io ()
- getGeneratedCommandsMemoryRequirementsNV :: forall a io. (Extendss MemoryRequirements2 a, PokeChain a, PeekChain a, MonadIO io) => Device -> GeneratedCommandsMemoryRequirementsInfoNV -> io (MemoryRequirements2 a)
- createIndirectCommandsLayoutNV :: forall io. MonadIO io => Device -> IndirectCommandsLayoutCreateInfoNV -> ("allocator" ::: Maybe AllocationCallbacks) -> io IndirectCommandsLayoutNV
- withIndirectCommandsLayoutNV :: forall io r. MonadIO io => Device -> IndirectCommandsLayoutCreateInfoNV -> Maybe AllocationCallbacks -> (io IndirectCommandsLayoutNV -> (IndirectCommandsLayoutNV -> io ()) -> r) -> r
- destroyIndirectCommandsLayoutNV :: forall io. MonadIO io => Device -> IndirectCommandsLayoutNV -> ("allocator" ::: Maybe AllocationCallbacks) -> io ()
- data PhysicalDeviceDeviceGeneratedCommandsFeaturesNV = PhysicalDeviceDeviceGeneratedCommandsFeaturesNV {}
- data PhysicalDeviceDeviceGeneratedCommandsPropertiesNV = PhysicalDeviceDeviceGeneratedCommandsPropertiesNV {
- maxGraphicsShaderGroupCount :: Word32
- maxIndirectSequenceCount :: Word32
- maxIndirectCommandsTokenCount :: Word32
- maxIndirectCommandsStreamCount :: Word32
- maxIndirectCommandsTokenOffset :: Word32
- maxIndirectCommandsStreamStride :: Word32
- minSequencesCountBufferOffsetAlignment :: Word32
- minSequencesIndexBufferOffsetAlignment :: Word32
- minIndirectCommandsBufferOffsetAlignment :: Word32
- data GraphicsShaderGroupCreateInfoNV = GraphicsShaderGroupCreateInfoNV {}
- data GraphicsPipelineShaderGroupsCreateInfoNV = GraphicsPipelineShaderGroupsCreateInfoNV {}
- data BindShaderGroupIndirectCommandNV = BindShaderGroupIndirectCommandNV {
- groupIndex :: Word32
- data BindIndexBufferIndirectCommandNV = BindIndexBufferIndirectCommandNV {}
- data BindVertexBufferIndirectCommandNV = BindVertexBufferIndirectCommandNV {
- bufferAddress :: DeviceAddress
- size :: Word32
- stride :: Word32
- data SetStateFlagsIndirectCommandNV = SetStateFlagsIndirectCommandNV {}
- data IndirectCommandsStreamNV = IndirectCommandsStreamNV {
- buffer :: Buffer
- offset :: DeviceSize
- data IndirectCommandsLayoutTokenNV = IndirectCommandsLayoutTokenNV {
- tokenType :: IndirectCommandsTokenTypeNV
- stream :: Word32
- offset :: Word32
- vertexBindingUnit :: Word32
- vertexDynamicStride :: Bool
- pushconstantPipelineLayout :: PipelineLayout
- pushconstantShaderStageFlags :: ShaderStageFlags
- pushconstantOffset :: Word32
- pushconstantSize :: Word32
- indirectStateFlags :: IndirectStateFlagsNV
- indexTypes :: Vector IndexType
- indexTypeValues :: Vector Word32
- data IndirectCommandsLayoutCreateInfoNV = IndirectCommandsLayoutCreateInfoNV {}
- data GeneratedCommandsInfoNV = GeneratedCommandsInfoNV {
- pipelineBindPoint :: PipelineBindPoint
- pipeline :: Pipeline
- indirectCommandsLayout :: IndirectCommandsLayoutNV
- streams :: Vector IndirectCommandsStreamNV
- sequencesCount :: Word32
- preprocessBuffer :: Buffer
- preprocessOffset :: DeviceSize
- preprocessSize :: DeviceSize
- sequencesCountBuffer :: Buffer
- sequencesCountOffset :: DeviceSize
- sequencesIndexBuffer :: Buffer
- sequencesIndexOffset :: DeviceSize
- data GeneratedCommandsMemoryRequirementsInfoNV = GeneratedCommandsMemoryRequirementsInfoNV {}
- type IndirectCommandsLayoutUsageFlagsNV = IndirectCommandsLayoutUsageFlagBitsNV
- newtype IndirectCommandsLayoutUsageFlagBitsNV where
- IndirectCommandsLayoutUsageFlagBitsNV Flags
- pattern INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV :: IndirectCommandsLayoutUsageFlagBitsNV
- pattern INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV :: IndirectCommandsLayoutUsageFlagBitsNV
- pattern INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV :: IndirectCommandsLayoutUsageFlagBitsNV
- type IndirectStateFlagsNV = IndirectStateFlagBitsNV
- newtype IndirectStateFlagBitsNV where
- newtype IndirectCommandsTokenTypeNV where
- IndirectCommandsTokenTypeNV Int32
- pattern INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV :: IndirectCommandsTokenTypeNV
- pattern INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV :: IndirectCommandsTokenTypeNV
- pattern INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV :: IndirectCommandsTokenTypeNV
- pattern INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV :: IndirectCommandsTokenTypeNV
- pattern INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV :: IndirectCommandsTokenTypeNV
- pattern INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV :: IndirectCommandsTokenTypeNV
- pattern INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV :: IndirectCommandsTokenTypeNV
- pattern INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV :: IndirectCommandsTokenTypeNV
- type NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION = 3
- pattern NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION :: forall a. Integral a => a
- type NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME = "VK_NV_device_generated_commands"
- pattern NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a
- newtype IndirectCommandsLayoutNV = IndirectCommandsLayoutNV Word64
Documentation
cmdExecuteGeneratedCommandsNV Source #
Arguments
| :: forall io. MonadIO io | |
| => CommandBuffer |
|
| -> ("isPreprocessed" ::: Bool) |
|
| -> GeneratedCommandsInfoNV |
|
| -> io () |
vkCmdExecuteGeneratedCommandsNV - Generate and execute commands on the device
Valid Usage
- If a
Samplercreated withmagFilterorminFilterequal toFILTER_LINEARandcompareEnableequal toFALSEis used to sample aImageViewas a result of this command, then the image view’s format features must containFORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
- If a
Samplercreated withmipmapModeequal toSAMPLER_MIPMAP_MODE_LINEARandcompareEnableequal toFALSEis used to sample aImageViewas a result of this command, then the image view’s format features must containFORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT - If a
ImageViewis sampled with depth comparison, the image view’s format features must containFORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR - If a
ImageViewis accessed using atomic operations as a result of this command, then the image view’s format features must containFORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT - If a
ImageViewis sampled withFILTER_CUBIC_EXTas a result of this command, then the image view’s format features must containFORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT - Any
ImageViewbeing sampled withFILTER_CUBIC_EXTas a result of this command must have aImageViewTypeand format that supports cubic filtering, as specified byFilterCubicImageViewImageFormatPropertiesEXT::filterCubicreturned bygetPhysicalDeviceImageFormatProperties2 - Any
ImageViewbeing sampled withFILTER_CUBIC_EXTwith a reduction mode of eitherSAMPLER_REDUCTION_MODE_MINorSAMPLER_REDUCTION_MODE_MAXas a result of this command must have aImageViewTypeand format that supports cubic filtering together with minmax filtering, as specified byFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmaxreturned bygetPhysicalDeviceImageFormatProperties2 - Any
Imagecreated with aImageCreateInfo::flagscontainingIMAGE_CREATE_CORNER_SAMPLED_BIT_NVsampled as a result of this command must only be sampled using aSamplerAddressModeofSAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE - Any
ImageVieworBufferViewbeing written as a storage image or storage texel buffer where the image format field of theOpTypeImageisUnknownmust have image format features that supportFORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR - Any
ImageVieworBufferViewbeing read as a storage image or storage texel buffer where the image format field of theOpTypeImageisUnknownmust have image format features that supportFORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR - For each set n
that is statically used by the
Pipelinebound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with aPipelineLayoutthat is compatible for set n, with thePipelineLayoutused to create the currentPipeline, as described in ??? - If the
maintenance4
feature is not enabled, then for each push constant that is
statically used by the
Pipelinebound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with aPipelineLayoutthat is compatible for push constants, with thePipelineLayoutused to create the currentPipeline, as described in ??? - Descriptors in
each bound descriptor set, specified via
cmdBindDescriptorSets, must be valid if they are statically used by thePipelinebound to the pipeline bind point used by this command - A valid pipeline must be bound to the pipeline bind point used by this command
- If the
Pipelineobject bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set or inherited (if theVK_NV_inherited_viewport_scissorextension is enabled) forcommandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic - There must not
have been any calls to dynamic state setting commands for any state
not specified as dynamic in the
Pipelineobject bound to the pipeline bind point used by this command, since that pipeline was bound - If the
Pipelineobject bound to the pipeline bind point used by this command accesses aSamplerobject that uses unnormalized coordinates, that sampler must not be used to sample from anyImagewith aImageViewof the typeIMAGE_VIEW_TYPE_3D,IMAGE_VIEW_TYPE_CUBE,IMAGE_VIEW_TYPE_1D_ARRAY,IMAGE_VIEW_TYPE_2D_ARRAYorIMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage - If the
Pipelineobject bound to the pipeline bind point used by this command accesses aSamplerobject that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-VOpImageSample*orOpImageSparseSample*instructions withImplicitLod,DreforProjin their name, in any shader stage - If the
Pipelineobject bound to the pipeline bind point used by this command accesses aSamplerobject that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-VOpImageSample*orOpImageSparseSample*instructions that includes a LOD bias or any offset values, in any shader stage - If the
robust buffer access
feature is not enabled, and if the
Pipelineobject bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point - If the
robust buffer access
feature is not enabled, and if the
Pipelineobject bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point - If
commandBufferis an unprotected command buffer and protectedNoFault is not supported, any resource accessed by thePipelineobject bound to the pipeline bind point used by this command must not be a protected resource - If a
ImageViewis accessed usingOpImageWriteas a result of this command, then theTypeof theTexeloperand of that instruction must have at least as many components as the image view’s format - If a
BufferViewis accessed usingOpImageWriteas a result of this command, then theTypeof theTexeloperand of that instruction must have at least as many components as the buffer view’s format - If a
ImageViewwith aFormatthat has a 64-bit component width is accessed as a result of this command, theSampledTypeof theOpTypeImageoperand of that instruction must have aWidthof 64 - If a
ImageViewwith aFormatthat has a component width less than 64-bit is accessed as a result of this command, theSampledTypeof theOpTypeImageoperand of that instruction must have aWidthof 32 - If a
BufferViewwith aFormatthat has a 64-bit component width is accessed as a result of this command, theSampledTypeof theOpTypeImageoperand of that instruction must have aWidthof 64 - If a
BufferViewwith aFormatthat has a component width less than 64-bit is accessed as a result of this command, theSampledTypeof theOpTypeImageoperand of that instruction must have aWidthof 32 -
If the
sparseImageInt64Atomics
feature is not enabled,
Imageobjects created with theIMAGE_CREATE_SPARSE_RESIDENCY_BITflag must not be accessed by atomic instructions through anOpTypeImagewith aSampledTypewith aWidthof 64 by this command -
If the
sparseImageInt64Atomics
feature is not enabled,
Bufferobjects created with theBUFFER_CREATE_SPARSE_RESIDENCY_BITflag must not be accessed by atomic instructions through anOpTypeImagewith aSampledTypewith aWidthof 64 by this command - The current
render pass must be
compatible
with the
renderPassmember of theGraphicsPipelineCreateInfostructure specified when creating thePipelinebound toPIPELINE_BIND_POINT_GRAPHICS - The subpass
index of the current render pass must be equal to the
subpassmember of theGraphicsPipelineCreateInfostructure specified when creating thePipelinebound toPIPELINE_BIND_POINT_GRAPHICS - Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set
- Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command, except for cases involving read-only access to depth/stencil attachments as described in the Render Pass chapter
-
If the draw is recorded in a render pass instance with multiview
enabled, the maximum instance index must be less than or equal to
PhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex -
If the bound graphics pipeline was created with
PipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnableset toTRUEand the current subpass has a depth/stencil attachment, then that attachment must have been created with theIMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXTbit set - If the
bound graphics pipeline state was created with the
DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXTdynamic state enabled, but not theDYNAMIC_STATE_SCISSOR_WITH_COUNT_EXTdynamic state enabled, thencmdSetViewportWithCountEXTmust have been called in the current command buffer prior to this drawing command, and theviewportCountparameter ofcmdSetViewportWithCountEXTmust match thePipelineViewportStateCreateInfo::scissorCountof the pipeline - If the
bound graphics pipeline state was created with the
DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXTdynamic state enabled, but not theDYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXTdynamic state enabled, thencmdSetScissorWithCountEXTmust have been called in the current command buffer prior to this drawing command, and thescissorCountparameter ofcmdSetScissorWithCountEXTmust match thePipelineViewportStateCreateInfo::viewportCountof the pipeline - If the
bound graphics pipeline state was created with both the
DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXTandDYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXTdynamic states enabled then bothcmdSetViewportWithCountEXTandcmdSetScissorWithCountEXTmust have been called in the current command buffer prior to this drawing command, and theviewportCountparameter ofcmdSetViewportWithCountEXTmust match thescissorCountparameter ofcmdSetScissorWithCountEXT - If the
bound graphics pipeline state was created with the
DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXTdynamic state enabled, but not theDYNAMIC_STATE_VIEWPORT_W_SCALING_NVdynamic state enabled, then the bound graphics pipeline must have been created withPipelineViewportWScalingStateCreateInfoNV::viewportCountgreater or equal to theviewportCountparameter in the last call tocmdSetViewportWithCountEXT - If the
bound graphics pipeline state was created with the
DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXTandDYNAMIC_STATE_VIEWPORT_W_SCALING_NVdynamic states enabled then theviewportCountparameter in the last call tocmdSetViewportWScalingNVmust be greater than or equal to theviewportCountparameter in the last call tocmdSetViewportWithCountEXT - If the
bound graphics pipeline state was created with the
DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXTdynamic state enabled, but not theDYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NVdynamic state enabled, then the bound graphics pipeline must have been created withPipelineViewportShadingRateImageStateCreateInfoNV::viewportCountgreater or equal to theviewportCountparameter in the last call tocmdSetViewportWithCountEXT - If the
bound graphics pipeline state was created with the
DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXTandDYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NVdynamic states enabled then theviewportCountparameter in the last call tocmdSetViewportShadingRatePaletteNVmust be greater than or equal to theviewportCountparameter in the last call tocmdSetViewportWithCountEXT -
If the bound graphics pipeline state was created with the
DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXTdynamic state enabled and aPipelineViewportSwizzleStateCreateInfoNVstructure chained fromVkPipelineVieportCreateInfo, then the bound graphics pipeline must have been created withPipelineViewportSwizzleStateCreateInfoNV::viewportCountgreater or equal to theviewportCountparameter in the last call tocmdSetViewportWithCountEXT -
If the bound graphics pipeline state was created with the
DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXTdynamic state enabled and aPipelineViewportExclusiveScissorStateCreateInfoNVstructure chained fromVkPipelineVieportCreateInfo, then the bound graphics pipeline must have been created withPipelineViewportExclusiveScissorStateCreateInfoNV::exclusiveScissorCountgreater or equal to theviewportCountparameter in the last call tocmdSetViewportWithCountEXT - If the bound
graphics pipeline state was created with the
DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXTdynamic state enabled thencmdSetRasterizerDiscardEnableEXTmust have been called in the current command buffer prior to this drawing command - If the bound
graphics pipeline state was created with the
DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXTdynamic state enabled thencmdSetDepthBiasEnableEXTmust have been called in the current command buffer prior to this drawing command - If the bound
graphics pipeline state was created with the
DYNAMIC_STATE_LOGIC_OP_EXTdynamic state enabled thencmdSetLogicOpEXTmust have been called in the current command buffer prior to this drawing command and thelogicOpmust be a validLogicOpvalue -
If the
primitiveFragmentShadingRateWithMultipleViewports
limit is not supported, the bound graphics pipeline was created with
the
DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXTdynamic state enabled, and any of the shader stages of the bound graphics pipeline write to thePrimitiveShadingRateKHRbuilt-in, thencmdSetViewportWithCountEXTmust have been called in the current command buffer prior to this drawing command, and theviewportCountparameter ofcmdSetViewportWithCountEXTmust be1 - If
rasterization is not disabled in the bound graphics pipeline, then
for each color attachment in the subpass, if the corresponding image
view’s
format features
do not contain
FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT, then theblendEnablemember of the corresponding element of thepAttachmentsmember ofpColorBlendStatemust beFALSE - If
rasterization is not disabled in the bound graphics pipeline, and
neither the
VK_AMD_mixed_attachment_samplesnor theVK_NV_framebuffer_mixed_samplesextensions are enabled, thenPipelineMultisampleStateCreateInfo::rasterizationSamplesmust be the same as the current subpass color and/or depth/stencil attachments - If the
current render pass instance was begun with
cmdBeginRenderingKHR, theimageViewmember ofpDepthAttachmentis notNULL_HANDLE, and thelayoutmember ofpDepthAttachmentisIMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, this command must not write any values to the depth attachment - If the
current render pass instance was begun with
cmdBeginRenderingKHR, theimageViewmember ofpStencilAttachmentis notNULL_HANDLE, and thelayoutmember ofpStencilAttachmentisIMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, this command must not write any values to the stencil attachment - If the
current render pass instance was begun with
cmdBeginRenderingKHR, theimageViewmember ofpDepthAttachmentis notNULL_HANDLE, and thelayoutmember ofpDepthAttachmentisIMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, this command must not write any values to the depth attachment - If the
current render pass instance was begun with
cmdBeginRenderingKHR, theimageViewmember ofpStencilAttachmentis notNULL_HANDLE, and thelayoutmember ofpStencilAttachmentisIMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, this command must not write any values to the stencil attachment - If the
current render pass instance was begun with
cmdBeginRenderingKHR, theimageViewmember ofpDepthAttachmentis notNULL_HANDLE, and thelayoutmember ofpDepthAttachmentisIMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, this command must not write any values to the depth attachment - If the
current render pass instance was begun with
cmdBeginRenderingKHR, theimageViewmember ofpStencilAttachmentis notNULL_HANDLE, and thelayoutmember ofpStencilAttachmentisIMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, this command must not write any values to the stencil attachment - If the current
render pass instance was begun with
cmdBeginRenderingKHR, the currently bound graphics pipeline must have been created with aPipelineRenderingCreateInfoKHR::viewMaskequal toRenderingInfoKHR::viewMask - If
the current render pass instance was begun with
cmdBeginRenderingKHR, the currently bound graphics pipeline must have been created with aPipelineRenderingCreateInfoKHR::colorAttachmentCountequal toRenderingInfoKHR::colorAttachmentCount - If
the current render pass instance was begun with
cmdBeginRenderingKHRandRenderingInfoKHR::colorAttachmentCountgreater than0, then each element of theRenderingInfoKHR::pColorAttachmentsarray with aimageViewnot equal toNULL_HANDLEmust have been created with aFormatequal to the corresponding element ofPipelineRenderingCreateInfoKHR::pColorAttachmentFormatsused to create the currently bound graphics pipeline - If the
current render pass instance was begun with
cmdBeginRenderingKHRandRenderingInfoKHR::pDepthAttachment->pname:imageView was notNULL_HANDLE, the value ofPipelineRenderingCreateInfoKHR::depthAttachmentFormatused to create the currently bound graphics pipeline must be equal to theFormatused to createRenderingInfoKHR::pDepthAttachment->pname:imageView - If
the current render pass instance was begun with
cmdBeginRenderingKHRandRenderingInfoKHR::pStencilAttachment->pname:imageView was notNULL_HANDLE, the value ofPipelineRenderingCreateInfoKHR::stencilAttachmentFormatused to create the currently bound graphics pipeline must be equal to theFormatused to createRenderingInfoKHR::pStencilAttachment->pname:imageView - If the
current render pass instance was begun with
cmdBeginRenderingKHRandRenderingFragmentShadingRateAttachmentInfoKHR::imageViewwas notNULL_HANDLE, the currently bound graphics pipeline must have been created withPIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR - If the
current render pass instance was begun with
cmdBeginRenderingKHRandRenderingFragmentDensityMapAttachmentInfoEXT::imageViewwas notNULL_HANDLE, the currently bound graphics pipeline must have been created withPIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT - If
the currently bound pipeline was created with a
AttachmentSampleCountInfoAMDorAttachmentSampleCountInfoNVstructure, and the current render pass instance was begun withcmdBeginRenderingKHRwith aRenderingInfoKHR::colorAttachmentCountparameter greater than0, then each element of theRenderingInfoKHR::pColorAttachmentsarray with aimageViewnot equal toNULL_HANDLEmust have been created with a sample count equal to the corresponding element of thepColorAttachmentSamplesmember ofAttachmentSampleCountInfoAMDorAttachmentSampleCountInfoNVused to create the currently bound graphics pipeline - If the
current render pass instance was begun with
cmdBeginRenderingKHR, the currently bound pipeline was created with aAttachmentSampleCountInfoAMDorAttachmentSampleCountInfoNVstructure, andRenderingInfoKHR::pDepthAttachment->pname:imageView was notNULL_HANDLE, the value of thedepthStencilAttachmentSamplesmember ofAttachmentSampleCountInfoAMDorAttachmentSampleCountInfoNVused to create the currently bound graphics pipeline must be equal to the sample count used to createRenderingInfoKHR::pDepthAttachment->pname:imageView - If
the current render pass instance was begun with
cmdBeginRenderingKHR, the currently bound pipeline was created with aAttachmentSampleCountInfoAMDorAttachmentSampleCountInfoNVstructure, andRenderingInfoKHR::pStencilAttachment->pname:imageView was notNULL_HANDLE, the value of thedepthStencilAttachmentSamplesmember ofAttachmentSampleCountInfoAMDorAttachmentSampleCountInfoNVused to create the currently bound graphics pipeline must be equal to the sample count used to createRenderingInfoKHR::pStencilAttachment->pname:imageView - If
the currently bound pipeline was created without a
AttachmentSampleCountInfoAMDorAttachmentSampleCountInfoNVstructure, and the current render pass instance was begun withcmdBeginRenderingKHRwith aRenderingInfoKHR::colorAttachmentCountparameter greater than0, then each element of theRenderingInfoKHR::pColorAttachmentsarray with aimageViewnot equal toNULL_HANDLEmust have been created with a sample count equal to the value ofPipelineMultisampleStateCreateInfo::rasterizationSamplesused to create the currently bound graphics pipeline - If the
current render pass instance was begun with
cmdBeginRenderingKHR, the currently bound pipeline was created without aAttachmentSampleCountInfoAMDorAttachmentSampleCountInfoNVstructure, andRenderingInfoKHR::pDepthAttachment->pname:imageView was notNULL_HANDLE, the value ofPipelineMultisampleStateCreateInfo::rasterizationSamplesused to create the currently bound graphics pipeline must be equal to the sample count used to createRenderingInfoKHR::pDepthAttachment->pname:imageView - If
the current render pass instance was begun with
cmdBeginRenderingKHR, the currently bound pipeline was created without aAttachmentSampleCountInfoAMDorAttachmentSampleCountInfoNVstructure, andRenderingInfoKHR::pStencilAttachment->pname:imageView was notNULL_HANDLE, the value ofPipelineMultisampleStateCreateInfo::rasterizationSamplesused to create the currently bound graphics pipeline must be equal to the sample count used to createRenderingInfoKHR::pStencilAttachment->pname:imageView - If the
current render pass instance was begun with
cmdBeginRenderingKHR, the currently bound pipeline must have been created with aGraphicsPipelineCreateInfo::renderPassequal toNULL_HANDLE - All vertex input
bindings accessed via vertex input variables declared in the vertex
shader entry point’s interface must have either valid or
NULL_HANDLEbuffers bound - If the
nullDescriptor
feature is not enabled, all vertex input bindings accessed via
vertex input variables declared in the vertex shader entry point’s
interface must not be
NULL_HANDLE - For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in ???
- If
the bound graphics pipeline state was created with the
DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXTdynamic state enabled thencmdSetPrimitiveTopologyEXTmust have been called in the current command buffer prior to this drawing command, and theprimitiveTopologyparameter ofcmdSetPrimitiveTopologyEXTmust be of the same topology class as the pipelinePipelineInputAssemblyStateCreateInfo::topologystate - If the bound
graphics pipeline was created with both the
DYNAMIC_STATE_VERTEX_INPUT_EXTandDYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXTdynamic states enabled, thencmdSetVertexInputEXTmust have been called in the current command buffer prior to this draw command - If the bound
graphics pipeline was created with the
DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXTdynamic state enabled, but not theDYNAMIC_STATE_VERTEX_INPUT_EXTdynamic state enabled, thencmdBindVertexBuffers2EXTmust have been called in the current command buffer prior to this draw command, and thepStridesparameter ofcmdBindVertexBuffers2EXTmust not beNULL - If the bound
graphics pipeline state was created with the
DYNAMIC_STATE_VERTEX_INPUT_EXTdynamic state enabled, thencmdSetVertexInputEXTmust have been called in the current command buffer prior to this draw command - If the bound
graphics pipeline state was created with the
DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXTdynamic state enabled thencmdSetPatchControlPointsEXTmust have been called in the current command buffer prior to this drawing command - If the bound
graphics pipeline state was created with the
DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXTdynamic state enabled thencmdSetPrimitiveRestartEnableEXTmust have been called in the current command buffer prior to this drawing command - The bound
graphics pipeline must not have been created with the
PipelineShaderStageCreateInfo::stagemember of an element ofGraphicsPipelineCreateInfo::pStagesset toSHADER_STAGE_TASK_BIT_NVorSHADER_STAGE_MESH_BIT_NV -
commandBuffermust not be a protected command buffer - If
isPreprocessedisTRUEthencmdPreprocessGeneratedCommandsNVmust have already been executed on the device, using the samepGeneratedCommandsInfocontent as well as the content of the input buffers it references (all exceptGeneratedCommandsInfoNV::preprocessBuffer). FurthermorepGeneratedCommandsInfo`sindirectCommandsLayoutmust have been created with theINDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NVbit set -
GeneratedCommandsInfoNV::pipelinemust match the current bound pipeline atGeneratedCommandsInfoNV::pipelineBindPoint - Transform feedback must not be active
- The ::deviceGeneratedCommands feature must be enabled
Valid Usage (Implicit)
-
commandBuffermust be a validCommandBufferhandle
-
pGeneratedCommandsInfomust be a valid pointer to a validGeneratedCommandsInfoNVstructure -
commandBuffermust be in the recording state - The
CommandPoolthatcommandBufferwas allocated from must support graphics, or compute operations - This command must only be called inside of a render pass instance
Host Synchronization
- Host access to
commandBuffermust be externally synchronized
- Host access to the
CommandPoolthatcommandBufferwas allocated from must be externally synchronized
Command Properties
'
| Command Buffer Levels | Render Pass Scope | Supported Queue Types |
|---|---|---|
| Primary Secondary | Inside | Graphics Compute |
See Also
VK_NV_device_generated_commands,
Bool32,
CommandBuffer, GeneratedCommandsInfoNV
cmdPreprocessGeneratedCommandsNV Source #
Arguments
| :: forall io. MonadIO io | |
| => CommandBuffer |
|
| -> GeneratedCommandsInfoNV |
|
| -> io () |
vkCmdPreprocessGeneratedCommandsNV - Performs preprocessing for generated commands
Valid Usage
-
pGeneratedCommandsInfo`sindirectCommandsLayoutmust have been created with theINDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NVbit set - The ::deviceGeneratedCommands feature must be enabled
Valid Usage (Implicit)
-
commandBuffermust be a validCommandBufferhandle
-
pGeneratedCommandsInfomust be a valid pointer to a validGeneratedCommandsInfoNVstructure -
commandBuffermust be in the recording state - The
CommandPoolthatcommandBufferwas allocated from must support graphics, or compute operations - This command must only be called outside of a render pass instance
Host Synchronization
- Host access to
commandBuffermust be externally synchronized
- Host access to the
CommandPoolthatcommandBufferwas allocated from must be externally synchronized
Command Properties
'
| Command Buffer Levels | Render Pass Scope | Supported Queue Types |
|---|---|---|
| Primary Secondary | Outside | Graphics Compute |
See Also
VK_NV_device_generated_commands,
CommandBuffer, GeneratedCommandsInfoNV
cmdBindPipelineShaderGroupNV Source #
Arguments
| :: forall io. MonadIO io | |
| => CommandBuffer |
|
| -> PipelineBindPoint |
|
| -> Pipeline |
|
| -> ("groupIndex" ::: Word32) |
|
| -> io () |
vkCmdBindPipelineShaderGroupNV - Bind a pipeline object
Valid Usage
-
groupIndexmust be0or less than the effectiveGraphicsPipelineShaderGroupsCreateInfoNV::groupCountincluding the referenced pipelines
- The
pipelineBindPointmust bePIPELINE_BIND_POINT_GRAPHICS - The same
restrictions as
cmdBindPipelineapply as if the bound pipeline was created only with the Shader Group from thegroupIndexinformation - The ::deviceGeneratedCommands feature must be enabled
Valid Usage (Implicit)
-
commandBuffermust be a validCommandBufferhandle
-
pipelineBindPointmust be a validPipelineBindPointvalue -
pipelinemust be a validPipelinehandle -
commandBuffermust be in the recording state - The
CommandPoolthatcommandBufferwas allocated from must support graphics, or compute operations - Both of
commandBuffer, andpipelinemust have been created, allocated, or retrieved from the sameDevice
Host Synchronization
- Host access to
commandBuffermust be externally synchronized
- Host access to the
CommandPoolthatcommandBufferwas allocated from must be externally synchronized
Command Properties
'
| Command Buffer Levels | Render Pass Scope | Supported Queue Types |
|---|---|---|
| Primary Secondary | Both | Graphics Compute |
See Also
VK_NV_device_generated_commands,
CommandBuffer, Pipeline,
PipelineBindPoint
getGeneratedCommandsMemoryRequirementsNV Source #
Arguments
| :: forall a io. (Extendss MemoryRequirements2 a, PokeChain a, PeekChain a, MonadIO io) | |
| => Device |
|
| -> GeneratedCommandsMemoryRequirementsInfoNV |
|
| -> io (MemoryRequirements2 a) |
vkGetGeneratedCommandsMemoryRequirementsNV - Retrieve the buffer allocation requirements for generated commands
Valid Usage
- The ::deviceGeneratedCommands feature must be enabled
Valid Usage (Implicit)
-
devicemust be a validDevicehandle
-
pInfomust be a valid pointer to a validGeneratedCommandsMemoryRequirementsInfoNVstructure -
pMemoryRequirementsmust be a valid pointer to aMemoryRequirements2structure
See Also
VK_NV_device_generated_commands,
Device,
GeneratedCommandsMemoryRequirementsInfoNV,
MemoryRequirements2
createIndirectCommandsLayoutNV Source #
Arguments
| :: forall io. MonadIO io | |
| => Device |
|
| -> IndirectCommandsLayoutCreateInfoNV |
|
| -> ("allocator" ::: Maybe AllocationCallbacks) |
|
| -> io IndirectCommandsLayoutNV |
vkCreateIndirectCommandsLayoutNV - Create an indirect command layout object
Valid Usage
- The ::deviceGeneratedCommands feature must be enabled
Valid Usage (Implicit)
-
devicemust be a validDevicehandle
-
pCreateInfomust be a valid pointer to a validIndirectCommandsLayoutCreateInfoNVstructure - If
pAllocatoris notNULL,pAllocatormust be a valid pointer to a validAllocationCallbacksstructure -
pIndirectCommandsLayoutmust be a valid pointer to aIndirectCommandsLayoutNVhandle
Return Codes
See Also
VK_NV_device_generated_commands,
AllocationCallbacks,
Device, IndirectCommandsLayoutCreateInfoNV,
IndirectCommandsLayoutNV
withIndirectCommandsLayoutNV :: forall io r. MonadIO io => Device -> IndirectCommandsLayoutCreateInfoNV -> Maybe AllocationCallbacks -> (io IndirectCommandsLayoutNV -> (IndirectCommandsLayoutNV -> io ()) -> r) -> r Source #
A convenience wrapper to make a compatible pair of calls to
createIndirectCommandsLayoutNV and destroyIndirectCommandsLayoutNV
To ensure that destroyIndirectCommandsLayoutNV is always called: pass
bracket (or the allocate function from your
favourite resource management library) as the last argument.
To just extract the pair pass (,) as the last argument.
destroyIndirectCommandsLayoutNV Source #
Arguments
| :: forall io. MonadIO io | |
| => Device |
|
| -> IndirectCommandsLayoutNV |
|
| -> ("allocator" ::: Maybe AllocationCallbacks) |
|
| -> io () |
vkDestroyIndirectCommandsLayoutNV - Destroy an indirect commands layout
Valid Usage
-
If
AllocationCallbackswere provided whenindirectCommandsLayoutwas created, a compatible set of callbacks must be provided here -
If no
AllocationCallbackswere provided whenindirectCommandsLayoutwas created,pAllocatormust beNULL - The ::deviceGeneratedCommands feature must be enabled
Valid Usage (Implicit)
-
devicemust be a validDevicehandle
-
If
indirectCommandsLayoutis notNULL_HANDLE,indirectCommandsLayoutmust be a validIndirectCommandsLayoutNVhandle - If
pAllocatoris notNULL,pAllocatormust be a valid pointer to a validAllocationCallbacksstructure -
If
indirectCommandsLayoutis a valid handle, it must have been created, allocated, or retrieved fromdevice
Host Synchronization
- Host access to
indirectCommandsLayoutmust be externally synchronized
See Also
VK_NV_device_generated_commands,
AllocationCallbacks,
Device,
IndirectCommandsLayoutNV
data PhysicalDeviceDeviceGeneratedCommandsFeaturesNV Source #
VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV - Structure describing the device-generated commands features that can be supported by an implementation
Members
This structure describes the following feature:
Description
If the PhysicalDeviceDeviceGeneratedCommandsFeaturesNV structure is
included in the pNext chain of the
PhysicalDeviceFeatures2
structure passed to
getPhysicalDeviceFeatures2,
it is filled in to indicate whether each corresponding feature is
supported. PhysicalDeviceDeviceGeneratedCommandsFeaturesNV can also
be used in the pNext chain of DeviceCreateInfo
to selectively enable these features.
Valid Usage (Implicit)
See Also
Constructors
| PhysicalDeviceDeviceGeneratedCommandsFeaturesNV | |
Fields
| |
Instances
data PhysicalDeviceDeviceGeneratedCommandsPropertiesNV Source #
VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV - Structure describing push descriptor limits that can be supported by an implementation
Description
If the PhysicalDeviceDeviceGeneratedCommandsPropertiesNV structure is
included in the pNext chain of the
PhysicalDeviceProperties2
structure passed to
getPhysicalDeviceProperties2,
it is filled in with each corresponding implementation-dependent
property.
Valid Usage (Implicit)
See Also
Constructors
Instances
data GraphicsShaderGroupCreateInfoNV Source #
VkGraphicsShaderGroupCreateInfoNV - Structure specifying override parameters for each shader group
Valid Usage
- For
stageCount, the same restrictions as inGraphicsPipelineCreateInfo::stageCountapply
- For
pStages, the same restrictions as inGraphicsPipelineCreateInfo::pStagesapply - For
pVertexInputState, the same restrictions as inGraphicsPipelineCreateInfo::pVertexInputStateapply -
For
pTessellationState, the same restrictions as inGraphicsPipelineCreateInfo::pTessellationStateapply
Valid Usage (Implicit)
-
sTypemust beSTRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV
-
pNextmust beNULL -
pStagesmust be a valid pointer to an array ofstageCountvalidPipelineShaderStageCreateInfostructures -
stageCountmust be greater than0
See Also
VK_NV_device_generated_commands,
GraphicsPipelineShaderGroupsCreateInfoNV,
PipelineShaderStageCreateInfo,
PipelineTessellationStateCreateInfo,
PipelineVertexInputStateCreateInfo,
StructureType
Constructors
| GraphicsShaderGroupCreateInfoNV | |
Fields
| |
Instances
| Show GraphicsShaderGroupCreateInfoNV Source # | |
Defined in Vulkan.Extensions.VK_NV_device_generated_commands Methods showsPrec :: Int -> GraphicsShaderGroupCreateInfoNV -> ShowS # | |
| FromCStruct GraphicsShaderGroupCreateInfoNV Source # | |
| ToCStruct GraphicsShaderGroupCreateInfoNV Source # | |
Defined in Vulkan.Extensions.VK_NV_device_generated_commands Methods withCStruct :: GraphicsShaderGroupCreateInfoNV -> (Ptr GraphicsShaderGroupCreateInfoNV -> IO b) -> IO b Source # pokeCStruct :: Ptr GraphicsShaderGroupCreateInfoNV -> GraphicsShaderGroupCreateInfoNV -> IO b -> IO b Source # withZeroCStruct :: (Ptr GraphicsShaderGroupCreateInfoNV -> IO b) -> IO b Source # pokeZeroCStruct :: Ptr GraphicsShaderGroupCreateInfoNV -> IO b -> IO b Source # cStructSize :: Int Source # | |
| Zero GraphicsShaderGroupCreateInfoNV Source # | |
Defined in Vulkan.Extensions.VK_NV_device_generated_commands Methods | |
data GraphicsPipelineShaderGroupsCreateInfoNV Source #
VkGraphicsPipelineShaderGroupsCreateInfoNV - Structure specifying parameters of a newly created multi shader group pipeline
Description
When referencing shader groups by index, groups defined in the
referenced pipelines are treated as if they were defined as additional
entries in pGroups. They are appended in the order they appear in the
pPipelines array and in the pGroups array when those pipelines were
defined.
The application must maintain the lifetime of all such referenced pipelines based on the pipelines that make use of them.
Valid Usage
-
groupCountmust be at least1and as maximumPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxGraphicsShaderGroupCount
-
The sum of
groupCountincluding those groups added from referencedpPipelinesmust also be as maximumPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxGraphicsShaderGroupCount - The
state of the first element of
pGroupsmust match its equivalent within the parent’sGraphicsPipelineCreateInfo - Each
element of
pGroupsmust in combination with the rest of the pipeline state yield a valid state configuration - All
elements of
pGroupsmust use the same shader stage combinations unless any mesh shader stage is used, then either combination of task and mesh or just mesh shader is valid - Mesh
and regular primitive shading stages cannot be mixed across
pGroups -
Each element of
pPipelinesmust have been created with identical state to the pipeline currently created except the state that can be overridden byGraphicsShaderGroupCreateInfoNV - The ::deviceGeneratedCommands feature must be enabled
Valid Usage (Implicit)
-
pGroupsmust be a valid pointer to an array ofgroupCountvalidGraphicsShaderGroupCreateInfoNVstructures -
If
pipelineCountis not0,pPipelinesmust be a valid pointer to an array ofpipelineCountvalidPipelinehandles -
groupCountmust be greater than0
See Also
VK_NV_device_generated_commands,
GraphicsShaderGroupCreateInfoNV, Pipeline,
StructureType
Constructors
| GraphicsPipelineShaderGroupsCreateInfoNV | |
Fields
| |
Instances
data BindShaderGroupIndirectCommandNV Source #
VkBindShaderGroupIndirectCommandNV - Structure specifying input data for a single shader group command token
Valid Usage
- The current
bound graphics pipeline, as well as the pipelines it may reference,
must have been created with
PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV
- The
indexmust be within range of the accessible shader groups of the current bound graphics pipeline. SeecmdBindPipelineShaderGroupNVfor further details
See Also
Constructors
| BindShaderGroupIndirectCommandNV | |
Fields
| |
Instances
data BindIndexBufferIndirectCommandNV Source #
VkBindIndexBufferIndirectCommandNV - Structure specifying input data for a single index buffer command token
Valid Usage
- The buffer’s
usage flag from which the address was acquired must have the
BUFFER_USAGE_INDEX_BUFFER_BITbit set
- The
bufferAddressmust be aligned to theindexTypeused - Each element of
the buffer from which the address was acquired and that is
non-sparse must be bound completely and contiguously to a single
DeviceMemoryobject
Valid Usage (Implicit)
-
indexTypemust be a validIndexTypevalue
See Also
Constructors
| BindIndexBufferIndirectCommandNV | |
Fields
| |
Instances
data BindVertexBufferIndirectCommandNV Source #
VkBindVertexBufferIndirectCommandNV - Structure specifying input data for a single vertex buffer command token
Valid Usage
- The buffer’s
usage flag from which the address was acquired must have the
BUFFER_USAGE_VERTEX_BUFFER_BITbit set
- Each element
of the buffer from which the address was acquired and that is
non-sparse must be bound completely and contiguously to a single
DeviceMemoryobject
See Also
Constructors
| BindVertexBufferIndirectCommandNV | |
Fields
| |
Instances
data SetStateFlagsIndirectCommandNV Source #
VkSetStateFlagsIndirectCommandNV - Structure specifying input data for a single state flag command token
See Also
Constructors
| SetStateFlagsIndirectCommandNV | |
Fields
| |
Instances
data IndirectCommandsStreamNV Source #
VkIndirectCommandsStreamNV - Structure specifying input streams for generated command tokens
Valid Usage
- The
buffer’s usage flag must have theBUFFER_USAGE_INDIRECT_BUFFER_BITbit set
- The
offsetmust be aligned toPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minIndirectCommandsBufferOffsetAlignment - If
bufferis non-sparse then it must be bound completely and contiguously to a singleDeviceMemoryobject
Valid Usage (Implicit)
-
buffermust be a validBufferhandle
See Also
VK_NV_device_generated_commands,
Buffer,
DeviceSize, GeneratedCommandsInfoNV
Constructors
| IndirectCommandsStreamNV | |
Fields
| |
Instances
data IndirectCommandsLayoutTokenNV Source #
VkIndirectCommandsLayoutTokenNV - Struct specifying the details of an indirect command layout token
Valid Usage
-
streammust be smaller thanIndirectCommandsLayoutCreateInfoNV::streamCount
-
offsetmust be less than or equal toPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsTokenOffset - If
tokenTypeisINDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV,vertexBindingUnitmust stay within device supported limits for the appropriate commands - If
tokenTypeisINDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,pushconstantPipelineLayoutmust be valid - If
tokenTypeisINDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,pushconstantOffsetmust be a multiple of4 - If
tokenTypeisINDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,pushconstantSizemust be a multiple of4 - If
tokenTypeisINDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,pushconstantOffsetmust be less thanPhysicalDeviceLimits::maxPushConstantsSize - If
tokenTypeisINDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,pushconstantSizemust be less than or equal toPhysicalDeviceLimits::maxPushConstantsSizeminuspushconstantOffset - If
tokenTypeisINDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, for each byte in the range specified bypushconstantOffsetandpushconstantSizeand for each shader stage inpushconstantShaderStageFlags, there must be a push constant range inpushconstantPipelineLayoutthat includes that byte and that stage - If
tokenTypeisINDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, for each byte in the range specified bypushconstantOffsetandpushconstantSizeand for each push constant range that overlaps that byte,pushconstantShaderStageFlagsmust include all stages in that push constant range’sPushConstantRange::stageFlags - If
tokenTypeisINDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV,indirectStateFlagsmust not be0
Valid Usage (Implicit)
-
sTypemust beSTRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV
-
pNextmust beNULL -
tokenTypemust be a validIndirectCommandsTokenTypeNVvalue -
If
pushconstantPipelineLayoutis notNULL_HANDLE,pushconstantPipelineLayoutmust be a validPipelineLayouthandle -
pushconstantShaderStageFlagsmust be a valid combination ofShaderStageFlagBitsvalues -
indirectStateFlagsmust be a valid combination ofIndirectStateFlagBitsNVvalues - If
indexTypeCountis not0,pIndexTypesmust be a valid pointer to an array ofindexTypeCountvalidIndexTypevalues - If
indexTypeCountis not0,pIndexTypeValuesmust be a valid pointer to an array ofindexTypeCountuint32_tvalues
See Also
VK_NV_device_generated_commands,
Bool32,
IndexType,
IndirectCommandsLayoutCreateInfoNV, IndirectCommandsTokenTypeNV,
IndirectStateFlagsNV, PipelineLayout,
ShaderStageFlags,
StructureType
Constructors
| IndirectCommandsLayoutTokenNV | |
Fields
| |
Instances
| Show IndirectCommandsLayoutTokenNV Source # | |
Defined in Vulkan.Extensions.VK_NV_device_generated_commands Methods showsPrec :: Int -> IndirectCommandsLayoutTokenNV -> ShowS # show :: IndirectCommandsLayoutTokenNV -> String # showList :: [IndirectCommandsLayoutTokenNV] -> ShowS # | |
| FromCStruct IndirectCommandsLayoutTokenNV Source # | |
| ToCStruct IndirectCommandsLayoutTokenNV Source # | |
Defined in Vulkan.Extensions.VK_NV_device_generated_commands Methods withCStruct :: IndirectCommandsLayoutTokenNV -> (Ptr IndirectCommandsLayoutTokenNV -> IO b) -> IO b Source # pokeCStruct :: Ptr IndirectCommandsLayoutTokenNV -> IndirectCommandsLayoutTokenNV -> IO b -> IO b Source # withZeroCStruct :: (Ptr IndirectCommandsLayoutTokenNV -> IO b) -> IO b Source # pokeZeroCStruct :: Ptr IndirectCommandsLayoutTokenNV -> IO b -> IO b Source # cStructSize :: Int Source # | |
| Zero IndirectCommandsLayoutTokenNV Source # | |
Defined in Vulkan.Extensions.VK_NV_device_generated_commands Methods | |
data IndirectCommandsLayoutCreateInfoNV Source #
VkIndirectCommandsLayoutCreateInfoNV - Structure specifying the parameters of a newly created indirect commands layout object
Description
The following code illustrates some of the flags:
void cmdProcessAllSequences(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsTokens, sequencesCount, indexbuffer, indexbufferOffset)
{
for (s = 0; s < sequencesCount; s++)
{
sUsed = s;
if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV) {
sUsed = indexbuffer.load_uint32( sUsed * sizeof(uint32_t) + indexbufferOffset);
}
if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV) {
sUsed = incoherent_implementation_dependent_permutation[ sUsed ];
}
cmdProcessSequence( cmd, pipeline, indirectCommandsLayout, pIndirectCommandsTokens, sUsed );
}
}Valid Usage
-
The
pipelineBindPointmust bePIPELINE_BIND_POINT_GRAPHICS
-
tokenCountmust be greater than0and less than or equal toPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsTokenCount - If
pTokenscontains an entry ofINDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NVit must be the first element of the array and there must be only a single element of such token type - If
pTokenscontains an entry ofINDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NVthere must be only a single element of such token type - All state
tokens in
pTokensmust occur prior work provoking tokens (INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV,INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV,INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV) - The
content of
pTokensmust include one single work provoking token that is compatible with thepipelineBindPoint -
streamCountmust be greater than0and less or equal toPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsStreamCount -
each element of
pStreamStridesmust be greater than `0`and less than or equal toPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsStreamStride. Furthermore the alignment of each token input must be ensured
Valid Usage (Implicit)
-
sTypemust beSTRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV
-
pNextmust beNULL -
flagsmust be a valid combination ofIndirectCommandsLayoutUsageFlagBitsNVvalues -
pipelineBindPointmust be a validPipelineBindPointvalue -
pTokensmust be a valid pointer to an array oftokenCountvalidIndirectCommandsLayoutTokenNVstructures -
pStreamStridesmust be a valid pointer to an array ofstreamCountuint32_tvalues -
tokenCountmust be greater than0 -
streamCountmust be greater than0
See Also
VK_NV_device_generated_commands,
IndirectCommandsLayoutTokenNV, IndirectCommandsLayoutUsageFlagsNV,
PipelineBindPoint,
StructureType,
createIndirectCommandsLayoutNV
Constructors
| IndirectCommandsLayoutCreateInfoNV | |
Fields
| |
Instances
| Show IndirectCommandsLayoutCreateInfoNV Source # | |
Defined in Vulkan.Extensions.VK_NV_device_generated_commands Methods showsPrec :: Int -> IndirectCommandsLayoutCreateInfoNV -> ShowS # | |
| FromCStruct IndirectCommandsLayoutCreateInfoNV Source # | |
| ToCStruct IndirectCommandsLayoutCreateInfoNV Source # | |
Defined in Vulkan.Extensions.VK_NV_device_generated_commands Methods withCStruct :: IndirectCommandsLayoutCreateInfoNV -> (Ptr IndirectCommandsLayoutCreateInfoNV -> IO b) -> IO b Source # pokeCStruct :: Ptr IndirectCommandsLayoutCreateInfoNV -> IndirectCommandsLayoutCreateInfoNV -> IO b -> IO b Source # withZeroCStruct :: (Ptr IndirectCommandsLayoutCreateInfoNV -> IO b) -> IO b Source # pokeZeroCStruct :: Ptr IndirectCommandsLayoutCreateInfoNV -> IO b -> IO b Source # cStructSize :: Int Source # | |
| Zero IndirectCommandsLayoutCreateInfoNV Source # | |
Defined in Vulkan.Extensions.VK_NV_device_generated_commands Methods | |
data GeneratedCommandsInfoNV Source #
VkGeneratedCommandsInfoNV - Structure specifying parameters for the generation of commands
Valid Usage
- If the
indirectCommandsLayoutuses a token ofINDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV, then thepipelinemust have been created with multiple shader groups - If the
indirectCommandsLayoutuses a token ofINDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV, then thepipelinemust have been created withPIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NVset inGraphicsPipelineCreateInfo::flags - If the
indirectCommandsLayoutuses a token ofINDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, then thepipeline`sPipelineLayoutmust match theIndirectCommandsLayoutTokenNV::pushconstantPipelineLayout -
streamCountmust match theindirectCommandsLayout’sstreamCount -
sequencesCountmust be less or equal toPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectSequenceCountandGeneratedCommandsMemoryRequirementsInfoNV::maxSequencesCountthat was used to determine thepreprocessSize -
preprocessBuffermust have theBUFFER_USAGE_INDIRECT_BUFFER_BITbit set in its usage flag -
preprocessOffsetmust be aligned toPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minIndirectCommandsBufferOffsetAlignment - If
preprocessBufferis non-sparse then it must be bound completely and contiguously to a singleDeviceMemoryobject -
preprocessSizemust be at least equal to the memory requirement`s size returned bygetGeneratedCommandsMemoryRequirementsNVusing the matching inputs (indirectCommandsLayout, …) as within this structure -
sequencesCountBuffercan be set if the actual used count of sequences is sourced from the provided buffer. In that case thesequencesCountserves as upper bound - If
sequencesCountBufferis notNULL_HANDLE, its usage flag must have theBUFFER_USAGE_INDIRECT_BUFFER_BITbit set - If
sequencesCountBufferis notNULL_HANDLE,sequencesCountOffsetmust be aligned toPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minSequencesCountBufferOffsetAlignment - If
sequencesCountBufferis notNULL_HANDLEand is non-sparse then it must be bound completely and contiguously to a singleDeviceMemoryobject - If
indirectCommandsLayout’sINDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NVis set,sequencesIndexBuffermust be set otherwise it must beNULL_HANDLE - If
sequencesIndexBufferis notNULL_HANDLE, its usage flag must have theBUFFER_USAGE_INDIRECT_BUFFER_BITbit set - If
sequencesIndexBufferis notNULL_HANDLE,sequencesIndexOffsetmust be aligned toPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minSequencesIndexBufferOffsetAlignment - If
sequencesIndexBufferis notNULL_HANDLEand is non-sparse then it must be bound completely and contiguously to a singleDeviceMemoryobject
Valid Usage (Implicit)
-
sTypemust beSTRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV
-
pNextmust beNULL -
pipelineBindPointmust be a validPipelineBindPointvalue -
pipelinemust be a validPipelinehandle -
indirectCommandsLayoutmust be a validIndirectCommandsLayoutNVhandle -
pStreamsmust be a valid pointer to an array ofstreamCountvalidIndirectCommandsStreamNVstructures -
preprocessBuffermust be a validBufferhandle - If
sequencesCountBufferis notNULL_HANDLE,sequencesCountBuffermust be a validBufferhandle - If
sequencesIndexBufferis notNULL_HANDLE,sequencesIndexBuffermust be a validBufferhandle -
streamCountmust be greater than0 - Each of
indirectCommandsLayout,pipeline,preprocessBuffer,sequencesCountBuffer, andsequencesIndexBufferthat are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the sameDevice
See Also
VK_NV_device_generated_commands,
Buffer,
DeviceSize,
IndirectCommandsLayoutNV,
IndirectCommandsStreamNV, Pipeline,
PipelineBindPoint,
StructureType,
cmdExecuteGeneratedCommandsNV, cmdPreprocessGeneratedCommandsNV
Constructors
| GeneratedCommandsInfoNV | |
Fields
| |
Instances
data GeneratedCommandsMemoryRequirementsInfoNV Source #
VkGeneratedCommandsMemoryRequirementsInfoNV - Structure specifying parameters for the reservation of preprocess buffer space
Valid Usage
-
maxSequencesCountmust be less or equal toPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectSequenceCount
Valid Usage (Implicit)
-
pNextmust beNULL -
pipelineBindPointmust be a validPipelineBindPointvalue -
pipelinemust be a validPipelinehandle -
indirectCommandsLayoutmust be a validIndirectCommandsLayoutNVhandle - Both
of
indirectCommandsLayout, andpipelinemust have been created, allocated, or retrieved from the sameDevice
See Also
VK_NV_device_generated_commands,
IndirectCommandsLayoutNV,
Pipeline,
PipelineBindPoint,
StructureType,
getGeneratedCommandsMemoryRequirementsNV
Constructors
| GeneratedCommandsMemoryRequirementsInfoNV | |
Fields
| |
Instances
newtype IndirectCommandsLayoutUsageFlagBitsNV Source #
VkIndirectCommandsLayoutUsageFlagBitsNV - Bitmask specifying allowed usage of an indirect commands layout
See Also
VK_NV_device_generated_commands,
IndirectCommandsLayoutUsageFlagsNV
Constructors
| IndirectCommandsLayoutUsageFlagBitsNV Flags |
Bundled Patterns
Instances
newtype IndirectStateFlagBitsNV Source #
VkIndirectStateFlagBitsNV - Bitmask specifiying state that can be altered on the device
See Also
Constructors
| IndirectStateFlagBitsNV Flags |
Bundled Patterns
| pattern INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV :: IndirectStateFlagBitsNV |
|
Instances
newtype IndirectCommandsTokenTypeNV Source #
VkIndirectCommandsTokenTypeNV - Enum specifying token commands
Description
'
Supported indirect command tokens
See Also
VK_NV_device_generated_commands,
IndirectCommandsLayoutTokenNV
Constructors
| IndirectCommandsTokenTypeNV Int32 |
Bundled Patterns
Instances
pattern NV_DEVICE_GENERATED_COMMANDS_SPEC_VERSION :: forall a. Integral a => a Source #
type NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME = "VK_NV_device_generated_commands" Source #
pattern NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a Source #
newtype IndirectCommandsLayoutNV Source #
VkIndirectCommandsLayoutNV - Opaque handle to an indirect commands layout object
See Also
VK_NV_device_generated_commands,
GeneratedCommandsInfoNV,
GeneratedCommandsMemoryRequirementsInfoNV,
createIndirectCommandsLayoutNV,
destroyIndirectCommandsLayoutNV
Constructors
| IndirectCommandsLayoutNV Word64 |