Tidy around sampler handling
Bug: b/134584057
Change-Id: I1574c9017a5d48f69d14732874a8c8b814056aec
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/34248
Tested-by: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Device/Sampler.hpp b/src/Device/Sampler.hpp
index 9d80a3b..b348a80 100644
--- a/src/Device/Sampler.hpp
+++ b/src/Device/Sampler.hpp
@@ -52,26 +52,6 @@
float4 depth;
};
- enum SamplerType
- {
- SAMPLER_PIXEL,
- SAMPLER_VERTEX
- };
-
- enum TextureType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
- {
- TEXTURE_NULL, // TODO(b/129523279): Eliminate
- TEXTURE_1D,
- TEXTURE_2D,
- TEXTURE_3D,
- TEXTURE_CUBE,
- TEXTURE_1D_ARRAY, // Treated as 2D texture with second coordinate 0. TODO(b/134669567)
- TEXTURE_2D_ARRAY,
- TEXTURE_CUBE_ARRAY,
-
- TEXTURE_LAST = TEXTURE_CUBE_ARRAY
- };
-
enum FilterType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
{
FILTER_POINT,
@@ -109,36 +89,9 @@
ADDRESSING_LAST = ADDRESSING_TEXELFETCH
};
- enum CompareFunc ENUM_UNDERLYING_TYPE_UNSIGNED_INT
- {
- COMPARE_BYPASS,
- COMPARE_LESSEQUAL,
- COMPARE_GREATEREQUAL,
- COMPARE_LESS,
- COMPARE_GREATER,
- COMPARE_EQUAL,
- COMPARE_NOTEQUAL,
- COMPARE_ALWAYS,
- COMPARE_NEVER,
-
- COMPARE_LAST = COMPARE_NEVER
- };
-
- enum SwizzleType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
- {
- SWIZZLE_RED,
- SWIZZLE_GREEN,
- SWIZZLE_BLUE,
- SWIZZLE_ALPHA,
- SWIZZLE_ZERO,
- SWIZZLE_ONE,
-
- SWIZZLE_LAST = SWIZZLE_ONE
- };
-
struct Sampler
{
- TextureType textureType;
+ VkImageViewType textureType;
vk::Format textureFormat;
FilterType textureFilter;
AddressingMode addressingModeU;
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp
index d832bcb..3c2dc9a 100644
--- a/src/Pipeline/SamplerCore.cpp
+++ b/src/Pipeline/SamplerCore.cpp
@@ -68,7 +68,7 @@
Float4 vDelta;
Float4 M; // Major axis
- if(state.textureType == TEXTURE_CUBE)
+ if(state.textureType == VK_IMAGE_VIEW_TYPE_CUBE)
{
Int4 face = cubeFace(uuuu, vvvv, u, v, w, M);
wwww = As<Float4>(face);
@@ -76,9 +76,9 @@
if(function == Implicit || function == Bias || function == Grad || function == Query)
{
- if(state.textureType != TEXTURE_3D)
+ if(state.textureType != VK_IMAGE_VIEW_TYPE_3D)
{
- if(state.textureType != TEXTURE_CUBE)
+ if(state.textureType != VK_IMAGE_VIEW_TYPE_CUBE)
{
computeLod(texture, sampler, lod, anisotropy, uDelta, vDelta, uuuu, vvvv, dsx, dsy, function);
}
@@ -446,7 +446,7 @@
Vector4s SamplerCore::sampleQuad(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Vector4f &offset, Float &lod, bool secondLOD, SamplerFunction function)
{
- if(state.textureType != TEXTURE_3D)
+ if(state.textureType != VK_IMAGE_VIEW_TYPE_3D)
{
return sampleQuad2D(texture, u, v, w, offset, lod, secondLOD, function);
}
@@ -867,7 +867,7 @@
Vector4f SamplerCore::sampleFloat(Pointer<Byte> &texture, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &offset, Float &lod, bool secondLOD, SamplerFunction function)
{
- if(state.textureType != TEXTURE_3D)
+ if(state.textureType != VK_IMAGE_VIEW_TYPE_3D)
{
return sampleFloat2D(texture, u, v, w, q, offset, lod, secondLOD, function);
}
@@ -1288,7 +1288,7 @@
if(hasThirdCoordinate())
{
- if(state.textureType == TEXTURE_3D)
+ if(state.textureType == VK_IMAGE_VIEW_TYPE_3D)
{
if(!texelFetch)
{
@@ -2361,9 +2361,9 @@
bool SamplerCore::hasThirdCoordinate() const
{
- return (state.textureType == TEXTURE_3D) ||
- (state.textureType == TEXTURE_2D_ARRAY) ||
- (state.textureType == TEXTURE_1D_ARRAY); // Treated as 2D texture with second coordinate 0. TODO(b/134669567)
+ return (state.textureType == VK_IMAGE_VIEW_TYPE_3D) ||
+ (state.textureType == VK_IMAGE_VIEW_TYPE_2D_ARRAY) ||
+ (state.textureType == VK_IMAGE_VIEW_TYPE_1D_ARRAY); // Treated as 2D texture with second coordinate 0. TODO(b/134669567)
}
bool SamplerCore::has16bitTextureFormat() const
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 1066da5..2c78203 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -1235,7 +1235,6 @@
static std::shared_ptr<rr::Routine> emitSamplerRoutine(ImageInstruction instruction, const Sampler &samplerState);
// TODO(b/129523279): Eliminate conversion and use vk::Sampler members directly.
- static sw::TextureType convertTextureType(VkImageViewType imageViewType);
static sw::FilterType convertFilterMode(const vk::Sampler *sampler);
static sw::MipmapType convertMipmapMode(const vk::Sampler *sampler);
static sw::AddressingMode convertAddressingMode(int coordinateIndex, VkSamplerAddressMode addressMode, VkImageViewType imageViewType);
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp
index 6a232fd..9013bf6 100644
--- a/src/Pipeline/SpirvShaderSampling.cpp
+++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -57,7 +57,7 @@
auto type = imageDescriptor->type;
Sampler samplerState = {};
- samplerState.textureType = convertTextureType(type);
+ samplerState.textureType = type;
samplerState.textureFormat = imageDescriptor->format;
samplerState.textureFilter = (instruction.samplerMethod == Gather) ? FILTER_GATHER : convertFilterMode(sampler);
samplerState.border = sampler->borderColor;
@@ -128,11 +128,11 @@
// TODO(b/134669567): Currently 1D textures are treated as 2D by setting the second coordinate to 0.
// Implement optimized 1D sampling.
- if(samplerState.textureType == TEXTURE_1D)
+ if(samplerState.textureType == VK_IMAGE_VIEW_TYPE_1D)
{
uvw[1] = SIMD::Float(0);
}
- else if(samplerState.textureType == TEXTURE_1D_ARRAY)
+ else if(samplerState.textureType == VK_IMAGE_VIEW_TYPE_1D_ARRAY)
{
uvw[1] = SIMD::Float(0);
uvw[2] = in[1]; // Move 1D layer coordinate to 2D layer coordinate index.
@@ -185,7 +185,7 @@
dPdy.z = Pointer<Float>(&dsy.z)[i];
// 1D textures are treated as 2D texture with second coordinate 0, so we also need to zero out the second grad component. TODO(b/134669567)
- if(samplerState.textureType == TEXTURE_1D || samplerState.textureType == TEXTURE_1D_ARRAY)
+ if(samplerState.textureType == VK_IMAGE_VIEW_TYPE_1D || samplerState.textureType == VK_IMAGE_VIEW_TYPE_1D_ARRAY)
{
dPdx.y = Float(0.0f);
dPdy.y = Float(0.0f);
@@ -215,23 +215,6 @@
return function("sampler");
}
-sw::TextureType SpirvShader::convertTextureType(VkImageViewType imageViewType)
-{
- switch(imageViewType)
- {
- case VK_IMAGE_VIEW_TYPE_1D: return TEXTURE_1D;
- 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_2D_ARRAY: return TEXTURE_2D_ARRAY;
-// case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return TEXTURE_CUBE_ARRAY;
- default:
- UNIMPLEMENTED("imageViewType %d", imageViewType);
- return TEXTURE_2D;
- }
-}
-
sw::FilterType SpirvShader::convertFilterMode(const vk::Sampler *sampler)
{
switch(sampler->magFilter)