Commit 5989fab7 by Nicolas Capens

Implement support for separate minification/magnification filters.

Bug 22373253 Change-Id: Iaa30a341e5eaa58c2ef531fce503631828c5ee9d Reviewed-on: https://swiftshader-review.googlesource.com/4757Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 2783c42f
...@@ -620,27 +620,19 @@ namespace es2sw ...@@ -620,27 +620,19 @@ namespace es2sw
return sw::FILTER_ANISOTROPIC; return sw::FILTER_ANISOTROPIC;
} }
sw::FilterType magFilterType = sw::FILTER_POINT;
switch(magFilter)
{
case GL_NEAREST: magFilterType = sw::FILTER_POINT; break;
case GL_LINEAR: magFilterType = sw::FILTER_LINEAR; break;
default: UNREACHABLE(magFilter);
}
switch(minFilter) switch(minFilter)
{ {
case GL_NEAREST: case GL_NEAREST:
case GL_NEAREST_MIPMAP_NEAREST: case GL_NEAREST_MIPMAP_NEAREST:
case GL_NEAREST_MIPMAP_LINEAR: case GL_NEAREST_MIPMAP_LINEAR:
return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR; return (magFilter == GL_NEAREST) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR;
case GL_LINEAR: case GL_LINEAR:
case GL_LINEAR_MIPMAP_NEAREST: case GL_LINEAR_MIPMAP_NEAREST:
case GL_LINEAR_MIPMAP_LINEAR: case GL_LINEAR_MIPMAP_LINEAR:
return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_MIN_LINEAR_MAG_POINT : sw::FILTER_LINEAR; return (magFilter == GL_NEAREST) ? sw::FILTER_MIN_LINEAR_MAG_POINT : sw::FILTER_LINEAR;
default: default:
UNREACHABLE(minFilter); UNREACHABLE(minFilter);
return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR; return sw::FILTER_LINEAR;
} }
} }
......
...@@ -556,26 +556,37 @@ namespace sw ...@@ -556,26 +556,37 @@ namespace sw
mask = As<Int4>(CmpLT(Abs(coordinates - Float4(0.5f)), Float4(0.5f))); mask = As<Int4>(CmpLT(Abs(coordinates - Float4(0.5f)), Float4(0.5f)));
} }
Short4 SamplerCore::offsetSample(Short4 &uvw, Pointer<Byte> &mipmap, int halfOffset, bool wrap, int count) Short4 SamplerCore::offsetSample(Short4 &uvw, Pointer<Byte> &mipmap, int halfOffset, bool wrap, int count, Float &lod)
{ {
Short4 offset = *Pointer<Short4>(mipmap + halfOffset);
if(state.textureFilter == FILTER_MIN_LINEAR_MAG_POINT)
{
offset &= Short4(CmpNLE(Float4(lod), Float4(0.0f)));
}
else if(state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
{
offset &= Short4(CmpLE(Float4(lod), Float4(0.0f)));
}
if(wrap) if(wrap)
{ {
switch(count) switch(count)
{ {
case -1: return uvw - *Pointer<Short4>(mipmap + halfOffset); case -1: return uvw - offset;
case 0: return uvw; case 0: return uvw;
case +1: return uvw + *Pointer<Short4>(mipmap + halfOffset); case +1: return uvw + offset;
case 2: return uvw + *Pointer<Short4>(mipmap + halfOffset) + *Pointer<Short4>(mipmap + halfOffset); case 2: return uvw + offset + offset;
} }
} }
else // Clamp or mirror else // Clamp or mirror
{ {
switch(count) switch(count)
{ {
case -1: return SubSat(As<UShort4>(uvw), *Pointer<UShort4>(mipmap + halfOffset)); case -1: return SubSat(As<UShort4>(uvw), As<UShort4>(offset));
case 0: return uvw; case 0: return uvw;
case +1: return AddSat(As<UShort4>(uvw), *Pointer<UShort4>(mipmap + halfOffset)); case +1: return AddSat(As<UShort4>(uvw), As<UShort4>(offset));
case 2: return AddSat(AddSat(As<UShort4>(uvw), *Pointer<UShort4>(mipmap + halfOffset)), *Pointer<UShort4>(mipmap + halfOffset)); case 2: return AddSat(AddSat(As<UShort4>(uvw), As<UShort4>(offset)), As<UShort4>(offset));
} }
} }
...@@ -760,7 +771,7 @@ namespace sw ...@@ -760,7 +771,7 @@ namespace sw
Short4 vvvv = address(v, state.addressingModeV, mipmap); Short4 vvvv = address(v, state.addressingModeV, mipmap);
Short4 wwww = address(w, state.addressingModeW, mipmap); Short4 wwww = address(w, state.addressingModeW, mipmap);
if(state.textureFilter == FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR) if(state.textureFilter == FILTER_POINT)
{ {
sampleTexel(c, uuuu, vvvv, wwww, mipmap, buffer); sampleTexel(c, uuuu, vvvv, wwww, mipmap, buffer);
} }
...@@ -771,10 +782,10 @@ namespace sw ...@@ -771,10 +782,10 @@ namespace sw
Vector4s c2; Vector4s c2;
Vector4s c3; Vector4s c3;
Short4 uuuu0 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, gather ? 0 : -1); Short4 uuuu0 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, gather ? 0 : -1, lod);
Short4 vvvv0 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, gather ? 0 : -1); Short4 vvvv0 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, gather ? 0 : -1, lod);
Short4 uuuu1 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, gather ? 2 : +1); Short4 uuuu1 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, gather ? 2 : +1, lod);
Short4 vvvv1 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, gather ? 2 : +1); Short4 vvvv1 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, gather ? 2 : +1, lod);
sampleTexel(c0, uuuu0, vvvv0, wwww, mipmap, buffer); sampleTexel(c0, uuuu0, vvvv0, wwww, mipmap, buffer);
sampleTexel(c1, uuuu1, vvvv0, wwww, mipmap, buffer); sampleTexel(c1, uuuu1, vvvv0, wwww, mipmap, buffer);
...@@ -965,7 +976,7 @@ namespace sw ...@@ -965,7 +976,7 @@ namespace sw
Short4 vvvv = address(v_, state.addressingModeV, mipmap); Short4 vvvv = address(v_, state.addressingModeV, mipmap);
Short4 wwww = address(w_, state.addressingModeW, mipmap); Short4 wwww = address(w_, state.addressingModeW, mipmap);
if(state.textureFilter <= FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR) if(state.textureFilter == FILTER_POINT)
{ {
sampleTexel(c_, uuuu, vvvv, wwww, mipmap, buffer); sampleTexel(c_, uuuu, vvvv, wwww, mipmap, buffer);
} }
...@@ -983,9 +994,9 @@ namespace sw ...@@ -983,9 +994,9 @@ namespace sw
{ {
for(int k = 0; k < 2; k++) for(int k = 0; k < 2; k++)
{ {
u[i][j][k] = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, i * 2 - 1); u[i][j][k] = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, i * 2 - 1, lod);
v[i][j][k] = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, j * 2 - 1); v[i][j][k] = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, j * 2 - 1, lod);
s[i][j][k] = offsetSample(wwww, mipmap, OFFSET(Mipmap,wHalf), state.addressingModeW == ADDRESSING_WRAP, k * 2 - 1); s[i][j][k] = offsetSample(wwww, mipmap, OFFSET(Mipmap,wHalf), state.addressingModeW == ADDRESSING_WRAP, k * 2 - 1, lod);
} }
} }
} }
...@@ -1237,7 +1248,7 @@ namespace sw ...@@ -1237,7 +1248,7 @@ namespace sw
Short4 vvvv = address(v, state.addressingModeV, mipmap); Short4 vvvv = address(v, state.addressingModeV, mipmap);
Short4 wwww = address(w, state.addressingModeW, mipmap); Short4 wwww = address(w, state.addressingModeW, mipmap);
if(state.textureFilter == FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR) if(state.textureFilter == FILTER_POINT)
{ {
sampleTexel(c, uuuu, vvvv, wwww, w, mipmap, buffer); sampleTexel(c, uuuu, vvvv, wwww, w, mipmap, buffer);
} }
...@@ -1248,10 +1259,10 @@ namespace sw ...@@ -1248,10 +1259,10 @@ namespace sw
Vector4f c2; Vector4f c2;
Vector4f c3; Vector4f c3;
Short4 uuuu0 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, gather ? 0 : -1); Short4 uuuu0 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, gather ? 0 : -1, lod);
Short4 vvvv0 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, gather ? 0 : -1); Short4 vvvv0 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, gather ? 0 : -1, lod);
Short4 uuuu1 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, gather ? 2 : +1); Short4 uuuu1 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, gather ? 2 : +1, lod);
Short4 vvvv1 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, gather ? 2 : +1); Short4 vvvv1 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, gather ? 2 : +1, lod);
sampleTexel(c0, uuuu0, vvvv0, wwww, w, mipmap, buffer); sampleTexel(c0, uuuu0, vvvv0, wwww, w, mipmap, buffer);
sampleTexel(c1, uuuu1, vvvv0, wwww, w, mipmap, buffer); sampleTexel(c1, uuuu1, vvvv0, wwww, w, mipmap, buffer);
...@@ -1303,7 +1314,7 @@ namespace sw ...@@ -1303,7 +1314,7 @@ namespace sw
Short4 vvvv = address(v, state.addressingModeV, mipmap); Short4 vvvv = address(v, state.addressingModeV, mipmap);
Short4 wwww = address(w, state.addressingModeW, mipmap); Short4 wwww = address(w, state.addressingModeW, mipmap);
if(state.textureFilter <= FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR) if(state.textureFilter == FILTER_POINT)
{ {
sampleTexel(c, uuuu, vvvv, wwww, w, mipmap, buffer); sampleTexel(c, uuuu, vvvv, wwww, w, mipmap, buffer);
} }
...@@ -1318,12 +1329,12 @@ namespace sw ...@@ -1318,12 +1329,12 @@ namespace sw
Vector4f c6; Vector4f c6;
Vector4f c7; Vector4f c7;
Short4 uuuu0 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, -1); Short4 uuuu0 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, -1, lod);
Short4 vvvv0 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, -1); Short4 vvvv0 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, -1, lod);
Short4 wwww0 = offsetSample(wwww, mipmap, OFFSET(Mipmap,wHalf), state.addressingModeW == ADDRESSING_WRAP, -1); Short4 wwww0 = offsetSample(wwww, mipmap, OFFSET(Mipmap,wHalf), state.addressingModeW == ADDRESSING_WRAP, -1, lod);
Short4 uuuu1 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, +1); Short4 uuuu1 = offsetSample(uuuu, mipmap, OFFSET(Mipmap,uHalf), state.addressingModeU == ADDRESSING_WRAP, +1, lod);
Short4 vvvv1 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, +1); Short4 vvvv1 = offsetSample(vvvv, mipmap, OFFSET(Mipmap,vHalf), state.addressingModeV == ADDRESSING_WRAP, +1, lod);
Short4 wwww1 = offsetSample(wwww, mipmap, OFFSET(Mipmap,wHalf), state.addressingModeW == ADDRESSING_WRAP, +1); Short4 wwww1 = offsetSample(wwww, mipmap, OFFSET(Mipmap,wHalf), state.addressingModeW == ADDRESSING_WRAP, +1, lod);
sampleTexel(c0, uuuu0, vvvv0, wwww0, w, mipmap, buffer); sampleTexel(c0, uuuu0, vvvv0, wwww0, w, mipmap, buffer);
sampleTexel(c1, uuuu1, vvvv0, wwww0, w, mipmap, buffer); sampleTexel(c1, uuuu1, vvvv0, wwww0, w, mipmap, buffer);
......
...@@ -28,7 +28,7 @@ namespace sw ...@@ -28,7 +28,7 @@ namespace sw
private: private:
void border(Short4 &mask, Float4 &coordinates); void border(Short4 &mask, Float4 &coordinates);
void border(Int4 &mask, Float4 &coordinates); void border(Int4 &mask, Float4 &coordinates);
Short4 offsetSample(Short4 &uvw, Pointer<Byte> &mipmap, int halfOffset, bool wrap, int count); Short4 offsetSample(Short4 &uvw, Pointer<Byte> &mipmap, int halfOffset, bool wrap, int count, Float &lod);
void sampleFilter(Pointer<Byte> &texture, Vector4s &c, Float4 &u, Float4 &v, Float4 &w, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Int face[4], bool lodProvided); void sampleFilter(Pointer<Byte> &texture, Vector4s &c, Float4 &u, Float4 &v, Float4 &w, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Int face[4], bool lodProvided);
void sampleAniso(Pointer<Byte> &texture, Vector4s &c, Float4 &u, Float4 &v, Float4 &w, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Int face[4], bool secondLOD, bool lodProvided); void sampleAniso(Pointer<Byte> &texture, Vector4s &c, Float4 &u, Float4 &v, Float4 &w, Float &lod, Float &anisotropy, Float4 &uDelta, Float4 &vDelta, Int face[4], bool secondLOD, bool lodProvided);
void sampleQuad(Pointer<Byte> &texture, Vector4s &c, Float4 &u, Float4 &v, Float4 &w, Float &lod, Int face[4], bool secondLOD); void sampleQuad(Pointer<Byte> &texture, Vector4s &c, Float4 &u, Float4 &v, Float4 &w, Float &lod, Int face[4], bool secondLOD);
......
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