VK_QCOM_image_processing2
Other Extension Metadata
Last Modified Date
2023-03-10
Interactions and External Dependencies
- This extension provides API support for
GL_QCOM_image_processing2
Contributors
- Jeff Leger, Qualcomm Technologies, Inc.
Description
This extension enables support for the SPIR-V TextureBlockMatch2QCOM
capability.
It builds on the functionality of QCOM_image_processing with the addition of
4 new image processing operations.
- The
opImageBlockMatchWindowSADQCOM` SPIR-V instruction builds upon the functionality ofopImageBlockMatchSADQCOM` by repeatedly performing block match operations across a 2D window. The2D windowExtentandcompareModeare specified by VkSamplerBlockMatchWindowCreateInfoQCOM in the sampler used to create the target image. LikeOpImageBlockMatchSADQCOM,opImageBlockMatchWindowSADQCOMcomputes an error metric, that describes whether a block of texels in the target image matches a corresponding block of texels in the reference image. UnlikeOpImageBlockMatchSADQCOM, this instruction computes an error metric at each (X,Y) location within the 2D window and returns either the minimum or maximum error. The instruction only supports single-component formats. Refer to the pseudocode below for details. - The
opImageBlockMatchWindowSSDQCOMfollows the same pattern, computing the SSD error metric at each location within the 2D window. - The
opImageBlockMatchGatherSADQCOMbuilds uponOpImageBlockMatchSADQCOM. This instruction computes an error metric, that describes whether a block of texels in the target image matches a corresponding block of texels in the reference image. The instruction computes the SAD error metric at 4 texel offsets and returns the error metric for each offset in the X,Y,Z,and W components. The instruction only supports single-component texture formats. Refer to the pseudocode below for details. - The
opImageBlockMatchGatherSSDQCOMfollows the same pattern, computing the SSD error metric for 4 offsets.
Each of the above 4 image processing instructions are limited to single-component formats.
Below is the pseudocode for GLSL built-in function
textureWindowBlockMatchSADQCOM.
The pseudocode for textureWindowBlockMatchSSD is identical other than
replacing all instances of "SAD" with "SSD".
vec4 textureBlockMatchWindowSAD( sampler2D target,
uvec2 targetCoord,
samler2D reference,
uvec2 refCoord,
uvec2 blocksize) {
// compareMode (MIN or MAX) comes from the vkSampler associated with `target`
// uvec2 window comes from the vkSampler associated with `target`
minSAD = INF;
maxSAD = -INF;
uvec2 minCoord;
uvec2 maxCoord;
for (uint x=0, x < window.width; x++) {
for (uint y=0; y < window.height; y++) {
float SAD = textureBlockMatchSAD(target,
targetCoord + uvec2(x, y),
reference,
refCoord,
blocksize).x;
// Note: the below comparison operator will produce undefined results
// if SAD is a denorm value.
if (SAD < minSAD) {
minSAD = SAD;
minCoord = uvec2(x,y);
}
if (SAD > maxSAD) {
maxSAD = SAD;
maxCoord = uvec2(x,y);
}
}
}
if (compareMode=MIN) {
return vec4(minSAD, minCoord.x, minCoord.y, 0.0);
} else {
return vec4(maxSAD, maxCoord.x, maxCoord.y, 0.0);
}
}
Below is the pseudocode for textureBlockMatchGatherSADQCOM.
The pseudocode for textureBlockMatchGatherSSD follows an identical
pattern.
vec4 textureBlockMatchGatherSAD( sampler2D target,
uvec2 targetCoord,
samler2D reference,
uvec2 refCoord,
uvec2 blocksize) {
vec4 out;
for (uint x=0, x<4; x++) {
float SAD = textureBlockMatchSAD(target,
targetCoord + uvec2(x, 0),
reference,
refCoord,
blocksize).x;
out[x] = SAD;
}
return out;
}
New Structures
- Extending VkPhysicalDeviceFeatures2, VkDeviceCreateInfo:
- Extending VkPhysicalDeviceProperties2:
- Extending VkSamplerCreateInfo:
New Enums
New Enum Constants
VK_QCOM_IMAGE_PROCESSING_2_EXTENSION_NAMEVK_QCOM_IMAGE_PROCESSING_2_SPEC_VERSION- Extending VkStructureType:
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOMVK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_PROPERTIES_QCOMVK_STRUCTURE_TYPE_SAMPLER_BLOCK_MATCH_WINDOW_CREATE_INFO_QCOM
Issues
1) What is the precision of the min/max comparison checks?
RESOLVED: Intermediate computations for the new operations are performed
at 16-bit floating-point precision.
If the value of "float SAD" in the above code sample is a 16-bit denorm
value, then behavior of the MIN/MAX comparison is undefined.
Version History
- Revision 1, 2023-03-10 (Jeff Leger)