== Binding Object Table [open,refpage='VkObjectTableNVX',desc='Opaque handle to an object table',type='handles'] -- The device-side bindings are registered inside a table: include::../../api/handles/VkObjectTableNVX.txt[] -- This is required as the CPU-side object pointers, for example when binding a sname:VkPipeline or sname:VkDescriptorSet, cannot be used by the device. The combination of sname:VkObjectTableNVX and ftext:uint32_t table indices stored inside a sname:VkBuffer serve that purpose during device command generation. At creation time the table is defined with a fixed amount of registration slots for the individual resource types. A detailed resource binding can then later be registered via flink:vkRegisterObjectsNVX at any ftext:uint32_t index below the allocated maximum. === Table Creation [open,refpage='vkCreateObjectTableNVX',desc='Create an object table',type='protos'] -- To create object tables, call: include::../../api/protos/vkCreateObjectTableNVX.txt[] * pname:device is the logical device that creates the object table. * pname:pCreateInfo is a pointer to an instance of the sname:VkObjectTableCreateInfoNVX structure containing parameters affecting creation of the table. * pname:pAllocator controls host memory allocation as described in the <> chapter. * pname:pObjectTable points to a slink:VkObjectTableNVX handle in which the resulting object table is returned. include::../../validity/protos/vkCreateObjectTableNVX.txt[] -- [open,refpage='VkObjectTableCreateInfoNVX',desc='Structure specifying the parameters of a newly created object table',type='structs'] -- The sname:VkObjectTableCreateInfoNVX structure is defined as: include::../../api/structs/VkObjectTableCreateInfoNVX.txt[] * pname:sType is the type of this structure. * pname:pNext is `NULL` or a pointer to an extension-specific structure. * pname:objectCount is the number of entry configurations that the object table supports. * pname:pObjectEntryTypes is an array of elink:VkObjectEntryTypeNVX values providing the entry type of a given configuration. * pname:pObjectEntryCounts is an array of counts of how many objects can be registered in the table. * pname:pObjectEntryUsageFlags is an array of bitmasks of elink:VkObjectEntryUsageFlagBitsNVX specifying the binding usage of the entry. * pname:maxUniformBuffersPerDescriptor is the maximum number of ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC used by any single registered sname:VkDescriptorSet in this table. * pname:maxStorageBuffersPerDescriptor is the maximum number of ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC used by any single registered sname:VkDescriptorSet in this table. * pname:maxStorageImagesPerDescriptor is the maximum number of ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER used by any single registered sname:VkDescriptorSet in this table. * pname:maxSampledImagesPerDescriptor is the maximum number of ename:VK_DESCRIPTOR_TYPE_SAMPLER, ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT used by any single registered sname:VkDescriptorSet in this table. * pname:maxPipelineLayouts is the maximum number of unique sname:VkPipelineLayout used by any registered sname:VkDescriptorSet or sname:VkPipeline in this table. .Valid Usage **** * [[VUID-VkObjectTableCreateInfoNVX-computeBindingPointSupport-01355]] If the sname:VkDeviceGeneratedCommandsFeaturesNVX::pname:computeBindingPointSupport feature is not enabled, pname:pObjectEntryUsageFlags must: not contain ename:VK_OBJECT_ENTRY_USAGE_COMPUTE_BIT_NVX * [[VUID-VkObjectTableCreateInfoNVX-pObjectEntryCounts-01356]] Any value within pname:pObjectEntryCounts must: not exceed sname:VkDeviceGeneratedCommandsLimitsNVX::pname:maxObjectEntryCounts * [[VUID-VkObjectTableCreateInfoNVX-maxUniformBuffersPerDescriptor-01357]] pname:maxUniformBuffersPerDescriptor must: be within the limits supported by the device. * [[VUID-VkObjectTableCreateInfoNVX-maxStorageBuffersPerDescriptor-01358]] pname:maxStorageBuffersPerDescriptor must: be within the limits supported by the device. * [[VUID-VkObjectTableCreateInfoNVX-maxStorageImagesPerDescriptor-01359]] pname:maxStorageImagesPerDescriptor must: be within the limits supported by the device. * [[VUID-VkObjectTableCreateInfoNVX-maxSampledImagesPerDescriptor-01360]] pname:maxSampledImagesPerDescriptor must: be within the limits supported by the device. **** include::../../validity/structs/VkObjectTableCreateInfoNVX.txt[] -- [open,refpage='VkObjectEntryTypeNVX',desc='Enum specifying object table entry type',type='enums'] -- Possible values of elements of the slink:VkObjectTableCreateInfoNVX::pname:pObjectEntryTypes array, specifying the entry type of a configuration, are: include::../../api/enums/VkObjectEntryTypeNVX.txt[] * ename:VK_OBJECT_ENTRY_TYPE_DESCRIPTOR_SET_NVX specifies a sname:VkDescriptorSet resource entry that is registered via sname:VkObjectTableDescriptorSetEntryNVX. * ename:VK_OBJECT_ENTRY_TYPE_PIPELINE_NVX specifies a sname:VkPipeline resource entry that is registered via sname:VkObjectTablePipelineEntryNVX. * ename:VK_OBJECT_ENTRY_TYPE_INDEX_BUFFER_NVX specifies a sname:VkBuffer resource entry that is registered via sname:VkObjectTableIndexBufferEntryNVX. * ename:VK_OBJECT_ENTRY_TYPE_VERTEX_BUFFER_NVX specifies a sname:VkBuffer resource entry that is registered via sname:VkObjectTableVertexBufferEntryNVX. * ename:VK_OBJECT_ENTRY_TYPE_PUSH_CONSTANT_NVX specifies the resource entry is registered via sname:VkObjectTablePushConstantEntryNVX. -- [open,refpage='VkObjectEntryUsageFlagBitsNVX',desc='Bitmask specifying allowed usage of an object entry',type='enums'] -- Bits which can: be set in elements of the slink:VkObjectTableCreateInfoNVX::pname:pObjectEntryUsageFlags array, specifying binding usage of an entry, are: include::../../api/enums/VkObjectEntryUsageFlagBitsNVX.txt[] * ename:VK_OBJECT_ENTRY_USAGE_GRAPHICS_BIT_NVX specifies that the resource is bound to ename:VK_PIPELINE_BIND_POINT_GRAPHICS * ename:VK_OBJECT_ENTRY_USAGE_COMPUTE_BIT_NVX specifies that the resource is bound to ename:VK_PIPELINE_BIND_POINT_COMPUTE -- [open,refpage='VkObjectEntryUsageFlagsNVX',desc='Bitmask of VkObjectEntryUsageFlagBitsNVX',type='enums'] -- include::../../api/flags/VkObjectEntryUsageFlagsNVX.txt[] sname:VkObjectEntryUsageFlagsNVX is a bitmask type for setting a mask of zero or more slink:VkObjectEntryUsageFlagBitsNVX. -- [open,refpage='vkDestroyObjectTableNVX',desc='Destroy an object table',type='protos'] -- To destroy an object table, call: include::../../api/protos/vkDestroyObjectTableNVX.txt[] * pname:device is the logical device that destroys the table. * pname:objectTable is the table to destroy. * pname:pAllocator controls host memory allocation as described in the <> chapter. .Valid Usage **** * [[VUID-vkDestroyObjectTableNVX-objectTable-01361]] All submitted commands that refer to pname:objectTable must: have completed execution. * [[VUID-vkDestroyObjectTableNVX-objectTable-01362]] If sname:VkAllocationCallbacks were provided when pname:objectTable was created, a compatible set of callbacks must: be provided here. * [[VUID-vkDestroyObjectTableNVX-objectTable-01363]] If no sname:VkAllocationCallbacks were provided when pname:objectTable was created, pname:pAllocator must: be `NULL`. **** include::../../validity/protos/vkDestroyObjectTableNVX.txt[] -- === Registering Objects [open,refpage='vkRegisterObjectsNVX',desc='Register resource bindings in an object table',type='protos'] -- Resource bindings of Vulkan objects are registered at an arbitrary ftext:uint32_t index within an object table. As long as the object table references such objects, they must: not be deleted. include::../../api/protos/vkRegisterObjectsNVX.txt[] * pname:device is the logical device that creates the object table. * pname:objectTable is the table for which the resources are registered. * pname:objectCount is the number of resources to register. * pname:ppObjectTableEntries provides an array for detailed binding informations, each array element is a pointer to a struct of type sname:VkObjectTablePipelineEntryNVX, sname:VkObjectTableDescriptorSetEntryNVX, sname:VkObjectTableVertexBufferEntryNVX, sname:VkObjectTableIndexBufferEntryNVX or sname:VkObjectTablePushConstantEntryNVX (see below for details). * pname:pObjectIndices are the indices at which each resource is registered. .Valid Usage **** * [[VUID-vkRegisterObjectsNVX-pObjectTableEntry-01364]] The contents of pname:pObjectTableEntry must: yield plausible bindings supported by the device. * [[VUID-vkRegisterObjectsNVX-pObjectIndices-01365]] At any pname:pObjectIndices there must: not be a registered resource already. * [[VUID-vkRegisterObjectsNVX-pObjectIndices-01366]] Any value inside pname:pObjectIndices must: be below the appropriate sname:VkObjectTableCreateInfoNVX::pname:pObjectEntryCounts limits provided at pname:objectTable creation time. **** include::../../validity/protos/vkRegisterObjectsNVX.txt[] -- [open,refpage='VkObjectTableEntryNVX',desc='Common parameters of an object table resource entry',type='structs'] -- Common to all resource entries are: include::../../api/structs/VkObjectTableEntryNVX.txt[] * pname:type defines the entry type * pname:flags defines which slink:VkPipelineBindPoint the resource can be used with. Some entry types allow only a single flag to be set. .Valid Usage **** * [[VUID-VkObjectTableEntryNVX-computeBindingPointSupport-01367]] If the sname:VkDeviceGeneratedCommandsFeaturesNVX::pname:computeBindingPointSupport feature is not enabled, pname:flags must: not contain ename:VK_OBJECT_ENTRY_USAGE_COMPUTE_BIT_NVX **** include::../../validity/structs/VkObjectTableEntryNVX.txt[] -- [open,refpage='VkObjectTablePipelineEntryNVX',desc='Parameters of an object table pipeline entry',type='structs'] -- include::../../api/structs/VkObjectTablePipelineEntryNVX.txt[] * pname:pipeline specifies the slink:VkPipeline that this resource entry references. .Valid Usage **** * [[VUID-VkObjectTablePipelineEntryNVX-type-01368]] pname:type must: be ename:VK_OBJECT_ENTRY_TYPE_PIPELINE_NVX **** include::../../validity/structs/VkObjectTablePipelineEntryNVX.txt[] -- [open,refpage='VkObjectTableDescriptorSetEntryNVX',desc='Parameters of an object table descriptor set entry',type='structs'] -- include::../../api/structs/VkObjectTableDescriptorSetEntryNVX.txt[] * pname:pipelineLayout specifies the slink:VkPipelineLayout that the pname:descriptorSet is used with. * pname:descriptorSet specifies the slink:VkDescriptorSet that can be bound with this entry. .Valid Usage **** * [[VUID-VkObjectTableDescriptorSetEntryNVX-type-01369]] pname:type must: be ename:VK_OBJECT_ENTRY_TYPE_DESCRIPTOR_SET_NVX **** include::../../validity/structs/VkObjectTableDescriptorSetEntryNVX.txt[] -- [open,refpage='VkObjectTableVertexBufferEntryNVX',desc='Parameters of an object table vertex buffer entry',type='structs'] -- include::../../api/structs/VkObjectTableVertexBufferEntryNVX.txt[] * pname:buffer specifies the slink:VkBuffer that can be bound as vertex bufer .Valid Usage **** * [[VUID-VkObjectTableVertexBufferEntryNVX-type-01370]] pname:type must: be ename:VK_OBJECT_ENTRY_TYPE_VERTEX_BUFFER_NVX **** include::../../validity/structs/VkObjectTableVertexBufferEntryNVX.txt[] -- [open,refpage='VkObjectTableIndexBufferEntryNVX',desc='Parameters of an object table index buffer entry',type='structs'] -- include::../../api/structs/VkObjectTableIndexBufferEntryNVX.txt[] * pname:buffer specifies the slink:VkBuffer that can be bound as index buffer * pname:indexType specifies the slink:VkIndexType used with this index buffer .Valid Usage **** * [[VUID-VkObjectTableIndexBufferEntryNVX-type-01371]] pname:type must: be ename:VK_OBJECT_ENTRY_TYPE_INDEX_BUFFER_NVX **** include::../../validity/structs/VkObjectTableIndexBufferEntryNVX.txt[] -- [open,refpage='VkObjectTablePushConstantEntryNVX',desc='Parameters of an object table push constant entry',type='structs'] -- include::../../api/structs/VkObjectTablePushConstantEntryNVX.txt[] * pname:pipelineLayout specifies the slink:VkPipelineLayout that the pushconstants are used with * pname:stageFlags specifies the slink:VkShaderStageFlags that the pushconstants are used with .Valid Usage **** * [[VUID-VkObjectTablePushConstantEntryNVX-type-01372]] pname:type must: be ename:VK_OBJECT_ENTRY_TYPE_PUSH_CONSTANT_NVX **** include::../../validity/structs/VkObjectTablePushConstantEntryNVX.txt[] -- [open,refpage='vkUnregisterObjectsNVX',desc='Unregister resource bindings in an object table',type='protos'] -- Use the following command to unregister resources from an object table: include::../../api/protos/vkUnregisterObjectsNVX.txt[] * pname:device is the logical device that creates the object table. * pname:objectTable is the table from which the resources are unregistered. * pname:objectCount is the number of resources being removed from the object table. * pname:pObjectEntryType provides an array of slink:VkObjectEntryTypeNVX for the resources being removed. * pname:pObjectIndices provides the array of object indices to be removed. .Valid Usage **** * [[VUID-vkUnregisterObjectsNVX-pObjectIndices-01373]] At any pname:pObjectIndices there must: be a registered resource already. * [[VUID-vkUnregisterObjectsNVX-pObjectEntryTypes-01374]] The pname:pObjectEntryTypes of the resource at pname:pObjectIndices must: match. * [[VUID-vkUnregisterObjectsNVX-None-01375]] All operations on the device using the registered resource must: have been completed. **** include::../../validity/protos/vkUnregisterObjectsNVX.txt[] --