VK_KHR_maintenance6
This proposal details and addresses the issues solved by the VK_KHR_maintenance6
extension.
1. Problem Statement
Over time, a collection of minor features, none of which would warrant an entire extension of their own, requires the creation of a maintenance extension.
The following is a list of issues considered in this proposal:
-
vkBindBufferMemory2
andvkBindImageMemory2
accept arrays of memory binding parameters, but the commands only return a singleVkResult
value. This makes it impossible to identify which specific memory binding operation failed, and leaves resources in an indeterminate, unusable state. -
Add a property to describe if an implementation clamps the inputs to fragment shading rate combiner operations.
-
There are some use cases where an index buffer must be bound, even if it is not used, and the specification currently forbids the use of
VK_NULL_HANDLE
. -
Need a
maxCombinedImageSamplerDescriptorCount
value, for cases where you need to create a descriptor set layout, but do not know which formats will be used (and therefore cannot query it). -
Creating image views with
VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT
and multiple layers is supported by all modern hardware, so this should be exposed by the API. -
pNext
extensible *2 versions of all descriptor binding commands.
2. Proposal
2.1. New features
The following features are exposed:
typedef struct VkPhysicalDeviceMaintenance6FeaturesKHR {
VkStructureType sType;
void* pNext;
VkBool32 maintenance6;
} VkPhysicalDeviceMaintenance6FeaturesKHR;
-
The
maintenance6
feature indicates support for theVK_KHR_maintenance6
extension.
2.2. New properties
The following device properties are exposed:
typedef struct VkPhysicalDeviceMaintenance6PropertiesKHR {
VkStructureType sType;
void* pNext;
VkBool32 blockTexelViewCompatibleMultipleLayers;
uint32_t maxCombinedImageSamplerDescriptorCount;
VkBool32 fragmentShadingRateClampCombinerInputs;
} VkPhysicalDeviceMaintenance6PropertiesKHR;
-
The
blockTexelViewCompatibleMultipleLayers
property indicates whether aVK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT
can be used with alayerCount
of greater than1
. -
The
maxCombinedImageSamplerDescriptorCount
property indicates the maximum number of descriptors needed for any of the multi-planar formats supported by the implementation that requireYCbCr
conversion . -
The
fragmentShadingRateClampCombinerInputs
property indicates if an implementation clamps the inputs to fragment shading rate combiner operations.
2.3. New binding status structure
typedef struct VkBindMemoryStatusKHR {
VkStructureType sType;
const void* pNext;
VkResult* pResult;
} VkBindMemoryStatusKHR;
The VkBindMemoryStatusKHR
structure can be included in the pNext
chain of VkBindBufferMemoryInfo
and
VkBindImageMemoryInfo
, allowing applications to retrieve VkResult
values for individual memory binding operations.
2.4. New index buffer binding functionality
VK_NULL_HANDLE
can now be used in index buffer binding functions, in place
of a valid VkBuffer
handle. When the nullDescriptor
feature is enabled,
every index fetched results in a value of zero.
2.5. New functions
The following new functions are added in order to support future extensibility:
typedef struct VkBindDescriptorSetsInfoKHR {
VkStructureType sType;
const void* pNext;
VkShaderStageFlags stageFlags;
VkPipelineLayout layout;
uint32_t firstSet;
uint32_t descriptorSetCount;
const VkDescriptorSet* pDescriptorSets;
uint32_t dynamicOffsetCount;
const uint32_t* pDynamicOffsets;
} VkBindDescriptorSetsInfoKHR;
typedef struct VkPushConstantsInfoKHR {
VkStructureType sType;
const void* pNext;
VkPipelineLayout layout;
VkShaderStageFlags stageFlags;
uint32_t offset;
uint32_t size;
const void* pValues;
} VkPushConstantsInfoKHR;
typedef struct VkPushDescriptorSetInfoKHR {
VkStructureType sType;
const void* pNext;
VkShaderStageFlags stageFlags;
VkPipelineLayout layout;
uint32_t set;
uint32_t descriptorWriteCount;
const VkWriteDescriptorSet* pDescriptorWrites;
} VkPushDescriptorSetInfoKHR;
typedef struct VkPushDescriptorSetWithTemplateInfoKHR {
VkStructureType sType;
const void* pNext;
VkDescriptorUpdateTemplate descriptorUpdateTemplate;
VkPipelineLayout layout;
uint32_t set;
const void* pData;
} VkPushDescriptorSetWithTemplateInfoKHR;
typedef struct VkSetDescriptorBufferOffsetsInfoEXT {
VkStructureType sType;
const void* pNext;
VkShaderStageFlags stageFlags;
VkPipelineLayout layout;
uint32_t firstSet;
uint32_t setCount;
const uint32_t* pBufferIndices;
const VkDeviceSize* pOffsets;
} VkSetDescriptorBufferOffsetsInfoEXT;
typedef struct VkBindDescriptorBufferEmbeddedSamplersInfoEXT {
VkStructureType sType;
const void* pNext;
VkShaderStageFlags stageFlags;
VkPipelineLayout layout;
uint32_t set;
} VkBindDescriptorBufferEmbeddedSamplersInfoEXT;
void vkCmdBindDescriptorSets2KHR(
VkCommandBuffer commandBuffer,
const VkBindDescriptorSetsInfoKHR* pBindDescriptorSetsInfo);
void vkCmdPushConstants2KHR(
VkCommandBuffer commandBuffer,
const VkPushConstantsInfoKHR* pPushConstantsInfo);
void vkCmdPushDescriptorSet2KHR(
VkCommandBuffer commandBuffer,
const VkPushDescriptorSetInfoKHR* pPushDescriptorSetInfo);
void vkCmdPushDescriptorSetWithTemplate2KHR(
VkCommandBuffer commandBuffer,
const VkPushDescriptorSetWithTemplateInfoKHR* pPushDescriptorSetWithTemplateInfo);
void vkCmdSetDescriptorBufferOffsets2EXT(
VkCommandBuffer commandBuffer,
const VkSetDescriptorBufferOffsetsInfoEXT* pSetDescriptorBufferOffsetsInfo);
void vkCmdBindDescriptorBufferEmbeddedSamplers2EXT(
VkCommandBuffer commandBuffer,
const VkBindDescriptorBufferEmbeddedSamplersInfoEXT* pBindDescriptorBufferEmbeddedSamplersInfo);
The parameters of the structures are identical to the arguments of the
existing functions, except that VkPipelineBindPoint
is replaced with
VkShaderStageFlagBits
.