Commit f878d50b by Nicolas Capens Committed by Nicolas Capens

Pass down the texture compare state.

Depth format textures can have a comparison operation performed after their texels have been sampled. Change-Id: I49f6bb7fab9765265761144ee8b6b62439beb5a3 Reviewed-on: https://swiftshader-review.googlesource.com/5870Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 69bffb83
......@@ -50,8 +50,8 @@ public:
void setWrapR(GLenum wrapR) { mWrapModeR = wrapR; }
void setMinLod(GLfloat minLod) { mMinLod = minLod; }
void setMaxLod(GLfloat maxLod) { mMaxLod = maxLod; }
void setComparisonMode(GLenum comparisonMode) { mCompareMode = comparisonMode; }
void setComparisonFunc(GLenum comparisonFunc) { mCompareFunc = comparisonFunc; }
void setCompareMode(GLenum compareMode) { mCompareMode = compareMode; }
void setCompareFunc(GLenum compareFunc) { mCompareFunc = compareFunc; }
GLenum getMinFilter() const { return mMinFilter; }
GLenum getMagFilter() const { return mMagFilter; }
......@@ -60,8 +60,8 @@ public:
GLenum getWrapR() const { return mWrapModeR; }
GLfloat getMinLod() const { return mMinLod; }
GLfloat getMaxLod() const { return mMaxLod; }
GLenum getComparisonMode() const { return mCompareMode; }
GLenum getComparisonFunc() const { return mCompareFunc; }
GLenum getCompareMode() const { return mCompareMode; }
GLenum getCompareFunc() const { return mCompareFunc; }
private:
GLenum mMinFilter;
......
......@@ -1374,6 +1374,32 @@ namespace es2sw
return sw::ADDRESSING_WRAP;
}
sw::CompareFunc ConvertCompareFunc(GLenum compareFunc, GLenum compareMode)
{
if(compareMode == GL_COMPARE_REF_TO_TEXTURE)
{
switch(compareFunc)
{
case GL_LEQUAL: return sw::COMPARE_LESSEQUAL;
case GL_GEQUAL: return sw::COMPARE_GREATEREQUAL;
case GL_LESS: return sw::COMPARE_LESS;
case GL_GREATER: return sw::COMPARE_GREATER;
case GL_EQUAL: return sw::COMPARE_EQUAL;
case GL_NOTEQUAL: return sw::COMPARE_NOTEQUAL;
case GL_ALWAYS: return sw::COMPARE_ALWAYS;
case GL_NEVER: return sw::COMPARE_NEVER;
default: UNREACHABLE(compareFunc);
}
}
else if(compareMode == GL_NONE)
{
return sw::COMPARE_BYPASS;
}
else UNREACHABLE(compareMode);
return sw::COMPARE_BYPASS;
};
sw::SwizzleType ConvertSwizzleType(GLenum swizzleType)
{
switch(swizzleType)
......
......@@ -74,6 +74,7 @@ namespace es2sw
sw::LogicalOperation ConvertLogicalOperation(GLenum logicalOperation);
sw::StencilOperation ConvertStencilOp(GLenum stencilOp);
sw::AddressingMode ConvertTextureWrap(GLenum wrap);
sw::CompareFunc ConvertCompareFunc(GLenum compareFunc, GLenum compareMode);
sw::SwizzleType ConvertSwizzleType(GLenum swizzleType);
sw::CullMode ConvertCullMode(GLenum cullFace, GLenum frontFace);
unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha);
......
......@@ -489,6 +489,15 @@ namespace sw
else ASSERT(false);
}
void PixelProcessor::setCompareFunc(unsigned int sampler, CompareFunc compFunc)
{
if(sampler < TEXTURE_IMAGE_UNITS)
{
context->sampler[sampler].setCompareFunc(compFunc);
}
else ASSERT(false);
}
void PixelProcessor::setBaseLevel(unsigned int sampler, int baseLevel)
{
if(sampler < TEXTURE_IMAGE_UNITS)
......
......@@ -237,6 +237,7 @@ namespace sw
void setSwizzleG(unsigned int sampler, SwizzleType swizzleG);
void setSwizzleB(unsigned int sampler, SwizzleType swizzleB);
void setSwizzleA(unsigned int sampler, SwizzleType swizzleA);
void setCompareFunc(unsigned int sampler, CompareFunc compare);
void setBaseLevel(unsigned int sampler, int baseLevel);
void setMaxLevel(unsigned int sampler, int maxLevel);
void setMinLod(unsigned int sampler, float minLod);
......
......@@ -420,7 +420,7 @@ namespace sw
{
for(int sampler = 0; sampler < VERTEX_TEXTURE_IMAGE_UNITS; sampler++)
{
if(vertexState.samplerState[sampler].textureType != TEXTURE_NULL)
if(vertexState.sampler[sampler].textureType != TEXTURE_NULL)
{
draw->texture[TEXTURE_IMAGE_UNITS + sampler] = context->texture[TEXTURE_IMAGE_UNITS + sampler];
draw->texture[TEXTURE_IMAGE_UNITS + sampler]->lock(PUBLIC, PRIVATE);
......@@ -2388,6 +2388,18 @@ namespace sw
}
}
void Renderer::setCompareFunc(SamplerType type, int sampler, CompareFunc compFunc)
{
if(type == SAMPLER_PIXEL)
{
PixelProcessor::setCompareFunc(sampler, compFunc);
}
else
{
VertexProcessor::setCompareFunc(sampler, compFunc);
}
}
void Renderer::setBaseLevel(SamplerType type, int sampler, int baseLevel)
{
if(type == SAMPLER_PIXEL)
......
......@@ -348,6 +348,7 @@ namespace sw
void setSwizzleG(SamplerType type, int sampler, SwizzleType swizzleG);
void setSwizzleB(SamplerType type, int sampler, SwizzleType swizzleB);
void setSwizzleA(SamplerType type, int sampler, SwizzleType swizzleA);
void setCompareFunc(SamplerType type, int sampler, CompareFunc compare);
void setBaseLevel(SamplerType type, int sampler, int baseLevel);
void setMaxLevel(SamplerType type, int sampler, int maxLevel);
void setMinLod(SamplerType type, int sampler, float minLod);
......
......@@ -67,6 +67,8 @@ namespace sw
swizzleB = SWIZZLE_BLUE;
swizzleA = SWIZZLE_ALPHA;
compare = COMPARE_BYPASS;
texture.LOD = 0.0f;
exp2LOD = 1.0f;
......@@ -99,6 +101,7 @@ namespace sw
state.swizzleB = swizzleB;
state.swizzleA = swizzleA;
state.highPrecisionFiltering = highPrecisionFiltering;
state.compare = getCompareFunc();
#if PERF_PROFILE
state.compressedFormat = Surface::isCompressed(externalTextureFormat);
......@@ -332,6 +335,11 @@ namespace sw
this->swizzleA = swizzleA;
}
void Sampler::setCompareFunc(CompareFunc compare)
{
this->compare = compare;
}
void Sampler::setBaseLevel(int baseLevel)
{
texture.baseLevel = baseLevel;
......@@ -478,4 +486,19 @@ namespace sw
return addressingModeW;
}
CompareFunc Sampler::getCompareFunc() const
{
if(getTextureFilter() == FILTER_GATHER)
{
return COMPARE_BYPASS;
}
if(internalTextureFormat == FORMAT_D32FS8_SHADOW)
{
return COMPARE_LESSEQUAL;
}
return compare;
}
}
......@@ -110,6 +110,21 @@ namespace sw
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,
......@@ -142,6 +157,7 @@ namespace sw
SwizzleType swizzleB : BITS(SWIZZLE_LAST);
SwizzleType swizzleA : BITS(SWIZZLE_LAST);
bool highPrecisionFiltering : 1;
CompareFunc compare : BITS(COMPARE_LAST);
#if PERF_PROFILE
bool compressedFormat : 1;
......@@ -170,6 +186,7 @@ namespace sw
void setSwizzleG(SwizzleType swizzleG);
void setSwizzleB(SwizzleType swizzleB);
void setSwizzleA(SwizzleType swizzleA);
void setCompareFunc(CompareFunc compare);
void setBaseLevel(int baseLevel);
void setMaxLevel(int maxLevel);
void setMinLod(float minLod);
......@@ -193,6 +210,7 @@ namespace sw
AddressingMode getAddressingModeU() const;
AddressingMode getAddressingModeV() const;
AddressingMode getAddressingModeW() const;
CompareFunc getCompareFunc() const;
Format externalTextureFormat;
Format internalTextureFormat;
......@@ -211,6 +229,8 @@ namespace sw
SwizzleType swizzleG;
SwizzleType swizzleB;
SwizzleType swizzleA;
CompareFunc compare;
Texture texture;
float exp2LOD;
......
......@@ -647,6 +647,15 @@ namespace sw
else ASSERT(false);
}
void VertexProcessor::setCompareFunc(unsigned int sampler, CompareFunc compFunc)
{
if(sampler < VERTEX_TEXTURE_IMAGE_UNITS)
{
context->sampler[TEXTURE_IMAGE_UNITS + sampler].setCompareFunc(compFunc);
}
else ASSERT(false);
}
void VertexProcessor::setBaseLevel(unsigned int sampler, int baseLevel)
{
if(sampler < VERTEX_TEXTURE_IMAGE_UNITS)
......@@ -986,7 +995,7 @@ namespace sw
{
if(context->vertexShader->usesSampler(i))
{
state.samplerState[i] = context->sampler[TEXTURE_IMAGE_UNITS + i].samplerState();
state.sampler[i] = context->sampler[TEXTURE_IMAGE_UNITS + i].samplerState();
}
}
}
......
......@@ -91,7 +91,7 @@ namespace sw
TextureState textureState[8];
Sampler::State samplerState[VERTEX_TEXTURE_IMAGE_UNITS];
Sampler::State sampler[VERTEX_TEXTURE_IMAGE_UNITS];
struct Input
{
......@@ -263,6 +263,7 @@ namespace sw
void setSwizzleG(unsigned int sampler, SwizzleType swizzleG);
void setSwizzleB(unsigned int sampler, SwizzleType swizzleB);
void setSwizzleA(unsigned int sampler, SwizzleType swizzleA);
void setCompareFunc(unsigned int sampler, CompareFunc compare);
void setBaseLevel(unsigned int sampler, int baseLevel);
void setMaxLevel(unsigned int sampler, int maxLevel);
void setMinLod(unsigned int sampler, float minLod);
......
......@@ -68,7 +68,7 @@ namespace sw
{
for(int i = 0; i < VERTEX_TEXTURE_IMAGE_UNITS; i++)
{
sampler[i] = new SamplerCore(constants, state.samplerState[i]);
sampler[i] = new SamplerCore(constants, state.sampler[i]);
}
if(!state.preTransformed)
......
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