VK_HUAWEI_invocation_mask.proposal
Problem Statement
The rays to trace may be sparse in some use cases.
For example, the scene only have a few regions to reflect.
Providing an invocation mask image to the trace ray commands could potentially give the hardware the hint to do
certain optimization without invoking an additional pass to compact the ray buffer.
Solution Space
Proposal
API proposal
New Enum Constants
- VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME
- VK_HUAWEI_INVOCATION_MASK_SPEC_VERSION
- Extending VkAccessFlagBits2KHR:
◦ VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI
- Extending VkImageUsageFlagBits:
◦ VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI
- Extending VkPipelineStageFlagBits2KHR:
◦ VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI
- Extending VkStructureType:
◦ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI
New structure ◦ VkPhysicalDeviceInvocationMaskFeaturesHUAWEI
typedef enum VkImageUsageFlagBits {
VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 0x00000001,
VK_IMAGE_USAGE_TRANSFER_DST_BIT = 0x00000002,
VK_IMAGE_USAGE_SAMPLED_BIT = 0x00000004,
VK_IMAGE_USAGE_STORAGE_BIT = 0x00000008,
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000010,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,
VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = 0x00000100,
// Provided by VK_EXT_fragment_density_map
VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200,
// Provided by VK_HUAWEI_invocation_mask
VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI = 0x00040000,
} VkImageUsageFlagBits;
New commands
void vkCmdBindInvocationMaskHUAWEI( VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout);
- If imageView is not VK_NULL_HANDLE, it must be a valid VkImageView handle of type VK_IMAGE_VIEW_TYPE_2D
- If imageView is not VK_NULL_HANDLE, it must have a format of VK_FORMAT_R8_UINT
- If imageView is not VK_NULL_HANDLE, it must have been created with a usage value including VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI
- If imageView is not VK_NULL_HANDLE, imageLayout must match the actual VkImageLayou of each subresource accessible from imageView at the time the subresource is accessed
- If imageView is not VK_NULL_HANDLE, imageLayout must be VK_IMAGE_LAYOUT_GENERAL
Valid usage:
Mask image resolution must match the width/height in vkCmdTraceRay; The element of the invocation mask image use value 0 and 1. The value 1 means the invocation is active.
New structure
- Extending VkPhysicalDeviceFeatures2, VkDeviceCreateInfo:
◦ VkPhysicalDeviceInvocationMaskFeaturesHUAWEI
typedef struct VkPhysicalDeviceInvocationMaskFeaturesHUAWEI { VkStructureType sType; void* pNext; VkBool32 invocationMask; } VkPhysicalDeviceInvocationMaskFeaturesHUAWEI;
invocationMask = true mean the feature is supported
Examples
RT mask is updated before each traceRay.
Step 1. Generate InvocationMask.
Layout(location = 2) out vec4 outRTmask vec4 mask = vec4(x,x,x,x); outRTmask = mask;
Step 2. traceRay with InvocationMask
vkCmdBindPipeline( commandBuffers[imageIndex], VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, m_rtPipeline); vkCmdBindDescriptorSets(commandBuffers[imageIndex], VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, m_rtPipelineLayout, 0, 1, &m_rtDescriptorSet, 0, nullptr);
vkCmdBindInvocationMaskHUAWEI( commandBuffers[imageIndex], InvocationMaskimageView, InvocationMaskimageLayout); vkCmdTraceRaysKHR(commandBuffers[imageIndex], pRaygenShaderBindingTable, pMissShaderBindingTable, swapChainExtent.width, swapChainExtent.height, 1);