Implement 1D array image sampling
Treat it as a 2D array image by setting the second coordinate to 0 and
assigning the layer coordinate to the third.
Bug: b/129523279
Test: dEQP-VK.pipeline.image.*
Test: dEQP-VK.pipeline.sampler.*
Change-Id: I82e9a8081c2b7d7a2f62ffc016b860925bd853ad
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30708
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp
index 7ea5bfc..b53624c 100644
--- a/src/Pipeline/SpirvShaderSampling.cpp
+++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -69,7 +69,11 @@
samplerState.compareEnable = (sampler->compareEnable == VK_TRUE);
samplerState.compareOp = sampler->compareOp;
- ASSERT(sampler->anisotropyEnable == VK_FALSE); // TODO(b/129523279)
+ if(sampler->anisotropyEnable != VK_FALSE)
+ {
+ UNSUPPORTED("anisotropyEnable");
+ }
+
ASSERT(sampler->unnormalizedCoordinates == VK_FALSE); // TODO(b/129523279)
auto fptr = emitSamplerFunction(instruction, samplerState);
@@ -113,11 +117,15 @@
// TODO(b/129523279): Currently 1D textures are treated as 2D by setting the second coordinate to 0.
// Implement optimized 1D sampling.
- if(samplerState.textureType == TEXTURE_1D ||
- samplerState.textureType == TEXTURE_1D_ARRAY)
+ if(samplerState.textureType == TEXTURE_1D)
{
uvw[1] = SIMD::Float(0);
}
+ else if(samplerState.textureType == TEXTURE_1D_ARRAY)
+ {
+ uvw[1] = SIMD::Float(0);
+ uvw[2] = in[1]; // Move 1D layer coordinate to 2D layer coordinate index.
+ }
if(instruction.samplerMethod == Lod || instruction.samplerMethod == Bias)
{
@@ -165,7 +173,7 @@
case VK_IMAGE_VIEW_TYPE_2D: return TEXTURE_2D;
case VK_IMAGE_VIEW_TYPE_3D: return TEXTURE_3D;
case VK_IMAGE_VIEW_TYPE_CUBE: return TEXTURE_CUBE;
-// case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return TEXTURE_1D_ARRAY;
+ case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return TEXTURE_1D_ARRAY;
case VK_IMAGE_VIEW_TYPE_2D_ARRAY: return TEXTURE_2D_ARRAY;
// case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return TEXTURE_CUBE_ARRAY;
default:
@@ -233,8 +241,7 @@
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_3D:
break;
-// case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
- break;
+ case VK_IMAGE_VIEW_TYPE_1D_ARRAY: // Treated as 2D texture with second coordinate 0.
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
if(coordinateIndex == 2)
{
@@ -261,7 +268,7 @@
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_3D:
-// case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
+ case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
break;
default: