Commit 25d47fc9 by Alexis Hetu Committed by Alexis Hétu

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/4116Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 2ea6f557
...@@ -164,6 +164,24 @@ namespace glsl ...@@ -164,6 +164,24 @@ namespace glsl
FUNCTION FUNCTION
}; };
struct TextureFunction
{
TextureFunction(const TString& name);
enum Method
{
IMPLICIT, // Mipmap LOD determined implicitly (standard lookup)
LOD,
SIZE, // textureSize()
FETCH,
GRAD
};
Method method;
bool proj;
bool offset;
};
void emitShader(Scope scope); void emitShader(Scope scope);
// Visit AST nodes and output their code to the body stream // Visit AST nodes and output their code to the body stream
...@@ -176,7 +194,7 @@ namespace glsl ...@@ -176,7 +194,7 @@ namespace glsl
virtual bool visitBranch(Visit visit, TIntermBranch*); virtual bool visitBranch(Visit visit, TIntermBranch*);
sw::Shader::Opcode getOpcode(sw::Shader::Opcode op, TIntermTyped *in) const; sw::Shader::Opcode getOpcode(sw::Shader::Opcode op, TIntermTyped *in) const;
Instruction *emit(sw::Shader::Opcode op, TIntermTyped *dst = 0, TIntermNode *src0 = 0, TIntermNode *src1 = 0, TIntermNode *src2 = 0, TIntermNode *src3 = 0, int index = 0); Instruction *emit(sw::Shader::Opcode op, TIntermTyped *dst = 0, TIntermNode *src0 = 0, TIntermNode *src1 = 0, TIntermNode *src2 = 0, TIntermNode *src3 = 0, TIntermNode *src4 = 0, int index = 0);
Instruction *emitCast(TIntermTyped *dst, TIntermTyped *src); Instruction *emitCast(TIntermTyped *dst, TIntermTyped *src);
void emitBinary(sw::Shader::Opcode op, TIntermTyped *dst = 0, TIntermNode *src0 = 0, TIntermNode *src1 = 0, TIntermNode *src2 = 0); void emitBinary(sw::Shader::Opcode op, TIntermTyped *dst = 0, TIntermNode *src0 = 0, TIntermNode *src1 = 0, TIntermNode *src2 = 0);
void emitAssign(sw::Shader::Opcode op, TIntermTyped *result, TIntermTyped *lhs, TIntermTyped *src0, TIntermTyped *src1 = 0); void emitAssign(sw::Shader::Opcode op, TIntermTyped *result, TIntermTyped *lhs, TIntermTyped *src0, TIntermTyped *src1 = 0);
......
...@@ -110,6 +110,7 @@ namespace sw ...@@ -110,6 +110,7 @@ namespace sw
const Src &src1 = instruction->src[1]; const Src &src1 = instruction->src[1];
const Src &src2 = instruction->src[2]; const Src &src2 = instruction->src[2];
const Src &src3 = instruction->src[3]; const Src &src3 = instruction->src[3];
const Src &src4 = instruction->src[4];
bool predicate = instruction->predicate; bool predicate = instruction->predicate;
Control control = instruction->control; Control control = instruction->control;
...@@ -122,6 +123,7 @@ namespace sw ...@@ -122,6 +123,7 @@ namespace sw
Vector4f s1; Vector4f s1;
Vector4f s2; Vector4f s2;
Vector4f s3; Vector4f s3;
Vector4f s4;
if(opcode == Shader::OPCODE_TEXKILL) // Takes destination as input if(opcode == Shader::OPCODE_TEXKILL) // Takes destination as input
{ {
...@@ -142,6 +144,7 @@ namespace sw ...@@ -142,6 +144,7 @@ namespace sw
if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterF(r, src1); if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterF(r, src1);
if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterF(r, src2); if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterF(r, src2);
if(src3.type != Shader::PARAMETER_VOID) s3 = fetchRegisterF(r, src3); if(src3.type != Shader::PARAMETER_VOID) s3 = fetchRegisterF(r, src3);
if(src4.type != Shader::PARAMETER_VOID) s4 = fetchRegisterF(r, src4);
switch(opcode) switch(opcode)
{ {
...@@ -275,6 +278,12 @@ namespace sw ...@@ -275,6 +278,12 @@ namespace sw
case Shader::OPCODE_TEXLDL: TEXLDL(r, d, s0, src1, 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_TEXSIZE: TEXSIZE(r, d, s0.x, src1); break;
case Shader::OPCODE_TEXKILL: TEXKILL(cMask, d, dst.mask); 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_DISCARD: DISCARD(r, cMask, instruction); break;
case Shader::OPCODE_DFDX: DFDX(d, s0); break; case Shader::OPCODE_DFDX: DFDX(d, s0); break;
case Shader::OPCODE_DFDY: DFDY(d, s0); break; case Shader::OPCODE_DFDY: DFDY(d, s0); break;
...@@ -1030,6 +1039,36 @@ namespace sw ...@@ -1030,6 +1039,36 @@ namespace sw
dst.w = tmp[(src1.swizzle >> 6) & 0x3]; 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) void PixelProgram::TEXLDD(Registers &r, Vector4f &dst, Vector4f &src0, const Src &src1, Vector4f &src2, Vector4f &src3, bool project, bool bias)
{ {
Vector4f tmp; Vector4f tmp;
......
...@@ -112,6 +112,12 @@ namespace sw ...@@ -112,6 +112,12 @@ namespace sw
void TEXLDL(Registers &r, Vector4f &dst, Vector4f &src0, const Src &src1, 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 TEXSIZE(Registers &r, Vector4f &dst, Float4 &lod, const Src &src1);
void TEXKILL(Int cMask[4], Vector4f &src, unsigned char mask); 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 DISCARD(Registers &r, Int cMask[4], const Shader::Instruction *instruction);
void DFDX(Vector4f &dst, Vector4f &src); void DFDX(Vector4f &dst, Vector4f &src);
void DFDY(Vector4f &dst, Vector4f &src); void DFDY(Vector4f &dst, Vector4f &src);
......
...@@ -299,6 +299,12 @@ namespace sw ...@@ -299,6 +299,12 @@ namespace sw
case Shader::OPCODE_TEX: case Shader::OPCODE_TEX:
case Shader::OPCODE_TEXLDD: case Shader::OPCODE_TEXLDD:
case Shader::OPCODE_TEXLDL: 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; int sampler = instruction[i]->src[1].index;
......
...@@ -865,6 +865,12 @@ namespace sw ...@@ -865,6 +865,12 @@ namespace sw
case OPCODE_TEXLDD: return "texldd"; case OPCODE_TEXLDD: return "texldd";
case OPCODE_CMP: return "cmp"; case OPCODE_CMP: return "cmp";
case OPCODE_TEXLDL: return "texldl"; 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_BREAKP: return "breakp";
case OPCODE_TEXSIZE: return "texsize"; case OPCODE_TEXSIZE: return "texsize";
case OPCODE_PHASE: return "phase"; case OPCODE_PHASE: return "phase";
...@@ -1772,6 +1778,12 @@ namespace sw ...@@ -1772,6 +1778,12 @@ namespace sw
case OPCODE_TEXM3X2DEPTH: case OPCODE_TEXM3X2DEPTH:
case OPCODE_TEXLDD: case OPCODE_TEXLDD:
case OPCODE_TEXLDL: 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 &dst = instruction[i]->dst;
Parameter &src1 = instruction[i]->src[1]; Parameter &src1 = instruction[i]->src[1];
......
...@@ -205,6 +205,12 @@ namespace sw ...@@ -205,6 +205,12 @@ namespace sw
OPCODE_SMOOTH, OPCODE_SMOOTH,
OPCODE_ISNAN, OPCODE_ISNAN,
OPCODE_ISINF, OPCODE_ISINF,
OPCODE_TEXOFFSET,
OPCODE_TEXLDLOFFSET,
OPCODE_TEXELFETCH,
OPCODE_TEXELFETCHOFFSET,
OPCODE_TEXGRAD,
OPCODE_TEXGRADOFFSET,
OPCODE_FLOATBITSTOINT, OPCODE_FLOATBITSTOINT,
OPCODE_FLOATBITSTOUINT, OPCODE_FLOATBITSTOUINT,
OPCODE_INTBITSTOFLOAT, OPCODE_INTBITSTOFLOAT,
...@@ -511,7 +517,7 @@ namespace sw ...@@ -511,7 +517,7 @@ namespace sw
unsigned char usageIndex; unsigned char usageIndex;
DestinationParameter dst; DestinationParameter dst;
SourceParameter src[4]; SourceParameter src[5];
union union
{ {
......
...@@ -103,6 +103,7 @@ namespace sw ...@@ -103,6 +103,7 @@ namespace sw
Src src1 = instruction->src[1]; Src src1 = instruction->src[1];
Src src2 = instruction->src[2]; Src src2 = instruction->src[2];
Src src3 = instruction->src[3]; Src src3 = instruction->src[3];
Src src4 = instruction->src[4];
bool predicate = instruction->predicate; bool predicate = instruction->predicate;
Control control = instruction->control; Control control = instruction->control;
...@@ -114,11 +115,13 @@ namespace sw ...@@ -114,11 +115,13 @@ namespace sw
Vector4f s1; Vector4f s1;
Vector4f s2; Vector4f s2;
Vector4f s3; Vector4f s3;
Vector4f s4;
if(src0.type != Shader::PARAMETER_VOID) s0 = fetchRegisterF(r, src0); if(src0.type != Shader::PARAMETER_VOID) s0 = fetchRegisterF(r, src0);
if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterF(r, src1); if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterF(r, src1);
if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterF(r, src2); if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterF(r, src2);
if(src3.type != Shader::PARAMETER_VOID) s3 = fetchRegisterF(r, src3); if(src3.type != Shader::PARAMETER_VOID) s3 = fetchRegisterF(r, src3);
if(src4.type != Shader::PARAMETER_VOID) s4 = fetchRegisterF(r, src4);
switch(opcode) switch(opcode)
{ {
...@@ -289,6 +292,12 @@ namespace sw ...@@ -289,6 +292,12 @@ namespace sw
case Shader::OPCODE_NE: notEqual(d, s0, s1); break; case Shader::OPCODE_NE: notEqual(d, s0, s1); break;
case Shader::OPCODE_TEXLDL: TEXLDL(r, d, s0, src1); break; case Shader::OPCODE_TEXLDL: TEXLDL(r, d, s0, src1); break;
case Shader::OPCODE_TEX: TEX(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_TEXSIZE: TEXSIZE(r, d, s0.x, src1); break;
case Shader::OPCODE_END: break; case Shader::OPCODE_END: break;
default: default:
...@@ -1488,6 +1497,36 @@ namespace sw ...@@ -1488,6 +1497,36 @@ namespace sw
dst.w = tmp[(src1.swizzle >> 6) & 0x3]; 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) 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); Pointer<Byte> textureMipmap = r.data + OFFSET(DrawData, mipmap[16]) + src1.index * sizeof(Texture) + OFFSET(Texture, mipmap);
......
...@@ -79,6 +79,12 @@ namespace sw ...@@ -79,6 +79,12 @@ namespace sw
void LEAVE(Registers &r); void LEAVE(Registers &r);
void TEXLDL(Registers &r, Vector4f &dst, Vector4f &src, const Src&); void TEXLDL(Registers &r, Vector4f &dst, Vector4f &src, const Src&);
void TEX(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 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); void sampleTexture(Registers &r, Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment