shaderStorageImageArrayNonUniformIndexing support
shaderStorageImageArrayNonUniformIndexing is required for the
Vulkan Roadmap 2022 milestone and was still not exposed.
Tests: dEQP-VK.descriptor_indexing.storage_imag*
Bug: b/236957287
Change-Id: I2731e93338eda2d0bb4ef51081ab7ae381bb54e1
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/68629
Presubmit-Ready: Alexis Hétu <sugoi@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>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 2357a52..2ce828e 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -460,6 +460,7 @@
case spv::CapabilityStorageTexelBufferArrayDynamicIndexing: capabilities.StorageTexelBufferArrayDynamicIndexing = true; break;
case spv::CapabilityUniformBufferArrayNonUniformIndexing: capabilities.UniformBufferArrayNonUniformIndex = true; break;
case spv::CapabilitySampledImageArrayNonUniformIndexing: capabilities.SampledImageArrayNonUniformIndexing = true; break;
+ case spv::CapabilityStorageImageArrayNonUniformIndexing: capabilities.StorageImageArrayNonUniformIndexing = true; break;
case spv::CapabilityPhysicalStorageBufferAddresses: capabilities.PhysicalStorageBufferAddresses = true; break;
default:
UNSUPPORTED("Unsupported capability %u", insn.word(1));
@@ -2558,7 +2559,7 @@
SIMD::Int mask = state->activeLaneMask() & state->storesAndAtomicsMask();
- if(getObject(pointerId).opcode() == spv::OpImageTexelPointer)
+ if((getObject(pointerId).opcode() == spv::OpImageTexelPointer) && ptr.isBasePlusOffset)
{
mask &= ptr.isInBounds(sizeof(int32_t), OutOfBoundsBehavior::Nullify);
}
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index ceaa72f..cc204fd 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -750,6 +750,7 @@
bool UniformTexelBufferArrayDynamicIndexing : 1;
bool UniformBufferArrayNonUniformIndex : 1;
bool SampledImageArrayNonUniformIndexing : 1;
+ bool StorageImageArrayNonUniformIndexing : 1;
bool PhysicalStorageBufferAddresses : 1;
};
diff --git a/src/Pipeline/SpirvShaderImage.cpp b/src/Pipeline/SpirvShaderImage.cpp
index 1e7c97b..3d96ed4 100644
--- a/src/Pipeline/SpirvShaderImage.cpp
+++ b/src/Pipeline/SpirvShaderImage.cpp
@@ -1558,7 +1558,7 @@
{
auto coordinate = Operand(this, state, instruction.coordinateId);
- Pointer<Byte> descriptor = state->getPointer(instruction.imageId).getUniformPointer(); // vk::StorageImageDescriptor*
+ SIMD::Pointer ptr = state->getPointer(instruction.imageId);
// VK_EXT_image_robustness requires checking for out-of-bounds accesses.
// TODO(b/162327166): Only perform bounds checks when VK_EXT_image_robustness is enabled.
@@ -1574,9 +1574,11 @@
SIMD::Int sample = Operand(this, state, instruction.sampleId).Int(0);
- auto ptr = GetTexelAddress(instruction, descriptor, uvwa, sample, imageFormat, robustness, state);
+ auto texelPtr = ptr.isBasePlusOffset
+ ? GetTexelAddress(instruction, ptr.getUniformPointer(), uvwa, sample, imageFormat, robustness, state)
+ : GetNonUniformTexelAddress(instruction, ptr, uvwa, sample, imageFormat, robustness, state);
- state->createPointer(instruction.resultId, ptr);
+ state->createPointer(instruction.resultId, texelPtr);
return EmitResult::Continue;
}
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index a8dc6e0..523da3d 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -249,7 +249,7 @@
features->shaderUniformBufferArrayNonUniformIndexing = VK_TRUE;
features->shaderSampledImageArrayNonUniformIndexing = VK_TRUE;
features->shaderStorageBufferArrayNonUniformIndexing = VK_TRUE;
- features->shaderStorageImageArrayNonUniformIndexing = VK_FALSE;
+ features->shaderStorageImageArrayNonUniformIndexing = VK_TRUE;
features->shaderInputAttachmentArrayNonUniformIndexing = VK_FALSE;
features->shaderUniformTexelBufferArrayNonUniformIndexing = VK_TRUE;
features->shaderStorageTexelBufferArrayNonUniformIndexing = VK_TRUE;