Commit a202c209 by Nicolas Capens Committed by Nicolas Capens

Refactor discerning image view types

Bug: b/162315264 Change-Id: I92cca44ad78aea9fcdcb8e0bc0f3c2c1ff28f19f Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/47508 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent a00fa437
...@@ -114,19 +114,99 @@ struct Sampler ...@@ -114,19 +114,99 @@ struct Sampler
float minLod = 0.0f; float minLod = 0.0f;
float maxLod = 0.0f; float maxLod = 0.0f;
bool isArrayed() const bool is1D() const
{ {
switch(textureType) switch(textureType)
{ {
case VK_IMAGE_VIEW_TYPE_1D: case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
return true;
case VK_IMAGE_VIEW_TYPE_2D: case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_3D: case VK_IMAGE_VIEW_TYPE_3D:
case VK_IMAGE_VIEW_TYPE_CUBE: case VK_IMAGE_VIEW_TYPE_CUBE:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return false;
default:
UNSUPPORTED("VkImageViewType %d", (int)textureType);
}
return false;
}
bool is2D() const
{
switch(textureType)
{
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
return true;
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_3D:
case VK_IMAGE_VIEW_TYPE_CUBE:
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return false;
default:
UNSUPPORTED("VkImageViewType %d", (int)textureType);
}
return false;
}
bool is3D() const
{
switch(textureType)
{
case VK_IMAGE_VIEW_TYPE_3D:
return true;
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_CUBE:
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return false; return false;
default:
UNSUPPORTED("VkImageViewType %d", (int)textureType);
}
return false;
}
bool isCube() const
{
switch(textureType)
{
case VK_IMAGE_VIEW_TYPE_CUBE:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return true;
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_2D_ARRAY:
return false;
default:
UNSUPPORTED("VkImageViewType %d", (int)textureType);
}
return false;
}
bool isArrayed() const
{
switch(textureType)
{
case VK_IMAGE_VIEW_TYPE_1D_ARRAY: case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
case VK_IMAGE_VIEW_TYPE_2D_ARRAY: case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
return true; return true;
case VK_IMAGE_VIEW_TYPE_1D:
case VK_IMAGE_VIEW_TYPE_2D:
case VK_IMAGE_VIEW_TYPE_3D:
case VK_IMAGE_VIEW_TYPE_CUBE:
return false;
default: default:
UNSUPPORTED("VkImageViewType %d", (int)textureType); UNSUPPORTED("VkImageViewType %d", (int)textureType);
} }
......
...@@ -50,7 +50,7 @@ Vector4f SamplerCore::sampleTexture(Pointer<Byte> &texture, Float4 uvwa[4], Floa ...@@ -50,7 +50,7 @@ Vector4f SamplerCore::sampleTexture(Pointer<Byte> &texture, Float4 uvwa[4], Floa
Float4 vDelta; Float4 vDelta;
Float4 M; // Major axis Float4 M; // Major axis
if(isCube()) if(state.isCube())
{ {
Int4 face = cubeFace(u, v, uvwa[0], uvwa[1], uvwa[2], M); Int4 face = cubeFace(u, v, uvwa[0], uvwa[1], uvwa[2], M);
w = As<Float4>(face); w = As<Float4>(face);
...@@ -58,15 +58,15 @@ Vector4f SamplerCore::sampleTexture(Pointer<Byte> &texture, Float4 uvwa[4], Floa ...@@ -58,15 +58,15 @@ Vector4f SamplerCore::sampleTexture(Pointer<Byte> &texture, Float4 uvwa[4], Floa
if(function == Implicit || function == Bias || function == Grad || function == Query) if(function == Implicit || function == Bias || function == Grad || function == Query)
{ {
if(state.addressingModeV == ADDRESSING_UNUSED) if(state.is1D())
{ {
computeLod1D(texture, lod, u, dsx, dsy, function); computeLod1D(texture, lod, u, dsx, dsy, function);
} }
else if(state.addressingModeW == ADDRESSING_UNUSED) else if(state.is2D())
{ {
computeLod2D(texture, lod, anisotropy, uDelta, vDelta, u, v, dsx, dsy, function); computeLod2D(texture, lod, anisotropy, uDelta, vDelta, u, v, dsx, dsy, function);
} }
else if(isCube()) else if(state.isCube())
{ {
computeLodCube(texture, lod, uvwa[0], uvwa[1], uvwa[2], dsx, dsy, M, function); computeLodCube(texture, lod, uvwa[0], uvwa[1], uvwa[2], dsx, dsy, M, function);
} }
...@@ -128,9 +128,8 @@ Vector4f SamplerCore::sampleTexture(Pointer<Byte> &texture, Float4 uvwa[4], Floa ...@@ -128,9 +128,8 @@ Vector4f SamplerCore::sampleTexture(Pointer<Byte> &texture, Float4 uvwa[4], Floa
} }
bool force32BitFiltering = state.highPrecisionFiltering && !isYcbcrFormat() && (state.textureFilter != FILTER_POINT); bool force32BitFiltering = state.highPrecisionFiltering && !isYcbcrFormat() && (state.textureFilter != FILTER_POINT);
bool seamlessCube = (state.addressingModeU == ADDRESSING_SEAMLESS);
bool use32BitFiltering = hasFloatTexture() || hasUnnormalizedIntegerTexture() || force32BitFiltering || bool use32BitFiltering = hasFloatTexture() || hasUnnormalizedIntegerTexture() || force32BitFiltering ||
seamlessCube || state.unnormalizedCoordinates || state.compareEnable || state.isCube() || state.unnormalizedCoordinates || state.compareEnable ||
borderModeActive() || (function == Gather) || (function == Fetch); borderModeActive() || (function == Gather) || (function == Fetch);
if(use32BitFiltering) if(use32BitFiltering)
...@@ -978,7 +977,7 @@ Vector4f SamplerCore::sampleFloat2D(Pointer<Byte> &texture, Float4 &u, Float4 &v ...@@ -978,7 +977,7 @@ Vector4f SamplerCore::sampleFloat2D(Pointer<Byte> &texture, Float4 &u, Float4 &v
y0 *= pitchP; y0 *= pitchP;
Int4 z; Int4 z;
if(state.addressingModeW == ADDRESSING_CUBEFACE || state.isArrayed()) if(state.isCube() || state.isArrayed())
{ {
Int4 face = As<Int4>(w); Int4 face = As<Int4>(w);
Int4 layerIndex = computeLayerIndex(a, mipmap, function); Int4 layerIndex = computeLayerIndex(a, mipmap, function);
...@@ -989,7 +988,7 @@ Vector4f SamplerCore::sampleFloat2D(Pointer<Byte> &texture, Float4 &u, Float4 &v ...@@ -989,7 +988,7 @@ Vector4f SamplerCore::sampleFloat2D(Pointer<Byte> &texture, Float4 &u, Float4 &v
layerIndex *= Int4(6); layerIndex *= Int4(6);
} }
z = (state.addressingModeW == ADDRESSING_CUBEFACE) ? face : layerIndex; z = state.isCube() ? face : layerIndex;
if(state.textureType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) if(state.textureType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
{ {
...@@ -1391,7 +1390,7 @@ void SamplerCore::computeIndices(UInt index[4], Short4 uuuu, Short4 vvvv, Short4 ...@@ -1391,7 +1390,7 @@ void SamplerCore::computeIndices(UInt index[4], Short4 uuuu, Short4 vvvv, Short4
UInt4 indices = Int4(uuuu); UInt4 indices = Int4(uuuu);
if(state.addressingModeV != ADDRESSING_UNUSED) if(state.is2D() || state.is3D() || state.isCube())
{ {
vvvv = MulHigh(As<UShort4>(vvvv), UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, height)))); vvvv = MulHigh(As<UShort4>(vvvv), UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, height))));
...@@ -1408,7 +1407,7 @@ void SamplerCore::computeIndices(UInt index[4], Short4 uuuu, Short4 vvvv, Short4 ...@@ -1408,7 +1407,7 @@ void SamplerCore::computeIndices(UInt index[4], Short4 uuuu, Short4 vvvv, Short4
indices = UInt4(As<UInt2>(i01), As<UInt2>(i23)); indices = UInt4(As<UInt2>(i01), As<UInt2>(i23));
} }
if(state.textureType == VK_IMAGE_VIEW_TYPE_3D) if(state.is3D())
{ {
wwww = MulHigh(As<UShort4>(wwww), UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, depth)))); wwww = MulHigh(As<UShort4>(wwww), UShort4(*Pointer<Int4>(mipmap + OFFSET(Mipmap, depth))));
...@@ -1451,12 +1450,12 @@ void SamplerCore::computeIndices(UInt index[4], Int4 uuuu, Int4 vvvv, Int4 wwww, ...@@ -1451,12 +1450,12 @@ void SamplerCore::computeIndices(UInt index[4], Int4 uuuu, Int4 vvvv, Int4 wwww,
{ {
UInt4 indices = uuuu; UInt4 indices = uuuu;
if(state.addressingModeV != ADDRESSING_UNUSED) if(state.is2D() || state.is3D() || state.isCube())
{ {
indices += As<UInt4>(vvvv); indices += As<UInt4>(vvvv);
} }
if(state.addressingModeW != ADDRESSING_UNUSED || state.isArrayed()) if(state.is3D() || state.isCube() || state.isArrayed())
{ {
indices += As<UInt4>(wwww); indices += As<UInt4>(wwww);
} }
...@@ -1908,8 +1907,8 @@ Vector4f SamplerCore::sampleTexel(Int4 &uuuu, Int4 &vvvv, Int4 &wwww, Float4 &dR ...@@ -1908,8 +1907,8 @@ Vector4f SamplerCore::sampleTexel(Int4 &uuuu, Int4 &vvvv, Int4 &wwww, Float4 &dR
{ {
// Valid texels have positive coordinates. // Valid texels have positive coordinates.
Int4 negative = uuuu; Int4 negative = uuuu;
if(state.addressingModeV != ADDRESSING_UNUSED) negative |= vvvv; if(state.is2D() || state.is3D() || state.isCube()) negative |= vvvv;
if(state.addressingModeW != ADDRESSING_UNUSED || state.isArrayed()) negative |= wwww; if(state.is3D() || state.isCube() || state.isArrayed()) negative |= wwww;
valid = CmpNLT(negative, Int4(0)); valid = CmpNLT(negative, Int4(0));
} }
...@@ -2588,12 +2587,6 @@ bool SamplerCore::borderModeActive() const ...@@ -2588,12 +2587,6 @@ bool SamplerCore::borderModeActive() const
state.addressingModeW == ADDRESSING_BORDER; state.addressingModeW == ADDRESSING_BORDER;
} }
bool SamplerCore::isCube() const
{
return state.textureType == VK_IMAGE_VIEW_TYPE_CUBE ||
state.textureType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
}
VkComponentSwizzle SamplerCore::gatherSwizzle() const VkComponentSwizzle SamplerCore::gatherSwizzle() const
{ {
switch(state.gatherComponent) switch(state.gatherComponent)
......
...@@ -107,7 +107,6 @@ private: ...@@ -107,7 +107,6 @@ private:
bool isYcbcrFormat() const; bool isYcbcrFormat() const;
bool isRGBComponent(int component) const; bool isRGBComponent(int component) const;
bool borderModeActive() const; bool borderModeActive() const;
bool isCube() const;
VkComponentSwizzle gatherSwizzle() const; VkComponentSwizzle gatherSwizzle() const;
Pointer<Byte> &constants; Pointer<Byte> &constants;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment