OSDN Git Service

TextureSize implementation
authorAlexis Hetu <sugoi@google.com>
Wed, 22 Jul 2015 21:03:26 +0000 (17:03 -0400)
committerAlexis Hétu <sugoi@google.com>
Wed, 21 Oct 2015 19:17:37 +0000 (19:17 +0000)
Initial TextureSize parsing and implementation

Change-Id: I8b9b1808366b1013a5001e2dfa15a26d8471ab6a
Reviewed-on: https://swiftshader-review.googlesource.com/3753
Tested-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/Shader.cpp
src/Shader/Shader.hpp
src/Shader/VertexProgram.cpp
src/Shader/VertexProgram.hpp

index 3ed7975..dec9c30 100644 (file)
@@ -1136,6 +1136,10 @@ namespace glsl
 \r
                                                emit(sw::Shader::OPCODE_TEXLDL, result, &proj, arg[0]);\r
                                        }\r
+                                       else if(name == "textureSize")\r
+                                       {\r
+                                               emit(sw::Shader::OPCODE_TEXSIZE, result, arg[1], arg[0]);\r
+                                       }\r
                                        else UNREACHABLE(0);\r
                                }\r
                        }\r
index aca41bd..80fe7d6 100644 (file)
@@ -267,6 +267,7 @@ namespace sw
                        case Shader::OPCODE_TEX:        TEXLD(r, d, s0, src1, project, bias);          break;
                        case Shader::OPCODE_TEXLDD:     TEXLDD(r, d, s0, src1, s2, s3, project, bias); break;
                        case Shader::OPCODE_TEXLDL:     TEXLDL(r, d, s0, src1, project, bias);         break;
+                       case Shader::OPCODE_TEXSIZE:    TEXSIZE(r, d, s0.x, src1);                     break;
                        case Shader::OPCODE_TEXKILL:    TEXKILL(cMask, d, dst.mask);                   break;
                        case Shader::OPCODE_DISCARD:    DISCARD(r, cMask, instruction);                break;
                        case Shader::OPCODE_DFDX:       DFDX(d, s0);                                   break;
@@ -1020,6 +1021,18 @@ namespace sw
                dst.w = tmp[(src1.swizzle >> 6) & 0x3];
        }
 
+       void PixelProgram::TEXSIZE(Registers &r, Vector4f &dst, Float4 &lod, const Src &src1)
+       {
+               Pointer<Byte> textureMipmap = r.data + OFFSET(DrawData, mipmap) + src1.index * sizeof(Texture) + OFFSET(Texture, mipmap);
+               for(int i = 0; i < 4; ++i)
+               {
+                       Pointer<Byte> mipmap = textureMipmap + (As<Int>(Extract(lod, i)) + Int(1)) * sizeof(Mipmap);
+                       dst.x = Insert(dst.x, As<Float>(Int(*Pointer<Short>(mipmap + OFFSET(Mipmap, width)))), i);
+                       dst.y = Insert(dst.y, As<Float>(Int(*Pointer<Short>(mipmap + OFFSET(Mipmap, height)))), i);
+                       dst.z = Insert(dst.z, As<Float>(Int(*Pointer<Short>(mipmap + OFFSET(Mipmap, depth)))), i);
+               }
+       }
+
        void PixelProgram::TEXKILL(Int cMask[4], Vector4f &src, unsigned char mask)
        {
                Int kill = -1;
index 82d2c87..9c5eaaf 100644 (file)
@@ -109,6 +109,7 @@ namespace sw
                void TEXLD(Registers &r, Vector4f &dst, Vector4f &src0, const Src &src1, bool project, bool bias);
                void TEXLDD(Registers &r, Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, Vector4f &src3, bool project, bool bias);
                void TEXLDL(Registers &r, Vector4f &dst, Vector4f &src0, const Src &src1, bool project, bool bias);
+               void TEXSIZE(Registers &r, Vector4f &dst, Float4 &lod, const Src &src1);
                void TEXKILL(Int cMask[4], Vector4f &src, unsigned char mask);
                void DISCARD(Registers &r, Int cMask[4], const Shader::Instruction *instruction);
                void DFDX(Vector4f &dst, Vector4f &src);
index f92ee73..7767e79 100644 (file)
@@ -866,6 +866,7 @@ namespace sw
                case OPCODE_CMP:                        return "cmp";
                case OPCODE_TEXLDL:                     return "texldl";
                case OPCODE_BREAKP:                     return "breakp";
+               case OPCODE_TEXSIZE:        return "texsize";
                case OPCODE_PHASE:                      return "phase";
                case OPCODE_COMMENT:            return "comment";
                case OPCODE_END:                        return "end";
index 094d3b7..18c723b 100644 (file)
@@ -115,6 +115,7 @@ namespace sw
                        OPCODE_CMP,   // D3DSIO_SETP\r
                        OPCODE_TEXLDL,\r
                        OPCODE_BREAKP,\r
+                       OPCODE_TEXSIZE,\r
 \r
                        OPCODE_PHASE = 0xFFFD,\r
                        OPCODE_COMMENT = 0xFFFE,\r
index 2040480..916a7fd 100644 (file)
@@ -289,6 +289,7 @@ namespace sw
                        case Shader::OPCODE_NE:         notEqual(d, s0, s1);            break;
                        case Shader::OPCODE_TEXLDL:             TEXLDL(r, d, s0, src1);                 break;
                        case Shader::OPCODE_TEX:                TEX(r, d, s0, src1);                    break;
+                       case Shader::OPCODE_TEXSIZE:    TEXSIZE(r, d, s0.x, src1);              break;
                        case Shader::OPCODE_END:                                                                                break;
                        default:
                                ASSERT(false);
@@ -1487,6 +1488,18 @@ namespace sw
                dst.w = tmp[(src1.swizzle >> 6) & 0x3];
        }
 
+       void VertexProgram::TEXSIZE(Registers &r, Vector4f &dst, Float4 &lod, const Src &src1)
+       {
+               Pointer<Byte> textureMipmap = r.data + OFFSET(DrawData, mipmap[16]) + src1.index * sizeof(Texture) + OFFSET(Texture, mipmap);
+               for(int i = 0; i < 4; ++i)
+               {
+                       Pointer<Byte> mipmap = textureMipmap + (As<Int>(Extract(lod, i)) + Int(1)) * sizeof(Mipmap);
+                       dst.x = Insert(dst.x, As<Float>(Int(*Pointer<Short>(mipmap + OFFSET(Mipmap, width)))), i);
+                       dst.y = Insert(dst.y, As<Float>(Int(*Pointer<Short>(mipmap + OFFSET(Mipmap, height)))), i);
+                       dst.z = Insert(dst.z, As<Float>(Int(*Pointer<Short>(mipmap + OFFSET(Mipmap, depth)))), i);
+               }
+       }
+
        void VertexProgram::sampleTexture(Registers &r, Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q)
        {
                if(s.type == Shader::PARAMETER_SAMPLER && s.rel.type == Shader::PARAMETER_VOID)
index dc2121b..4c384d7 100644 (file)
@@ -79,6 +79,7 @@ namespace sw
                void LEAVE(Registers &r);
                void TEXLDL(Registers &r, Vector4f &dst, Vector4f &src, const Src&);
                void TEX(Registers &r, Vector4f &dst, Vector4f &src, const Src&);
+               void TEXSIZE(Registers &r, Vector4f &dst, Float4 &lod, const Src&);
 
                void sampleTexture(Registers &r, Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q);