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: