Texture function refactoring To make it easier to branch on the different texture fetching options, a new TextureFunction class is introduced here, which performs the string comparisons and identifies the different options. I also had to add a 5th argument for textureGradOffset and textureProjGradOffset. I added function stubs (with the UNIMPLEMENTED markers) for all new texture functions. Change-Id: I58cde91a2bacb0012bdc34ec85b0befa19a85326 Reviewed-on: https://swiftshader-review.googlesource.com/4116 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Shader/PixelProgram.cpp b/src/Shader/PixelProgram.cpp index 46ca81c..f889cfa 100644 --- a/src/Shader/PixelProgram.cpp +++ b/src/Shader/PixelProgram.cpp
@@ -110,6 +110,7 @@ const Src &src1 = instruction->src[1]; const Src &src2 = instruction->src[2]; const Src &src3 = instruction->src[3]; + const Src &src4 = instruction->src[4]; bool predicate = instruction->predicate; Control control = instruction->control; @@ -122,6 +123,7 @@ Vector4f s1; Vector4f s2; Vector4f s3; + Vector4f s4; if(opcode == Shader::OPCODE_TEXKILL) // Takes destination as input { @@ -142,6 +144,7 @@ if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterF(r, src1); if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterF(r, src2); if(src3.type != Shader::PARAMETER_VOID) s3 = fetchRegisterF(r, src3); + if(src4.type != Shader::PARAMETER_VOID) s4 = fetchRegisterF(r, src4); switch(opcode) { @@ -275,6 +278,12 @@ 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_TEXOFFSET: TEXOFFSET(r, d, s0, src1, s2, s3, project, bias); break; + case Shader::OPCODE_TEXLDLOFFSET: TEXLDL(r, d, s0, src1, s2, project, bias); break; + case Shader::OPCODE_TEXELFETCH: TEXELFETCH(r, d, s0, src1, s2); break; + case Shader::OPCODE_TEXELFETCHOFFSET: TEXELFETCH(r, d, s0, src1, s2, s3); break; + case Shader::OPCODE_TEXGRAD: TEXGRAD(r, d, s0, src1, s2, s3); break; + case Shader::OPCODE_TEXGRADOFFSET: TEXGRAD(r, d, s0, src1, s2, s3, s4); break; case Shader::OPCODE_DISCARD: DISCARD(r, cMask, instruction); break; case Shader::OPCODE_DFDX: DFDX(d, s0); break; case Shader::OPCODE_DFDY: DFDY(d, s0); break; @@ -1030,6 +1039,36 @@ dst.w = tmp[(src1.swizzle >> 6) & 0x3]; } + void PixelProgram::TEXOFFSET(Registers &r, Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3, bool project, bool bias) + { + UNIMPLEMENTED(); + } + + void PixelProgram::TEXLDL(Registers &r, Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &offset, bool project, bool bias) + { + UNIMPLEMENTED(); + } + + void PixelProgram::TEXELFETCH(Registers &r, Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2) + { + UNIMPLEMENTED(); + } + + void PixelProgram::TEXELFETCH(Registers &r, Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &offset) + { + UNIMPLEMENTED(); + } + + void PixelProgram::TEXGRAD(Registers &r, Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3) + { + UNIMPLEMENTED(); + } + + void PixelProgram::TEXGRAD(Registers &r, Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3, Vector4f &offset) + { + UNIMPLEMENTED(); + } + void PixelProgram::TEXLDD(Registers &r, Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, Vector4f &src3, bool project, bool bias) { Vector4f tmp;
diff --git a/src/Shader/PixelProgram.hpp b/src/Shader/PixelProgram.hpp index 850a7b1..41b9c4a 100644 --- a/src/Shader/PixelProgram.hpp +++ b/src/Shader/PixelProgram.hpp
@@ -112,6 +112,12 @@ 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 TEXOFFSET(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3, bool project, bool bias); + void TEXLDL(Registers &r, Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, bool project, bool bias); + void TEXELFETCH(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2); + void TEXELFETCH(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3); + void TEXGRAD(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3); + void TEXGRAD(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3, Vector4f &src4); void DISCARD(Registers &r, Int cMask[4], const Shader::Instruction *instruction); void DFDX(Vector4f &dst, Vector4f &src); void DFDY(Vector4f &dst, Vector4f &src);
diff --git a/src/Shader/PixelShader.cpp b/src/Shader/PixelShader.cpp index 9e4cff5..0cd6f1c 100644 --- a/src/Shader/PixelShader.cpp +++ b/src/Shader/PixelShader.cpp
@@ -299,6 +299,12 @@ case Shader::OPCODE_TEX: case Shader::OPCODE_TEXLDD: case Shader::OPCODE_TEXLDL: + case Shader::OPCODE_TEXOFFSET: + case Shader::OPCODE_TEXLDLOFFSET: + case Shader::OPCODE_TEXELFETCH: + case Shader::OPCODE_TEXELFETCHOFFSET: + case Shader::OPCODE_TEXGRAD: + case Shader::OPCODE_TEXGRADOFFSET: { int sampler = instruction[i]->src[1].index;
diff --git a/src/Shader/Shader.cpp b/src/Shader/Shader.cpp index 7767e79..6251359 100644 --- a/src/Shader/Shader.cpp +++ b/src/Shader/Shader.cpp
@@ -865,6 +865,12 @@ case OPCODE_TEXLDD: return "texldd"; case OPCODE_CMP: return "cmp"; case OPCODE_TEXLDL: return "texldl"; + case OPCODE_TEXOFFSET: return "texoffset"; + case OPCODE_TEXLDLOFFSET: return "texldloffset"; + case OPCODE_TEXELFETCH: return "texelfetch"; + case OPCODE_TEXELFETCHOFFSET: return "texelfetchoffset"; + case OPCODE_TEXGRAD: return "texgrad"; + case OPCODE_TEXGRADOFFSET: return "texgradoffset"; case OPCODE_BREAKP: return "breakp"; case OPCODE_TEXSIZE: return "texsize"; case OPCODE_PHASE: return "phase"; @@ -1772,6 +1778,12 @@ case OPCODE_TEXM3X2DEPTH: case OPCODE_TEXLDD: case OPCODE_TEXLDL: + case OPCODE_TEXOFFSET: + case OPCODE_TEXLDLOFFSET: + case OPCODE_TEXELFETCH: + case OPCODE_TEXELFETCHOFFSET: + case OPCODE_TEXGRAD: + case OPCODE_TEXGRADOFFSET: { Parameter &dst = instruction[i]->dst; Parameter &src1 = instruction[i]->src[1];
diff --git a/src/Shader/Shader.hpp b/src/Shader/Shader.hpp index 18c723b..588f637 100644 --- a/src/Shader/Shader.hpp +++ b/src/Shader/Shader.hpp
@@ -205,6 +205,12 @@ OPCODE_SMOOTH, OPCODE_ISNAN, OPCODE_ISINF, + OPCODE_TEXOFFSET, + OPCODE_TEXLDLOFFSET, + OPCODE_TEXELFETCH, + OPCODE_TEXELFETCHOFFSET, + OPCODE_TEXGRAD, + OPCODE_TEXGRADOFFSET, OPCODE_FLOATBITSTOINT, OPCODE_FLOATBITSTOUINT, OPCODE_INTBITSTOFLOAT, @@ -511,7 +517,7 @@ unsigned char usageIndex; DestinationParameter dst; - SourceParameter src[4]; + SourceParameter src[5]; union {
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp index 916a7fd..40c0910 100644 --- a/src/Shader/VertexProgram.cpp +++ b/src/Shader/VertexProgram.cpp
@@ -103,6 +103,7 @@ Src src1 = instruction->src[1]; Src src2 = instruction->src[2]; Src src3 = instruction->src[3]; + Src src4 = instruction->src[4]; bool predicate = instruction->predicate; Control control = instruction->control; @@ -114,11 +115,13 @@ Vector4f s1; Vector4f s2; Vector4f s3; + Vector4f s4; if(src0.type != Shader::PARAMETER_VOID) s0 = fetchRegisterF(r, src0); if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterF(r, src1); if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterF(r, src2); if(src3.type != Shader::PARAMETER_VOID) s3 = fetchRegisterF(r, src3); + if(src4.type != Shader::PARAMETER_VOID) s4 = fetchRegisterF(r, src4); switch(opcode) { @@ -289,6 +292,12 @@ 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_TEXOFFSET: TEXOFFSET(r, d, s0, src1, s2, s3); break; + case Shader::OPCODE_TEXLDLOFFSET: TEXLDL(r, d, s0, src1, s2); break; + case Shader::OPCODE_TEXELFETCH: TEXELFETCH(r, d, s0, src1, s2); break; + case Shader::OPCODE_TEXELFETCHOFFSET: TEXELFETCH(r, d, s0, src1, s2, s3); break; + case Shader::OPCODE_TEXGRAD: TEXGRAD(r, d, s0, src1, s2, s3); break; + case Shader::OPCODE_TEXGRADOFFSET: TEXGRAD(r, d, s0, src1, s2, s3, s4); break; case Shader::OPCODE_TEXSIZE: TEXSIZE(r, d, s0.x, src1); break; case Shader::OPCODE_END: break; default: @@ -1488,6 +1497,36 @@ dst.w = tmp[(src1.swizzle >> 6) & 0x3]; } + void VertexProgram::TEXOFFSET(Registers &r, Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3) + { + UNIMPLEMENTED(); + } + + void VertexProgram::TEXLDL(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &offset) + { + UNIMPLEMENTED(); + } + + void VertexProgram::TEXELFETCH(Registers &r, Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2) + { + UNIMPLEMENTED(); + } + + void VertexProgram::TEXELFETCH(Registers &r, Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &offset) + { + UNIMPLEMENTED(); + } + + void VertexProgram::TEXGRAD(Registers &r, Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3) + { + UNIMPLEMENTED(); + } + + void VertexProgram::TEXGRAD(Registers &r, Vector4f &dst, Vector4f &src0, const Src& src1, Vector4f &src2, Vector4f &src3, Vector4f &offset) + { + UNIMPLEMENTED(); + } + 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);
diff --git a/src/Shader/VertexProgram.hpp b/src/Shader/VertexProgram.hpp index 4c384d7..53427a5 100644 --- a/src/Shader/VertexProgram.hpp +++ b/src/Shader/VertexProgram.hpp
@@ -79,6 +79,12 @@ 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 TEXOFFSET(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3); + void TEXLDL(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2); + void TEXELFETCH(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2); + void TEXELFETCH(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3); + void TEXGRAD(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3); + void TEXGRAD(Registers &r, Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3, Vector4f &src4); 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);