Commit 9bcb31da by Alexis Hetu Committed by Alexis Hétu

TextureSize implementation

Initial TextureSize parsing and implementation Change-Id: I8b9b1808366b1013a5001e2dfa15a26d8471ab6a Reviewed-on: https://swiftshader-review.googlesource.com/3753Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 810f99be
......@@ -1136,6 +1136,10 @@ namespace glsl
emit(sw::Shader::OPCODE_TEXLDL, result, &proj, arg[0]);
}
else if(name == "textureSize")
{
emit(sw::Shader::OPCODE_TEXSIZE, result, arg[1], arg[0]);
}
else UNREACHABLE(0);
}
}
......
......@@ -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;
......
......@@ -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);
......
......@@ -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";
......
......@@ -115,6 +115,7 @@ namespace sw
OPCODE_CMP, // D3DSIO_SETP
OPCODE_TEXLDL,
OPCODE_BREAKP,
OPCODE_TEXSIZE,
OPCODE_PHASE = 0xFFFD,
OPCODE_COMMENT = 0xFFFE,
......
......@@ -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)
......
......@@ -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);
......
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