VK_KHR_shader_integer_dot_product implementation
This extension is entirely promoted to Vulkan 1.3. Because this is an
unoptimized implementation, all new properties are set to false.
The extension adds 3 integer dot products:
- signed
- unsigned
- mixed signed and unsigned
These dot products can be executed either on 32 bit integers or
packed (4 x 8 bit) vectors. Also, they may have the result of the
dot products added to an accumulator. This add operation is a
saturated add for both signed and unsigned dot product operations.
Tests: dEQP-VK.spirv_assembly.instruction.compute.op*khr.*
Bug: b/204502925
Change-Id: Id3c42563d4f3b073e98671215dc19fd9ca702e5c
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/63248
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
Commit-Queue: Alexis Hétu <sugoi@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index a4212c9..d6b5546 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -427,6 +427,10 @@
case spv::CapabilityStorageImageExtendedFormats: capabilities.StorageImageExtendedFormats = true; break;
case spv::CapabilityImageQuery: capabilities.ImageQuery = true; break;
case spv::CapabilityDerivativeControl: capabilities.DerivativeControl = true; break;
+ case spv::CapabilityDotProductInputAll: capabilities.DotProductInputAll = true; break;
+ case spv::CapabilityDotProductInput4x8Bit: capabilities.DotProductInput4x8Bit = true; break;
+ case spv::CapabilityDotProductInput4x8BitPacked: capabilities.DotProductInput4x8BitPacked = true; break;
+ case spv::CapabilityDotProduct: capabilities.DotProduct = true; break;
case spv::CapabilityInterpolationFunction: capabilities.InterpolationFunction = true; break;
case spv::CapabilityStorageImageWriteWithoutFormat: capabilities.StorageImageWriteWithoutFormat = true; break;
case spv::CapabilityGroupNonUniform: capabilities.GroupNonUniform = true; break;
@@ -651,6 +655,12 @@
case spv::OpIAddCarry:
case spv::OpISubBorrow:
case spv::OpDot:
+ case spv::OpSDot:
+ case spv::OpUDot:
+ case spv::OpSUDot:
+ case spv::OpSDotAccSat:
+ case spv::OpUDotAccSat:
+ case spv::OpSUDotAccSat:
case spv::OpConvertFToU:
case spv::OpConvertFToS:
case spv::OpConvertSToF:
@@ -787,6 +797,7 @@
if(!strcmp(ext, "SPV_KHR_multiview")) break;
if(!strcmp(ext, "SPV_EXT_shader_stencil_export")) break;
if(!strcmp(ext, "SPV_KHR_float_controls")) break;
+ if(!strcmp(ext, "SPV_KHR_integer_dot_product")) break;
if(!strcmp(ext, "SPV_KHR_non_semantic_info")) break;
if(!strcmp(ext, "SPV_KHR_vulkan_memory_model")) break;
if(!strcmp(ext, "SPV_GOOGLE_decorate_string")) break;
@@ -2028,6 +2039,12 @@
return EmitBinaryOp(insn, state);
case spv::OpDot:
+ case spv::OpSDot:
+ case spv::OpUDot:
+ case spv::OpSUDot:
+ case spv::OpSDotAccSat:
+ case spv::OpUDotAccSat:
+ case spv::OpSUDotAccSat:
return EmitDot(insn, state);
case spv::OpSelect: