Commit b1670ed4 by Nicolas Capens Committed by Nicolas Capens

Refactor duplicate mipmap LOD calculation

Bug: b/129523279 Change-Id: If4dfa5900ac73643cc8a8052867434d62fa1aa1e Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30430 Presubmit-Ready: Nicolas Capens <nicolascapens@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarChris Forbes <chrisforbes@google.com>
parent 7179935f
...@@ -74,7 +74,15 @@ namespace sw ...@@ -74,7 +74,15 @@ namespace sw
Float anisotropy; Float anisotropy;
Float4 uDelta; Float4 uDelta;
Float4 vDelta; Float4 vDelta;
Float4 M; // Major axis
if(state.textureType == TEXTURE_CUBE)
{
cubeFace(face, uuuu, vvvv, u, v, w, M);
}
if(function == Implicit || function == Bias || function == Grad)
{
if(state.textureType != TEXTURE_3D) if(state.textureType != TEXTURE_3D)
{ {
if(state.textureType != TEXTURE_CUBE) if(state.textureType != TEXTURE_CUBE)
...@@ -83,8 +91,6 @@ namespace sw ...@@ -83,8 +91,6 @@ namespace sw
} }
else else
{ {
Float4 M;
cubeFace(face, uuuu, vvvv, u, v, w, M);
computeLodCube(texture, sampler, lod, u, v, w, lodOrBias.x, dsx, dsy, M, function); computeLodCube(texture, sampler, lod, u, v, w, lodOrBias.x, dsx, dsy, M, function);
} }
} }
...@@ -93,6 +99,32 @@ namespace sw ...@@ -93,6 +99,32 @@ namespace sw
computeLod3D(texture, sampler, lod, uuuu, vvvv, wwww, lodOrBias.x, dsx, dsy, function); computeLod3D(texture, sampler, lod, uuuu, vvvv, wwww, lodOrBias.x, dsx, dsy, function);
} }
if(function == Bias)
{
lod += lodOrBias.x;
}
}
else if(function == Lod)
{
lod = lodOrBias.x;
}
else if(function == Fetch)
{
// TODO: Eliminate int-float-int conversion.
lod = Float(As<Int>(Float(lodOrBias.x)));
}
else if(function == Base)
{
lod = Float(0);
}
else UNREACHABLE("Sampler function %d", int(function));
if(function != Base)
{
lod = Max(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, minLod)));
lod = Min(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, maxLod)));
}
// FIXME: YUV is not supported by the floating point path // FIXME: YUV is not supported by the floating point path
bool forceFloatFiltering = state.highPrecisionFiltering && !hasYuvFormat() && (state.textureFilter != FILTER_POINT); bool forceFloatFiltering = state.highPrecisionFiltering && !hasYuvFormat() && (state.textureFilter != FILTER_POINT);
bool seamlessCube = (state.addressingModeU == ADDRESSING_SEAMLESS); bool seamlessCube = (state.addressingModeU == ADDRESSING_SEAMLESS);
...@@ -1156,8 +1188,6 @@ namespace sw ...@@ -1156,8 +1188,6 @@ namespace sw
void SamplerCore::computeLod(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Float4 &uuuu, Float4 &vvvv, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function) void SamplerCore::computeLod(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Float4 &uuuu, Float4 &vvvv, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function)
{ {
if(function != Lod && function != Fetch)
{
Float4 duvdxy; Float4 duvdxy;
if(function != Grad) // Implicit if(function != Grad) // Implicit
...@@ -1200,35 +1230,10 @@ namespace sw ...@@ -1200,35 +1230,10 @@ namespace sw
} }
lod = log2sqrt(lod); // log2(sqrt(lod)) lod = log2sqrt(lod); // log2(sqrt(lod))
if(function == Bias)
{
lod += lodOrBias;
}
}
else if(function == Lod)
{
lod = lodOrBias;
}
else if(function == Fetch)
{
// TODO: Eliminate int-float-int conversion.
lod = Float(As<Int>(lodOrBias));
}
else if(function == Base)
{
lod = Float(0);
}
else assert(false);
lod = Max(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, minLod)));
lod = Min(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, maxLod)));
} }
void SamplerCore::computeLodCube(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float4 &u, Float4 &v, Float4 &w, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, Float4 &M, SamplerFunction function) void SamplerCore::computeLodCube(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float4 &u, Float4 &v, Float4 &w, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, Float4 &M, SamplerFunction function)
{ {
if(function != Lod && function != Fetch)
{
Float4 dudxy, dvdxy, dsdxy; Float4 dudxy, dvdxy, dsdxy;
if(function != Grad) // Implicit if(function != Grad) // Implicit
...@@ -1262,39 +1267,14 @@ namespace sw ...@@ -1262,39 +1267,14 @@ namespace sw
lod = Max(Float(dudxy.y), Float(dudxy.z)); // FIXME: Max(dudxy.y, dudxy.z); lod = Max(Float(dudxy.y), Float(dudxy.z)); // FIXME: Max(dudxy.y, dudxy.z);
// Scale by texture dimension and global LOD. // Scale by texture dimension.
lod *= *Pointer<Float>(texture + OFFSET(Texture,width)); lod *= *Pointer<Float>(texture + OFFSET(Texture,width));
lod = log2(lod); lod = log2(lod);
if(function == Bias)
{
lod += lodOrBias;
}
}
else if(function == Lod)
{
lod = lodOrBias;
}
else if(function == Fetch)
{
// TODO: Eliminate int-float-int conversion.
lod = Float(As<Int>(lodOrBias));
}
else if(function == Base)
{
lod = Float(0);
}
else assert(false);
lod = Max(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, minLod)));
lod = Min(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, maxLod)));
} }
void SamplerCore::computeLod3D(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float4 &uuuu, Float4 &vvvv, Float4 &wwww, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function) void SamplerCore::computeLod3D(Pointer<Byte> &texture, Pointer<Byte> &sampler, Float &lod, Float4 &uuuu, Float4 &vvvv, Float4 &wwww, const Float &lodOrBias, Vector4f &dsx, Vector4f &dsy, SamplerFunction function)
{ {
if(function != Lod && function != Fetch)
{
Float4 dudxy, dvdxy, dsdxy; Float4 dudxy, dvdxy, dsdxy;
if(function != Grad) // Implicit if(function != Grad) // Implicit
...@@ -1310,7 +1290,7 @@ namespace sw ...@@ -1310,7 +1290,7 @@ namespace sw
dsdxy = Float4(dsx.z.xx, dsy.z.xx); dsdxy = Float4(dsx.z.xx, dsy.z.xx);
} }
// Scale by texture dimensions and global LOD. // Scale by texture dimensions.
dudxy *= *Pointer<Float4>(texture + OFFSET(Texture, width)); dudxy *= *Pointer<Float4>(texture + OFFSET(Texture, width));
dvdxy *= *Pointer<Float4>(texture + OFFSET(Texture, height)); dvdxy *= *Pointer<Float4>(texture + OFFSET(Texture, height));
dsdxy *= *Pointer<Float4>(texture + OFFSET(Texture, depth)); dsdxy *= *Pointer<Float4>(texture + OFFSET(Texture, depth));
...@@ -1325,29 +1305,6 @@ namespace sw ...@@ -1325,29 +1305,6 @@ namespace sw
lod = Max(Float(dudxy.y), Float(dudxy.z)); // FIXME: Max(dudxy.y, dudxy.z); lod = Max(Float(dudxy.y), Float(dudxy.z)); // FIXME: Max(dudxy.y, dudxy.z);
lod = log2sqrt(lod); // log2(sqrt(lod)) lod = log2sqrt(lod); // log2(sqrt(lod))
if(function == Bias)
{
lod += lodOrBias;
}
}
else if(function == Lod)
{
lod = lodOrBias;
}
else if(function == Fetch)
{
// TODO: Eliminate int-float-int conversion.
lod = Float(As<Int>(lodOrBias));
}
else if(function == Base)
{
lod = Float(0);
}
else assert(false);
lod = Max(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, minLod)));
lod = Min(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, maxLod)));
} }
void SamplerCore::cubeFace(Int face[4], Float4 &U, Float4 &V, Float4 &x, Float4 &y, Float4 &z, Float4 &M) void SamplerCore::cubeFace(Int face[4], Float4 &U, Float4 &V, Float4 &x, Float4 &y, Float4 &z, Float4 &M)
......
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