Commit b4fb3678 by Nicolas Capens

Eliminate redundant register set argument passing.

Bug 22652760 Change-Id: If6bf124c3218847ecc4af0ae16102452a6b344d9 Reviewed-on: https://swiftshader-review.googlesource.com/4558Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 2ca19030
......@@ -34,7 +34,7 @@ namespace sw
{
}
Vector4f VertexPipeline::transformBlend(Registers &r, const Register &src, const Pointer<Byte> &matrix, bool homogeneous)
Vector4f VertexPipeline::transformBlend(const Register &src, const Pointer<Byte> &matrix, bool homogeneous)
{
Vector4f dst;
......@@ -55,7 +55,7 @@ namespace sw
{
Float4 B = r.v[BlendIndices].x;
UInt indices;
switch(i)
{
case 0: indices = As<UInt>(Float(B.x)); break;
......@@ -155,14 +155,14 @@ namespace sw
return dst;
}
void VertexPipeline::pipeline(Registers &r)
void VertexPipeline::pipeline()
{
Vector4f position;
Vector4f normal;
if(!state.preTransformed)
{
position = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.transformT)), true);
position = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.transformT)), true);
}
else
{
......@@ -174,11 +174,11 @@ namespace sw
r.o[Pos].z = position.z;
r.o[Pos].w = position.w;
Vector4f vertexPosition = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
Vector4f vertexPosition = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
if(state.vertexNormalActive)
{
normal = transformBlend(r, r.v[Normal], Pointer<Byte>(r.data + OFFSET(DrawData,ff.normalTransformT)), false);
normal = transformBlend(r.v[Normal], Pointer<Byte>(r.data + OFFSET(DrawData,ff.normalTransformT)), false);
if(state.normalizeNormals)
{
......@@ -532,13 +532,13 @@ namespace sw
for(int stage = 0; stage < 8; stage++)
{
processTextureCoordinate(r, stage, normal, position);
processTextureCoordinate(stage, normal, position);
}
processPointSize(r);
processPointSize();
}
void VertexPipeline::processTextureCoordinate(Registers &r, int stage, Vector4f &normal, Vector4f &position)
void VertexPipeline::processTextureCoordinate(int stage, Vector4f &normal, Vector4f &position)
{
if(state.output[T0 + stage].write)
{
......@@ -605,7 +605,7 @@ namespace sw
}
Nc.w = Float4(1.0f);
r.o[T0 + stage].x = Nc.x;
r.o[T0 + stage].y = Nc.y;
r.o[T0 + stage].z = Nc.z;
......@@ -614,10 +614,10 @@ namespace sw
break;
case TEXGEN_POSITION:
{
Vector4f Pn = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true); // Position in camera space
Vector4f Pn = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true); // Position in camera space
Pn.w = Float4(1.0f);
r.o[T0 + stage].x = Pn.x;
r.o[T0 + stage].y = Pn.y;
r.o[T0 + stage].z = Pn.z;
......@@ -639,7 +639,7 @@ namespace sw
Vector4f Ec; // Eye vector in camera space
Vector4f N2;
Ec = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
Ec = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
Ec = normalize(Ec);
// R = E - 2 * N * (E . N)
......@@ -690,12 +690,12 @@ namespace sw
Vector4f Ec; // Eye vector in camera space
Vector4f N2;
Ec = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
Ec = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
Ec = normalize(Ec);
// R = E - 2 * N * (E . N)
Float4 dot = Float4(2.0f) * dot3(Ec, Nc);
R.x = Ec.x - Nc.x * dot;
R.y = Ec.y - Nc.y * dot;
R.z = Ec.z - Nc.z * dot;
......@@ -792,7 +792,7 @@ namespace sw
}
}
void VertexPipeline::processPointSize(Registers &r)
void VertexPipeline::processPointSize()
{
if(!state.pointSizeActive)
{
......@@ -810,7 +810,7 @@ namespace sw
if(state.pointScaleActive && !state.preTransformed)
{
Vector4f p = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
Vector4f p = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
Float4 d = Sqrt(dot3(p, p)); // FIXME: length(p);
......@@ -923,7 +923,7 @@ namespace sw
Vector4f dst;
Float4 rcpLength = RcpSqrt_pp(dot3(src, src));
dst.x = src.x * rcpLength;
dst.y = src.y * rcpLength;
dst.z = src.z * rcpLength;
......@@ -934,11 +934,11 @@ namespace sw
Float4 VertexPipeline::power(Float4 &src0, Float4 &src1)
{
Float4 dst = src0;
dst = dst * dst;
dst = dst * dst;
dst = Float4(As<Int4>(dst) - As<Int4>(Float4(1.0f)));
dst *= src1;
dst = As<Float4>(Int4(dst) + As<Int4>(Float4(1.0f)));
......
......@@ -27,11 +27,11 @@ namespace sw
virtual ~VertexPipeline();
private:
void pipeline(Registers &r);
void processTextureCoordinate(Registers &r, int stage, Vector4f &normal, Vector4f &position);
void processPointSize(Registers &r);
void pipeline() override;
void processTextureCoordinate(int stage, Vector4f &normal, Vector4f &position);
void processPointSize();
Vector4f transformBlend(Registers &r, const Register &src, const Pointer<Byte> &matrix, bool homogenous);
Vector4f transformBlend(const Register &src, const Pointer<Byte> &matrix, bool homogenous);
Vector4f transform(const Register &src, const Pointer<Byte> &matrix, bool homogenous);
Vector4f transform(const Register &src, const Pointer<Byte> &matrix, UInt index[4], bool homogenous);
Vector4f normalize(Vector4f &src);
......
......@@ -37,57 +37,57 @@ namespace sw
typedef Shader::Control Control;
typedef Shader::Usage Usage;
void pipeline(Registers &r);
void program(Registers &r);
void passThrough(Registers &r);
void pipeline() override;
void program();
void passThrough();
Vector4f fetchRegisterF(Registers &r, const Src &src, unsigned int offset = 0);
Vector4f readConstant(Registers &r, const Src &src, unsigned int offset = 0);
Int relativeAddress(Registers &r, const Shader::Parameter &var);
Int4 enableMask(Registers &r, const Shader::Instruction *instruction);
Vector4f fetchRegisterF(const Src &src, unsigned int offset = 0);
Vector4f readConstant(const Src &src, unsigned int offset = 0);
Int relativeAddress(const Shader::Parameter &var);
Int4 enableMask(const Shader::Instruction *instruction);
void M3X2(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1);
void M3X3(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1);
void M3X4(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1);
void M4X3(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1);
void M4X4(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1);
void BREAK(Registers &r);
void BREAKC(Registers &r, Vector4f &src0, Vector4f &src1, Control);
void BREAKP(Registers &r, const Src &predicateRegister);
void BREAK(Registers &r, Int4 &condition);
void CONTINUE(Registers &r);
void M3X2(Vector4f &dst, Vector4f &src0, Src &src1);
void M3X3(Vector4f &dst, Vector4f &src0, Src &src1);
void M3X4(Vector4f &dst, Vector4f &src0, Src &src1);
void M4X3(Vector4f &dst, Vector4f &src0, Src &src1);
void M4X4(Vector4f &dst, Vector4f &src0, Src &src1);
void BREAK();
void BREAKC(Vector4f &src0, Vector4f &src1, Control);
void BREAKP(const Src &predicateRegister);
void BREAK(Int4 &condition);
void CONTINUE();
void TEST();
void CALL(Registers &r, int labelIndex, int callSiteIndex);
void CALLNZ(Registers &r, int labelIndex, int callSiteIndex, const Src &src);
void CALLNZb(Registers &r, int labelIndex, int callSiteIndex, const Src &boolRegister);
void CALLNZp(Registers &r, int labelIndex, int callSiteIndex, const Src &predicateRegister);
void ELSE(Registers &r);
void ENDIF(Registers &r);
void ENDLOOP(Registers &r);
void ENDREP(Registers &r);
void ENDWHILE(Registers &r);
void IF(Registers &r, const Src &src);
void IFb(Registers &r, const Src &boolRegister);
void IFp(Registers &r, const Src &predicateRegister);
void IFC(Registers &r, Vector4f &src0, Vector4f &src1, Control);
void IF(Registers &r, Int4 &condition);
void CALL(int labelIndex, int callSiteIndex);
void CALLNZ(int labelIndex, int callSiteIndex, const Src &src);
void CALLNZb(int labelIndex, int callSiteIndex, const Src &boolRegister);
void CALLNZp(int labelIndex, int callSiteIndex, const Src &predicateRegister);
void ELSE();
void ENDIF();
void ENDLOOP();
void ENDREP();
void ENDWHILE();
void IF(const Src &src);
void IFb(const Src &boolRegister);
void IFp(const Src &predicateRegister);
void IFC(Vector4f &src0, Vector4f &src1, Control);
void IF(Int4 &condition);
void LABEL(int labelIndex);
void LOOP(Registers &r, const Src &integerRegister);
void REP(Registers &r, const Src &integerRegister);
void WHILE(Registers &r, const Src &temporaryRegister);
void RET(Registers &r);
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 LOOP(const Src &integerRegister);
void REP(const Src &integerRegister);
void WHILE(const Src &temporaryRegister);
void RET();
void LEAVE();
void TEXLDL(Vector4f &dst, Vector4f &src, const Src&);
void TEX(Vector4f &dst, Vector4f &src, const Src&);
void TEXOFFSET(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2, Vector4f &src3);
void TEXLDL(Vector4f &dst, Vector4f &src, const Src&, Vector4f &src2);
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(Registers &r, Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q);
void sampleTexture(Vector4f &c, const Src &s, Float4 &u, Float4 &v, Float4 &w, Float4 &q);
SamplerCore *sampler[VERTEX_TEXTURE_IMAGE_UNITS];
......
......@@ -63,13 +63,13 @@ namespace sw
{
*Pointer<UInt>(tagCache + tagIndex) = indexQ;
readInput(r, indexQ);
pipeline(r);
postTransform(r);
computeClipFlags(r);
readInput(indexQ);
pipeline();
postTransform();
computeClipFlags();
Pointer<Byte> cacheLine0 = vertexCache + tagIndex * UInt((int)sizeof(Vertex));
writeCache(cacheLine0, r);
writeCache(cacheLine0);
}
UInt cacheIndex = index & 0x0000003F;
......@@ -85,18 +85,18 @@ namespace sw
Return();
}
void VertexRoutine::readInput(Registers &r, UInt &index)
void VertexRoutine::readInput(UInt &index)
{
for(int i = 0; i < VERTEX_ATTRIBUTES; i++)
{
Pointer<Byte> input = *Pointer<Pointer<Byte> >(r.data + OFFSET(DrawData,input) + sizeof(void*) * i);
UInt stride = *Pointer<UInt>(r.data + OFFSET(DrawData,stride) + sizeof(unsigned int) * i);
r.v[i] = readStream(r, input, stride, state.input[i], index);
r.v[i] = readStream(input, stride, state.input[i], index);
}
}
void VertexRoutine::computeClipFlags(Registers &r)
void VertexRoutine::computeClipFlags()
{
int pos = state.positionRegister;
......@@ -136,7 +136,7 @@ namespace sw
}
}
Vector4f VertexRoutine::readStream(Registers &r, Pointer<Byte> &buffer, UInt &stride, const Stream &stream, const UInt &index)
Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const Stream &stream, const UInt &index)
{
const bool texldl = state.shaderContainsTexldl;
......@@ -444,7 +444,7 @@ namespace sw
return v;
}
void VertexRoutine::postTransform(Registers &r)
void VertexRoutine::postTransform()
{
int pos = state.positionRegister;
......@@ -482,7 +482,7 @@ namespace sw
}
}
void VertexRoutine::writeCache(Pointer<Byte> &cacheLine, Registers &r)
void VertexRoutine::writeCache(Pointer<Byte> &cacheLine)
{
Vector4f v;
......
......@@ -85,15 +85,15 @@ namespace sw
const VertexShader *const shader;
private:
virtual void pipeline(Registers &r) = 0;
virtual void pipeline() = 0;
typedef VertexProcessor::State::Input Stream;
Vector4f readStream(Registers &r, Pointer<Byte> &buffer, UInt &stride, const Stream &stream, const UInt &index);
void readInput(Registers &r, UInt &index);
void computeClipFlags(Registers &r);
void postTransform(Registers &r);
void writeCache(Pointer<Byte> &cacheLine, Registers &r);
Vector4f readStream(Pointer<Byte> &buffer, UInt &stride, const Stream &stream, const UInt &index);
void readInput(UInt &index);
void computeClipFlags();
void postTransform();
void writeCache(Pointer<Byte> &cacheLine);
void writeVertex(Pointer<Byte> &vertex, Pointer<Byte> &cacheLine);
};
}
......
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