OSDN Git Service

Pack texelFetch LOD as sampling coordinate's w component.
authorMeng-Lin Wu <marleymoo@google.com>
Tue, 14 Jun 2016 15:11:25 +0000 (11:11 -0400)
committerMeng-Lin Wu <marleymoo@google.com>
Wed, 15 Jun 2016 17:46:24 +0000 (17:46 +0000)
One less argument is emitted.

Vertex/PixelProgram sampleTexture function signature simplified.

Change-Id: I7aef3eb100ccb51a8bd9d5fd600c73b4843d30d9
Reviewed-on: https://swiftshader-review.googlesource.com/5600
Tested-by: Meng-Lin Wu <marleymoo@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/compiler/OutputASM.cpp
src/Shader/PixelProgram.cpp
src/Shader/PixelProgram.hpp
src/Shader/SamplerCore.cpp
src/Shader/VertexProgram.cpp
src/Shader/VertexProgram.hpp

index e06efae..519b613 100644 (file)
@@ -1297,10 +1297,13 @@ namespace glsl
                                                {
                                                        if(argumentCount == 3 || (textureFunction.offset && argumentCount == 4))
                                                        {
+                                                               Instruction *lod = emit(sw::Shader::OPCODE_MOV, &coord, arg[2]);
+                                                               lod->dst.mask = 0x8;
+
                                                                TIntermNode *offset = textureFunction.offset ? arg[3] : nullptr;
 
                                                                emit(textureFunction.offset ? sw::Shader::OPCODE_TEXELFETCHOFFSET : sw::Shader::OPCODE_TEXELFETCH,
-                                                                    result, arg[1], arg[0], arg[2], offset);
+                                                                    result, &coord, arg[0], offset);
                                                        }
                                                        else UNREACHABLE(argumentCount);
                                                }
index 3048ad1..d3e688c 100644 (file)
@@ -287,8 +287,8 @@ namespace sw
                        case Shader::OPCODE_TEXKILL:    TEXKILL(cMask, d, dst.mask);                   break;
                        case Shader::OPCODE_TEXOFFSET:  TEXOFFSET(d, s0, src1, s2, project, bias);     break;
                        case Shader::OPCODE_TEXLDLOFFSET: TEXLDL(d, s0, src1, s2, project, bias);      break;
-                       case Shader::OPCODE_TEXELFETCH: TEXELFETCH(d, s0, src1, s2);                   break;
-                       case Shader::OPCODE_TEXELFETCHOFFSET: TEXELFETCH(d, s0, src1, s2, s3);         break;
+                       case Shader::OPCODE_TEXELFETCH: TEXELFETCH(d, s0, src1);                       break;
+                       case Shader::OPCODE_TEXELFETCHOFFSET: TEXELFETCH(d, s0, src1, s2);             break;
                        case Shader::OPCODE_TEXGRAD:    TEXGRAD(d, s0, src1, s2, s3);                  break;
                        case Shader::OPCODE_TEXGRADOFFSET: TEXGRAD(d, s0, src1, s2, s3, s4);           break;
                        case Shader::OPCODE_DISCARD:    DISCARD(cMask, instruction);                   break;
@@ -676,13 +676,13 @@ namespace sw
                }
        }
 
-       void PixelProgram::sampleTexture(Vector4f &c, const Src &sampler, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options)
+       void PixelProgram::sampleTexture(Vector4f &c, const Src &sampler, Vector4f &uvwq, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options)
        {
                Vector4f tmp;
 
                if(sampler.type == Shader::PARAMETER_SAMPLER && sampler.rel.type == Shader::PARAMETER_VOID)
                {
-                       sampleTexture(tmp, sampler.index, u, v, w, q, dsx, dsy, offset, method, options);
+                       sampleTexture(tmp, sampler.index, uvwq, dsx, dsy, offset, method, options);
                }
                else
                {
@@ -694,7 +694,7 @@ namespace sw
                                {
                                        If(index == i)
                                        {
-                                               sampleTexture(tmp, i, u, v, w, q, dsx, dsy, offset, method, options);
+                                               sampleTexture(tmp, i, uvwq, dsx, dsy, offset, method, options);
                                                // FIXME: When the sampler states are the same, we could use one sampler and just index the texture
                                        }
                                }
@@ -707,7 +707,7 @@ namespace sw
                c.w = tmp[(sampler.swizzle >> 6) & 0x3];
        }
 
-       void PixelProgram::sampleTexture(Vector4f &c, int samplerIndex, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options)
+       void PixelProgram::sampleTexture(Vector4f &c, int samplerIndex, Vector4f &uvwq, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options)
        {
                #if PERF_PROFILE
                        Long texTime = Ticks();
@@ -717,17 +717,17 @@ namespace sw
 
                if(!(options & Project))
                {
-                       sampler[samplerIndex]->sampleTexture(texture, c, u, v, w, q, dsx, dsy, offset, options, method);
+                       sampler[samplerIndex]->sampleTexture(texture, c, uvwq.x, uvwq.y, uvwq.z, uvwq.w, dsx, dsy, offset, options, method);
                }
                else
                {
-                       Float4 rq = reciprocal(q);
+                       Float4 rq = reciprocal(uvwq.w);
 
-                       Float4 u_q = u * rq;
-                       Float4 v_q = v * rq;
-                       Float4 w_q = w * rq;
+                       Float4 u_q = uvwq.x * rq;
+                       Float4 v_q = uvwq.y * rq;
+                       Float4 w_q = uvwq.z * rq;
 
-                       sampler[samplerIndex]->sampleTexture(texture, c, u_q, v_q, w_q, q, dsx, dsy, offset, options, method);
+                       sampler[samplerIndex]->sampleTexture(texture, c, u_q, v_q, w_q, uvwq.w, dsx, dsy, offset, options, method);
                }
 
                #if PERF_PROFILE
@@ -1109,49 +1109,47 @@ namespace sw
 
        void PixelProgram::TEXLD(Vector4f &dst, Vector4f &src0, const Src &src1, bool project, bool bias)
        {
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, src0, bias ? Bias : Implicit, project ? Project : None);
+               sampleTexture(dst, src1, src0, src0, src0, src0, bias ? Bias : Implicit, project ? Project : None);
        }
 
        void PixelProgram::TEXOFFSET(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, bool project, bool bias)
        {
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, src2, bias ? Bias : Implicit, project ? (Project | Offset) : Offset);
+               sampleTexture(dst, src1, src0, src0, src0, src2, bias ? Bias : Implicit, project ? (Project | Offset) : Offset);
        }
 
        void PixelProgram::TEXLDL(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &offset, bool project, bool bias)
        {
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, offset, Lod, project ? (Project | Offset) : Offset);
+               sampleTexture(dst, src1, src0, src0, src0, offset, Lod, project ? (Project | Offset) : Offset);
        }
 
-       void PixelProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2)
+       void PixelProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1)
        {
-               Float4 lod(As<Int4>(src2.x));
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod, src0, src0, src0, Lod, Fetch);
+               sampleTexture(dst, src1, src0, src0, src0, src0, Lod, Fetch);
        }
 
-       void PixelProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &offset)
+       void PixelProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &offset)
        {
-               Float4 lod(As<Int4>(src2.x));
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod, src0, src0, offset, Lod, Fetch | Offset);
+               sampleTexture(dst, src1, src0, src0, src0, offset, Lod, Fetch | Offset);
        }
 
        void PixelProgram::TEXGRAD(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3)
        {
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src2, src3, src0, Grad, None);
+               sampleTexture(dst, src1, src0, src2, src3, src0, Grad, None);
        }
 
        void PixelProgram::TEXGRAD(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3, Vector4f &offset)
        {
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src2, src3, offset, Grad, Offset);
+               sampleTexture(dst, src1, src0, src2, src3, offset, Grad, Offset);
        }
 
        void PixelProgram::TEXLDD(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, Vector4f &src3, bool project)
        {
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src2, src3, src0, Grad, project ? Project : None);
+               sampleTexture(dst, src1, src0, src2, src3, src0, Grad, project ? Project : None);
        }
 
        void PixelProgram::TEXLDL(Vector4f &dst, Vector4f &src0, const Src &src1, bool project)
        {
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, src0, src0, src0, Lod, project ? Project : None);
+               sampleTexture(dst, src1, src0, src0, src0, src0, Lod, project ? Project : None);
        }
 
        void PixelProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1)
index bad1538..4454171 100644 (file)
@@ -82,8 +82,8 @@ namespace sw
                Int4 enableContinue;
                Int4 enableLeave;
 
-               void sampleTexture(Vector4f &c, const Src &sampler, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options);
-               void sampleTexture(Vector4f &c, int samplerIndex, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options);
+               void sampleTexture(Vector4f &c, const Src &sampler, Vector4f &uvwq, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options);
+               void sampleTexture(Vector4f &c, int samplerIndex, Vector4f &uvwq, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options);
 
                // Raster operations
                void clampColor(Vector4f oC[RENDERTARGETS]);
@@ -113,8 +113,8 @@ namespace sw
                void TEXKILL(Int cMask[4], Vector4f &src, unsigned char mask);
                void TEXOFFSET(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, bool project, bool bias);
                void TEXLDL(Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, bool project, bool bias);
+               void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&);
                void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
-               void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
                void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
                void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3, Vector4f &src4);
                void DISCARD(Int cMask[4], const Shader::Instruction *instruction);
index e2ca316..6c5e304 100644 (file)
@@ -105,21 +105,22 @@ namespace sw
                        Float anisotropy;
                        Float4 uDelta;
                        Float4 vDelta;
+                       Float lodBias = (options & Fetch) ? Float4(As<Int4>(q)).x : q.x;
 
                        if(state.textureType != TEXTURE_3D)
                        {
                                if(state.textureType != TEXTURE_CUBE)
                                {
-                                       computeLod(texture, lod, anisotropy, uDelta, vDelta, uuuu, vvvv, q.x, dsx, dsy, method);
+                                       computeLod(texture, lod, anisotropy, uDelta, vDelta, uuuu, vvvv, lodBias, dsx, dsy, method);
                                }
                                else
                                {
-                                       computeLodCube(texture, lod, lodX, lodY, lodZ, q.x, dsx, dsy, method);
+                                       computeLodCube(texture, lod, lodX, lodY, lodZ, lodBias, dsx, dsy, method);
                                }
                        }
                        else
                        {
-                               computeLod3D(texture, lod, uuuu, vvvv, wwww, q.x, dsx, dsy, method);
+                               computeLod3D(texture, lod, uuuu, vvvv, wwww, lodBias, dsx, dsy, method);
                        }
 
                        if(!hasFloatTexture())
@@ -333,21 +334,22 @@ namespace sw
                                Float anisotropy;
                                Float4 uDelta;
                                Float4 vDelta;
+                               Float lodBias = (options & Fetch) ? Float4(As<Int4>(q)).x : q.x;
 
                                if(state.textureType != TEXTURE_3D)
                                {
                                        if(state.textureType != TEXTURE_CUBE)
                                        {
-                                               computeLod(texture, lod, anisotropy, uDelta, vDelta, uuuu, vvvv, q.x, dsx, dsy, method);
+                                               computeLod(texture, lod, anisotropy, uDelta, vDelta, uuuu, vvvv, lodBias, dsx, dsy, method);
                                        }
                                        else
                                        {
-                                               computeLodCube(texture, lod, lodX, lodY, lodZ, q.x, dsx, dsy, method);
+                                               computeLodCube(texture, lod, lodX, lodY, lodZ, lodBias, dsx, dsy, method);
                                        }
                                }
                                else
                                {
-                                       computeLod3D(texture, lod, uuuu, vvvv, wwww, q.x, dsx, dsy, method);
+                                       computeLod3D(texture, lod, uuuu, vvvv, wwww, lodBias, dsx, dsy, method);
                                }
 
                                sampleFloatFilter(texture, c, uuuu, vvvv, wwww, offset, lod, anisotropy, uDelta, vDelta, face, options, method);
index 6d3f683..6d789a9 100644 (file)
@@ -324,8 +324,8 @@ namespace sw
                        case Shader::OPCODE_TEX:        TEX(d, s0, src1);               break;
                        case Shader::OPCODE_TEXOFFSET:  TEXOFFSET(d, s0, src1, s2);     break;
                        case Shader::OPCODE_TEXLDLOFFSET: TEXLDL(d, s0, src1, s2);      break;
-                       case Shader::OPCODE_TEXELFETCH: TEXELFETCH(d, s0, src1, s2);    break;
-                       case Shader::OPCODE_TEXELFETCHOFFSET: TEXELFETCH(d, s0, src1, s2, s3); break;
+                       case Shader::OPCODE_TEXELFETCH: TEXELFETCH(d, s0, src1);        break;
+                       case Shader::OPCODE_TEXELFETCHOFFSET: TEXELFETCH(d, s0, src1, s2); break;
                        case Shader::OPCODE_TEXGRAD:    TEXGRAD(d, s0, src1, s2, s3);   break;
                        case Shader::OPCODE_TEXGRADOFFSET: TEXGRAD(d, s0, src1, s2, s3, s4); break;
                        case Shader::OPCODE_TEXSIZE:    TEXSIZE(d, s0.x, src1);         break;
@@ -1533,48 +1533,44 @@ namespace sw
 
        void VertexProgram::TEXLDL(Vector4f &dst, Vector4f &src0, const Src &src1)
        {
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, a0, a0, src0, Lod, None);
+               sampleTexture(dst, src1, src0, a0, a0, src0, Lod, None);
        }
 
        void VertexProgram::TEX(Vector4f &dst, Vector4f &src0, const Src &src1)
        {
-               Float4 lod0 = Float4(0.0f);
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod0, a0, a0, src0, Lod, None);
+               src0.w = Float(0.0f);
+               sampleTexture(dst, src1, src0, a0, a0, src0, Lod, None);
        }
 
        void VertexProgram::TEXOFFSET(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2)
        {
-               Float4 lod0 = Float4(0.0f);
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod0, a0, a0, src2, Lod, Offset);
+               src0.w = Float(0.0f);
+               sampleTexture(dst, src1, src0, a0, a0, src2, Lod, Offset);
        }
 
        void VertexProgram::TEXLDL(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &offset)
        {
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, src0.w, a0, a0, offset, Lod, Offset);
+               sampleTexture(dst, src1, src0, a0, a0, offset, Lod, Offset);
        }
 
-       void VertexProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2)
+       void VertexProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1)
        {
-               Float4 lod(As<Int4>(src2.x));
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod, src0, src0, src0, Lod, Fetch);
+               sampleTexture(dst, src1, src0, src0, src0, src0, Lod, Fetch);
        }
 
-       void VertexProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &offset)
+       void VertexProgram::TEXELFETCH(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &offset)
        {
-               Float4 lod(As<Int4>(src2.x));
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod, src0, src0, offset, Lod, Fetch | Offset);
+               sampleTexture(dst, src1, src0, src0, src0, offset, Lod, Fetch | Offset);
        }
 
        void VertexProgram::TEXGRAD(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3)
        {
-               Float4 lod0 = Float4(0.0f);
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod0, src2, src3, src0, Grad, None);
+               sampleTexture(dst, src1, src0, src2, src3, src0, Grad, None);
        }
 
        void VertexProgram::TEXGRAD(Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3, Vector4f &offset)
        {
-               Float4 lod0 = Float4(0.0f);
-               sampleTexture(dst, src1, src0.x, src0.y, src0.z, lod0, src2, src3, offset, Grad, Offset);
+               sampleTexture(dst, src1, src0, src2, src3, offset, Grad, Offset);
        }
 
        void VertexProgram::TEXSIZE(Vector4f &dst, Float4 &lod, const Src &src1)
@@ -1583,14 +1579,14 @@ namespace sw
                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, unsigned int options)
+       void VertexProgram::sampleTexture(Vector4f &c, const Src &s, Vector4f &uvwq, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options)
        {
                Vector4f tmp;
 
                if(s.type == Shader::PARAMETER_SAMPLER && s.rel.type == Shader::PARAMETER_VOID)
                {
                        Pointer<Byte> texture = data + OFFSET(DrawData, mipmap[TEXTURE_IMAGE_UNITS]) + s.index * sizeof(Texture);
-                       sampler[s.index]->sampleTexture(texture, tmp, u, v, w, q, dsx, dsy, offset, options, method);
+                       sampler[s.index]->sampleTexture(texture, tmp, uvwq.x, uvwq.y, uvwq.z, uvwq.w, dsx, dsy, offset, options, method);
                }
                else
                {
@@ -1603,7 +1599,7 @@ namespace sw
                                        If(index == i)
                                        {
                                                Pointer<Byte> texture = data + OFFSET(DrawData, mipmap[TEXTURE_IMAGE_UNITS]) + i * sizeof(Texture);
-                                               sampler[i]->sampleTexture(texture, tmp, u, v, w, q, dsx, dsy, offset, options, method);
+                                               sampler[i]->sampleTexture(texture, tmp, uvwq.x, uvwq.y, uvwq.z, uvwq.w, dsx, dsy, offset, options, method);
                                                // FIXME: When the sampler states are the same, we could use one sampler and just index the texture
                                        }
                                }
index 2f69178..fcde4e6 100644 (file)
@@ -110,13 +110,13 @@ namespace sw
                void TEX(Vector4f &dst, Vector4f &src, const Src&);
                void TEXOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
                void TEXLDL(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
+               void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&);
                void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
-               void TEXELFETCH(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
                void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
                void TEXGRAD(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3, Vector4f &src4);
                void TEXSIZE(Vector4f &dst, Float4 &lod, const Src&);
 
-               void sampleTexture(Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options);
+               void sampleTexture(Vector4f &c, const Src &s, Vector4f &uvwq, Vector4f &dsx, Vector4f &dsy, Vector4f &offset, SamplerMethod method, unsigned int options);
 
                SamplerCore *sampler[VERTEX_TEXTURE_IMAGE_UNITS];