Enable sampling of 2d array textures
Test: dEQP-VK.*2d_array*
Change-Id: I106c9d072362c16e2cff14a70901c2ce89657329
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30069
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp
index c46f6f8..6abb34c 100644
--- a/src/Pipeline/SpirvShaderSampling.cpp
+++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -88,6 +88,10 @@
samplerState.addressingModeU = convertAddressingMode(sampler->addressModeU, imageView->getType());
samplerState.addressingModeV = convertAddressingMode(sampler->addressModeV, imageView->getType());
samplerState.addressingModeW = convertAddressingMode(sampler->addressModeW, imageView->getType());
+
+ if (imageView->getType() == VK_IMAGE_VIEW_TYPE_2D_ARRAY)
+ samplerState.addressingModeW = ADDRESSING_LAYER;
+
samplerState.mipmapFilter = convertMipmapMode(sampler);
samplerState.sRGB = imageView->getFormat().isSRGBformat();
samplerState.swizzle = imageView->getComponentMapping();
@@ -120,7 +124,7 @@
// case VK_IMAGE_VIEW_TYPE_3D: coordinateCount = 3; break;
case VK_IMAGE_VIEW_TYPE_CUBE: coordinateCount = 3; break;
// case VK_IMAGE_VIEW_TYPE_1D_ARRAY: coordinateCount = 2; break;
-// case VK_IMAGE_VIEW_TYPE_2D_ARRAY: coordinateCount = 3; break;
+ case VK_IMAGE_VIEW_TYPE_2D_ARRAY: coordinateCount = 3; break;
// case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: coordinateCount = 4; break;
default:
UNIMPLEMENTED("imageView type %d", imageView->getType());
@@ -164,7 +168,7 @@
// 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_2D_ARRAY: return TEXTURE_2D_ARRAY;
+ case VK_IMAGE_VIEW_TYPE_2D_ARRAY: return TEXTURE_2D_ARRAY;
// case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return TEXTURE_CUBE_ARRAY;
default:
UNIMPLEMENTED("imageViewType %d", imageViewType);
@@ -230,7 +234,7 @@
case VK_IMAGE_VIEW_TYPE_2D:
// case VK_IMAGE_VIEW_TYPE_3D:
// case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
-// case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
+ case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
break;
default:
UNIMPLEMENTED("imageViewType %d", imageViewType);
diff --git a/src/Vulkan/VkDescriptorSetLayout.cpp b/src/Vulkan/VkDescriptorSetLayout.cpp
index b624057..ac395b2 100644
--- a/src/Vulkan/VkDescriptorSetLayout.cpp
+++ b/src/Vulkan/VkDescriptorSetLayout.cpp
@@ -324,11 +324,13 @@
VkExtent3D extent = imageView->getMipLevelExtent(level);
Format format = imageView->getFormat();
+ int layers = imageView->getSubresourceRange().layerCount;
+ // TODO(b/129523279): Untangle depth vs layers throughout the sampler
int width = extent.width;
int height = extent.height;
- int depth = extent.depth;
+ int depth = layers > 1 ? layers : extent.depth;
int pitchP = imageView->rowPitchBytes(aspect, level) / format.bytes();
- int sliceP = imageView->slicePitchBytes(aspect, level) / format.bytes();
+ int sliceP = (layers > 1 ? imageView->layerPitchBytes(aspect) : imageView->slicePitchBytes(aspect, level)) / format.bytes();
float exp2LOD = 1.0f;