LOD Base level and Max level to sampler state Plumbing to send the LOD base level and max level from the Sampler object in the Context to the Renderer's texture's state. Change-Id: I5a9571f58a0cbaea8cedfb98da159672673eed94 Reviewed-on: https://swiftshader-review.googlesource.com/5501 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp index de4626b..9e024d3 100644 --- a/src/OpenGL/libGLESv2/Context.cpp +++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -3060,6 +3060,8 @@ } GLfloat maxAnisotropy = texture->getMaxAnisotropy(); + GLint baseLevel = texture->getBaseLevel(); + GLint maxLevel = texture->getMaxLevel(); GLenum swizzleR = texture->getSwizzleR(); GLenum swizzleG = texture->getSwizzleG(); GLenum swizzleB = texture->getSwizzleB(); @@ -3072,6 +3074,8 @@ device->setSwizzleG(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleG)); device->setSwizzleB(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleB)); device->setSwizzleA(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleA)); + device->setBaseLevel(samplerType, samplerIndex, baseLevel); + device->setMaxLevel(samplerType, samplerIndex, maxLevel); device->setTextureFilter(samplerType, samplerIndex, es2sw::ConvertTextureFilter(minFilter, magFilter, maxAnisotropy)); device->setMipmapFilter(samplerType, samplerIndex, es2sw::ConvertMipMapFilter(minFilter));
diff --git a/src/Renderer/PixelProcessor.cpp b/src/Renderer/PixelProcessor.cpp index a4bf461..331d15a 100644 --- a/src/Renderer/PixelProcessor.cpp +++ b/src/Renderer/PixelProcessor.cpp
@@ -480,6 +480,24 @@ else ASSERT(false); } + void PixelProcessor::setBaseLevel(unsigned int sampler, int baseLevel) + { + if(sampler < TEXTURE_IMAGE_UNITS) + { + context->sampler[sampler].setBaseLevel(baseLevel); + } + else ASSERT(false); + } + + void PixelProcessor::setMaxLevel(unsigned int sampler, int maxLevel) + { + if(sampler < TEXTURE_IMAGE_UNITS) + { + context->sampler[sampler].setMaxLevel(maxLevel); + } + else ASSERT(false); + } + void PixelProcessor::setWriteSRGB(bool sRGB) { context->setWriteSRGB(sRGB);
diff --git a/src/Renderer/PixelProcessor.hpp b/src/Renderer/PixelProcessor.hpp index bfa3476..a47da3f 100644 --- a/src/Renderer/PixelProcessor.hpp +++ b/src/Renderer/PixelProcessor.hpp
@@ -235,6 +235,8 @@ virtual void setSwizzleG(unsigned int sampler, SwizzleType swizzleG); virtual void setSwizzleB(unsigned int sampler, SwizzleType swizzleB); 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 setWriteSRGB(bool sRGB); virtual void setDepthBufferEnable(bool depthBufferEnable);
diff --git a/src/Renderer/Renderer.cpp b/src/Renderer/Renderer.cpp index 208ae9d..681ce37 100644 --- a/src/Renderer/Renderer.cpp +++ b/src/Renderer/Renderer.cpp
@@ -2347,6 +2347,30 @@ } } + void Renderer::setBaseLevel(SamplerType type, int sampler, int baseLevel) + { + if(type == SAMPLER_PIXEL) + { + PixelProcessor::setBaseLevel(sampler, baseLevel); + } + else + { + VertexProcessor::setBaseLevel(sampler, baseLevel); + } + } + + void Renderer::setMaxLevel(SamplerType type, int sampler, int maxLevel) + { + if(type == SAMPLER_PIXEL) + { + PixelProcessor::setMaxLevel(sampler, maxLevel); + } + else + { + VertexProcessor::setMaxLevel(sampler, maxLevel); + } + } + void Renderer::setPointSpriteEnable(bool pointSpriteEnable) { context->setPointSpriteEnable(pointSpriteEnable);
diff --git a/src/Renderer/Renderer.hpp b/src/Renderer/Renderer.hpp index 74d755d..3fa3bae 100644 --- a/src/Renderer/Renderer.hpp +++ b/src/Renderer/Renderer.hpp
@@ -345,6 +345,8 @@ virtual void setSwizzleG(SamplerType type, int sampler, SwizzleType swizzleG); virtual void setSwizzleB(SamplerType type, int sampler, SwizzleType swizzleB); 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 setPointSpriteEnable(bool pointSpriteEnable); virtual void setPointScaleEnable(bool pointScaleEnable);
diff --git a/src/Renderer/Sampler.cpp b/src/Renderer/Sampler.cpp index 1aa4ccc..5c434fe 100644 --- a/src/Renderer/Sampler.cpp +++ b/src/Renderer/Sampler.cpp
@@ -334,6 +334,16 @@ this->swizzleA = swizzleA; } + void Sampler::setBaseLevel(int baseLevel) + { + texture.baseLevel = baseLevel; + } + + void Sampler::setMaxLevel(int maxLevel) + { + texture.maxLevel = maxLevel; + } + void Sampler::setFilterQuality(FilterType maximumFilterQuality) { Sampler::maximumTextureFilterQuality = maximumFilterQuality;
diff --git a/src/Renderer/Sampler.hpp b/src/Renderer/Sampler.hpp index 8ec1bdf..cbb0588 100644 --- a/src/Renderer/Sampler.hpp +++ b/src/Renderer/Sampler.hpp
@@ -67,6 +67,8 @@ word4 borderColor4[4]; float4 borderColorF[4]; float maxAnisotropy; + int baseLevel; + int maxLevel; }; enum SamplerType @@ -152,8 +154,6 @@ SwizzleType swizzleB : BITS(SWIZZLE_LAST); SwizzleType swizzleA : BITS(SWIZZLE_LAST); - int baseLevel; - #if PERF_PROFILE bool compressedFormat : 1; #endif @@ -180,6 +180,8 @@ void setSwizzleG(SwizzleType swizzleG); void setSwizzleB(SwizzleType swizzleB); void setSwizzleA(SwizzleType swizzleA); + void setBaseLevel(int baseLevel); + void setMaxLevel(int maxLevel); static void setFilterQuality(FilterType maximumFilterQuality); static void setMipmapQuality(MipmapType maximumFilterQuality);
diff --git a/src/Renderer/VertexProcessor.cpp b/src/Renderer/VertexProcessor.cpp index 73f277b..2b0a97f 100644 --- a/src/Renderer/VertexProcessor.cpp +++ b/src/Renderer/VertexProcessor.cpp
@@ -638,6 +638,24 @@ else ASSERT(false); } + void VertexProcessor::setBaseLevel(unsigned int sampler, int baseLevel) + { + if(sampler < VERTEX_TEXTURE_IMAGE_UNITS) + { + context->sampler[TEXTURE_IMAGE_UNITS + sampler].setBaseLevel(baseLevel); + } + else ASSERT(false); + } + + void VertexProcessor::setMaxLevel(unsigned int sampler, int maxLevel) + { + if(sampler < VERTEX_TEXTURE_IMAGE_UNITS) + { + context->sampler[TEXTURE_IMAGE_UNITS + sampler].setMaxLevel(maxLevel); + } + 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 3af6690..3df2ad8 100644 --- a/src/Renderer/VertexProcessor.hpp +++ b/src/Renderer/VertexProcessor.hpp
@@ -260,6 +260,8 @@ virtual void setSwizzleG(unsigned int sampler, SwizzleType swizzleG); virtual void setSwizzleB(unsigned int sampler, SwizzleType swizzleB); 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 setPointSize(float pointSize); virtual void setPointSizeMin(float pointSizeMin);
diff --git a/src/Shader/PixelProgram.cpp b/src/Shader/PixelProgram.cpp index 662b834..af9fca0 100644 --- a/src/Shader/PixelProgram.cpp +++ b/src/Shader/PixelProgram.cpp
@@ -1152,8 +1152,8 @@ void PixelProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1) { - Pointer<Byte> textureMipmap = data + OFFSET(DrawData, mipmap) + src1.index * sizeof(Texture) + OFFSET(Texture, mipmap); - sampler[src1.index]->textureSize(textureMipmap, dst, lod); + Pointer<Byte> texture = data + OFFSET(DrawData, mipmap) + src1.index * sizeof(Texture); + sampler[src1.index]->textureSize(texture, dst, lod); } void PixelProgram::TEXKILL(Int cMask[4], Vector4f &src, unsigned char mask)
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp index 264f35d..9e2179b 100644 --- a/src/Shader/SamplerCore.cpp +++ b/src/Shader/SamplerCore.cpp
@@ -549,11 +549,12 @@ } } - void SamplerCore::textureSize(Pointer<Byte> &textureMipmap, Vector4f &size, Float4 &lod) + void SamplerCore::textureSize(Pointer<Byte> &texture, Vector4f &size, Float4 &lod) { for(int i = 0; i < 4; ++i) { - Pointer<Byte> mipmap = textureMipmap + (As<Int>(Extract(lod, i)) + Int(state.baseLevel)) * sizeof(Mipmap); + Int baseLevel = *Pointer<Int>(texture + OFFSET(Texture, baseLevel)); + Pointer<Byte> mipmap = texture + OFFSET(Texture, mipmap) + (As<Int>(Extract(lod, i)) + baseLevel) * sizeof(Mipmap); size.x = Insert(size.x, As<Float>(Int(*Pointer<Short>(mipmap + OFFSET(Mipmap, width)))), i); size.y = Insert(size.y, As<Float>(Int(*Pointer<Short>(mipmap + OFFSET(Mipmap, height)))), i); size.z = Insert(size.z, As<Float>(Int(*Pointer<Short>(mipmap + OFFSET(Mipmap, depth)))), i);
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp index 7868074..b986122 100644 --- a/src/Shader/VertexProgram.cpp +++ b/src/Shader/VertexProgram.cpp
@@ -1577,8 +1577,8 @@ void VertexProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1) { - Pointer<Byte> textureMipmap = data + OFFSET(DrawData, mipmap[16]) + src1.index * sizeof(Texture) + OFFSET(Texture, mipmap); - sampler[src1.index]->textureSize(textureMipmap, dst, lod); + Pointer<Byte> texture = data + OFFSET(DrawData, mipmap[16]) + src1.index * sizeof(Texture); + sampler[src1.index]->textureSize(texture, dst, lod); } void VertexProgram::sampleTexture(Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, bool hasOffset)