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/5510 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Meng-Lin Wu <marleymoo@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/PixelProcessor.cpp b/src/Renderer/PixelProcessor.cpp index 331d15a..7b6580a 100644 --- a/src/Renderer/PixelProcessor.cpp +++ b/src/Renderer/PixelProcessor.cpp
@@ -498,6 +498,24 @@ 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);
diff --git a/src/Renderer/PixelProcessor.hpp b/src/Renderer/PixelProcessor.hpp index a47da3f..7081809 100644 --- a/src/Renderer/PixelProcessor.hpp +++ b/src/Renderer/PixelProcessor.hpp
@@ -237,6 +237,8 @@ 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);
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp index 681ce37..df6a2c7 100644 --- a/src/Renderer/Renderer.cpp +++ b/src/Renderer/Renderer.cpp
@@ -2371,6 +2371,30 @@ } } + 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);
diff --git a/src/Renderer/Renderer.hpp b/src/Renderer/Renderer.hpp index 3fa3bae..5d9ef35 100644 --- a/src/Renderer/Renderer.hpp +++ b/src/Renderer/Renderer.hpp
@@ -347,6 +347,8 @@ 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);
diff --git a/src/Renderer/Sampler.cpp b/src/Renderer/Sampler.cpp index 5c434fe..93cca30 100644 --- a/src/Renderer/Sampler.cpp +++ b/src/Renderer/Sampler.cpp
@@ -73,6 +73,11 @@ 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 @@ 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;
diff --git a/src/Renderer/Sampler.hpp b/src/Renderer/Sampler.hpp index cbb0588..032bf58 100644 --- a/src/Renderer/Sampler.hpp +++ b/src/Renderer/Sampler.hpp
@@ -69,6 +69,8 @@ float maxAnisotropy; int baseLevel; int maxLevel; + float minLod; + float maxLod; }; enum SamplerType @@ -182,6 +184,8 @@ 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);
diff --git a/src/Renderer/VertexProcessor.cpp b/src/Renderer/VertexProcessor.cpp index 2b0a97f..402e11a 100644 --- a/src/Renderer/VertexProcessor.cpp +++ b/src/Renderer/VertexProcessor.cpp
@@ -656,6 +656,24 @@ 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);
diff --git a/src/Renderer/VertexProcessor.hpp b/src/Renderer/VertexProcessor.hpp index 3df2ad8..2f8122a 100644 --- a/src/Renderer/VertexProcessor.hpp +++ b/src/Renderer/VertexProcessor.hpp
@@ -262,6 +262,8 @@ 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);