Commit 112d81f1 by Alexis Hetu Committed by Alexis Hétu

Min LOD and Max LOD sampler parameters

Plumbing to send Min LOD and Max LOD from the Sampler object in the Context to the Renderer's texture's state. Change-Id: I6831a8e17d67e745d12a78176d566750d971ec76 Reviewed-on: https://swiftshader-review.googlesource.com/5510Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarMeng-Lin Wu <marleymoo@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 95ac1874
......@@ -3040,6 +3040,7 @@ void Context::applyTextures(sw::SamplerType samplerType)
if(texture->isSamplerComplete())
{
GLenum wrapS, wrapT, wrapR, minFilter, magFilter;
GLfloat minLOD, maxLOD;
Sampler *samplerObject = mState.sampler[textureUnit];
if(samplerObject)
......@@ -3049,6 +3050,8 @@ void Context::applyTextures(sw::SamplerType samplerType)
wrapR = samplerObject->getWrapR();
minFilter = samplerObject->getMinFilter();
magFilter = samplerObject->getMagFilter();
minLOD = samplerObject->getMinLod();
maxLOD = samplerObject->getMaxLod();
}
else
{
......@@ -3057,6 +3060,8 @@ void Context::applyTextures(sw::SamplerType samplerType)
wrapR = texture->getWrapR();
minFilter = texture->getMinFilter();
magFilter = texture->getMagFilter();
minLOD = texture->getMinLOD();
maxLOD = texture->getMaxLOD();
}
GLfloat maxAnisotropy = texture->getMaxAnisotropy();
......@@ -3074,6 +3079,8 @@ void Context::applyTextures(sw::SamplerType samplerType)
device->setSwizzleG(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleG));
device->setSwizzleB(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleB));
device->setSwizzleA(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleA));
device->setMinLod(samplerType, samplerIndex, minLOD);
device->setMaxLod(samplerType, samplerIndex, maxLOD);
device->setBaseLevel(samplerType, samplerIndex, baseLevel);
device->setMaxLevel(samplerType, samplerIndex, maxLevel);
......
......@@ -498,6 +498,24 @@ namespace sw
else ASSERT(false);
}
void PixelProcessor::setMinLod(unsigned int sampler, float minLod)
{
if(sampler < TEXTURE_IMAGE_UNITS)
{
context->sampler[sampler].setMinLod(minLod);
}
else ASSERT(false);
}
void PixelProcessor::setMaxLod(unsigned int sampler, float maxLod)
{
if(sampler < TEXTURE_IMAGE_UNITS)
{
context->sampler[sampler].setMaxLod(maxLod);
}
else ASSERT(false);
}
void PixelProcessor::setWriteSRGB(bool sRGB)
{
context->setWriteSRGB(sRGB);
......
......@@ -237,6 +237,8 @@ namespace sw
virtual void setSwizzleA(unsigned int sampler, SwizzleType swizzleA);
virtual void setBaseLevel(unsigned int sampler, int baseLevel);
virtual void setMaxLevel(unsigned int sampler, int maxLevel);
virtual void setMinLod(unsigned int sampler, float minLod);
virtual void setMaxLod(unsigned int sampler, float maxLod);
virtual void setWriteSRGB(bool sRGB);
virtual void setDepthBufferEnable(bool depthBufferEnable);
......
......@@ -2371,6 +2371,30 @@ namespace sw
}
}
void Renderer::setMinLod(SamplerType type, int sampler, float minLod)
{
if(type == SAMPLER_PIXEL)
{
PixelProcessor::setMinLod(sampler, minLod);
}
else
{
VertexProcessor::setMinLod(sampler, minLod);
}
}
void Renderer::setMaxLod(SamplerType type, int sampler, float maxLod)
{
if(type == SAMPLER_PIXEL)
{
PixelProcessor::setMaxLod(sampler, maxLod);
}
else
{
VertexProcessor::setMaxLod(sampler, maxLod);
}
}
void Renderer::setPointSpriteEnable(bool pointSpriteEnable)
{
context->setPointSpriteEnable(pointSpriteEnable);
......
......@@ -347,6 +347,8 @@ namespace sw
virtual void setSwizzleA(SamplerType type, int sampler, SwizzleType swizzleA);
virtual void setBaseLevel(SamplerType type, int sampler, int baseLevel);
virtual void setMaxLevel(SamplerType type, int sampler, int maxLevel);
virtual void setMinLod(SamplerType type, int sampler, float minLod);
virtual void setMaxLod(SamplerType type, int sampler, float maxLod);
virtual void setPointSpriteEnable(bool pointSpriteEnable);
virtual void setPointScaleEnable(bool pointScaleEnable);
......
......@@ -73,6 +73,11 @@ namespace sw
texture.LOD = 0.0f;
exp2LOD = 1.0f;
texture.baseLevel = 0;
texture.maxLevel = 1000;
texture.maxLod = 1000;
texture.minLod = -1000;
}
Sampler::~Sampler()
......@@ -344,6 +349,16 @@ namespace sw
texture.maxLevel = maxLevel;
}
void Sampler::setMinLod(float minLod)
{
texture.minLod = minLod;
}
void Sampler::setMaxLod(float maxLod)
{
texture.maxLod = maxLod;
}
void Sampler::setFilterQuality(FilterType maximumFilterQuality)
{
Sampler::maximumTextureFilterQuality = maximumFilterQuality;
......
......@@ -69,6 +69,8 @@ namespace sw
float maxAnisotropy;
int baseLevel;
int maxLevel;
float minLod;
float maxLod;
};
enum SamplerType
......@@ -182,6 +184,8 @@ namespace sw
void setSwizzleA(SwizzleType swizzleA);
void setBaseLevel(int baseLevel);
void setMaxLevel(int maxLevel);
void setMinLod(float minLod);
void setMaxLod(float maxLod);
static void setFilterQuality(FilterType maximumFilterQuality);
static void setMipmapQuality(MipmapType maximumFilterQuality);
......
......@@ -656,6 +656,24 @@ namespace sw
else ASSERT(false);
}
void VertexProcessor::setMinLod(unsigned int sampler, float minLod)
{
if(sampler < VERTEX_TEXTURE_IMAGE_UNITS)
{
context->sampler[TEXTURE_IMAGE_UNITS + sampler].setMinLod(minLod);
}
else ASSERT(false);
}
void VertexProcessor::setMaxLod(unsigned int sampler, float maxLod)
{
if(sampler < VERTEX_TEXTURE_IMAGE_UNITS)
{
context->sampler[TEXTURE_IMAGE_UNITS + sampler].setMaxLod(maxLod);
}
else ASSERT(false);
}
void VertexProcessor::setPointSize(float pointSize)
{
point.pointSize = replicate(pointSize);
......
......@@ -262,6 +262,8 @@ namespace sw
virtual void setSwizzleA(unsigned int sampler, SwizzleType swizzleA);
virtual void setBaseLevel(unsigned int sampler, int baseLevel);
virtual void setMaxLevel(unsigned int sampler, int maxLevel);
virtual void setMinLod(unsigned int sampler, float minLod);
virtual void setMaxLod(unsigned int sampler, float maxLod);
virtual void setPointSize(float pointSize);
virtual void setPointSizeMin(float pointSizeMin);
......
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