blob: c1726a4733e516433a5079b71c67fa8bd8dbe5c0 [file] [log] [blame]
// Copyright 2021 HUAWEI, Inc.
//
// SPDX-License-Identifier: CC-BY-4.0
= VK_HUAWEI_invocation_mask
:toc: left
:refpage: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/
== 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 elment 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.
//the rt mask image bind as color attachment in the fragment shader
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);
== Issues
== Further Functionality