Commit 3e1fd3a7 by Alexis Hetu Committed by Alexis Hétu

Minor PixelRoutine cleanup

- Removed redundant parameters from fogBlend() - Moved computation registers and color output registers from PixelRoutine to PixelProgram. - Made many PixelRoutine member functions private rather than protected when possible. Change-Id: I748333626d993c0d46b369991d74bc3a22c972c2 Reviewed-on: https://swiftshader-review.googlesource.com/3850Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 3ed16305
// SwiftShader Software Renderer // SwiftShader Software Renderer
// //
// Copyright(c) 2015 Google Inc. // Copyright(c) 2015 Google Inc.
// //
// All rights reserved. No part of this software may be copied, distributed, transmitted, // All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer // transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written // language by any means, or disclosed to third parties without the explicit written
// agreement of Google Inc. Without such an agreement, no rights or licenses, express // agreement of Google Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you. // or implied, including but not limited to any patent rights, are granted to you.
// //
#include "PixelPipeline.hpp" #include "PixelPipeline.hpp"
#include "Renderer.hpp" #include "Renderer.hpp"
#include "SamplerCore.hpp" #include "SamplerCore.hpp"
namespace sw namespace sw
{ {
extern bool postBlendSRGB; extern bool postBlendSRGB;
void PixelPipeline::setBuiltins(PixelRoutine::Registers &rBase, Int &x, Int &y, Float4(&z)[4], Float4 &w) void PixelPipeline::setBuiltins(PixelRoutine::Registers &rBase, Int &x, Int &y, Float4(&z)[4], Float4 &w)
{ {
Registers& r = *static_cast<Registers*>(&rBase); Registers& r = *static_cast<Registers*>(&rBase);
if(state.color[0].component & 0x1) r.diffuse.x = convertFixed12(r.vf[0].x); else r.diffuse.x = Short4(0x1000); if(state.color[0].component & 0x1) r.diffuse.x = convertFixed12(r.v[0].x); else r.diffuse.x = Short4(0x1000);
if(state.color[0].component & 0x2) r.diffuse.y = convertFixed12(r.vf[0].y); else r.diffuse.y = Short4(0x1000); if(state.color[0].component & 0x2) r.diffuse.y = convertFixed12(r.v[0].y); else r.diffuse.y = Short4(0x1000);
if(state.color[0].component & 0x4) r.diffuse.z = convertFixed12(r.vf[0].z); else r.diffuse.z = Short4(0x1000); if(state.color[0].component & 0x4) r.diffuse.z = convertFixed12(r.v[0].z); else r.diffuse.z = Short4(0x1000);
if(state.color[0].component & 0x8) r.diffuse.w = convertFixed12(r.vf[0].w); else r.diffuse.w = Short4(0x1000); if(state.color[0].component & 0x8) r.diffuse.w = convertFixed12(r.v[0].w); else r.diffuse.w = Short4(0x1000);
if(state.color[1].component & 0x1) r.specular.x = convertFixed12(r.vf[1].x); else r.specular.x = Short4(0x0000, 0x0000, 0x0000, 0x0000); if(state.color[1].component & 0x1) r.specular.x = convertFixed12(r.v[1].x); else r.specular.x = Short4(0x0000, 0x0000, 0x0000, 0x0000);
if(state.color[1].component & 0x2) r.specular.y = convertFixed12(r.vf[1].y); else r.specular.y = Short4(0x0000, 0x0000, 0x0000, 0x0000); if(state.color[1].component & 0x2) r.specular.y = convertFixed12(r.v[1].y); else r.specular.y = Short4(0x0000, 0x0000, 0x0000, 0x0000);
if(state.color[1].component & 0x4) r.specular.z = convertFixed12(r.vf[1].z); else r.specular.z = Short4(0x0000, 0x0000, 0x0000, 0x0000); if(state.color[1].component & 0x4) r.specular.z = convertFixed12(r.v[1].z); else r.specular.z = Short4(0x0000, 0x0000, 0x0000, 0x0000);
if(state.color[1].component & 0x8) r.specular.w = convertFixed12(r.vf[1].w); else r.specular.w = Short4(0x0000, 0x0000, 0x0000, 0x0000); if(state.color[1].component & 0x8) r.specular.w = convertFixed12(r.v[1].w); else r.specular.w = Short4(0x0000, 0x0000, 0x0000, 0x0000);
} }
void PixelPipeline::fixedFunction(Registers& r) void PixelPipeline::fixedFunction(Registers& r)
{ {
r.current = r.diffuse; r.current = r.diffuse;
Vector4s temp(0x0000, 0x0000, 0x0000, 0x0000); Vector4s temp(0x0000, 0x0000, 0x0000, 0x0000);
...@@ -54,9 +54,9 @@ namespace sw ...@@ -54,9 +54,9 @@ namespace sw
blendTexture(r, temp, texture, stage); blendTexture(r, temp, texture, stage);
} }
specularPixel(r.current, r.specular); specularPixel(r.current, r.specular);
} }
void PixelPipeline::applyShader(PixelRoutine::Registers &rBase, Int cMask[4]) void PixelPipeline::applyShader(PixelRoutine::Registers &rBase, Int cMask[4])
{ {
Registers& r = *static_cast<Registers*>(&rBase); Registers& r = *static_cast<Registers*>(&rBase);
...@@ -102,10 +102,10 @@ namespace sw ...@@ -102,10 +102,10 @@ namespace sw
if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterS(r, src1); if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterS(r, src1);
if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterS(r, src2); if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterS(r, src2);
Float4 u = version < 0x0104 ? r.vf[2 + dst.index].x : r.vf[2 + src0.index].x; Float4 u = version < 0x0104 ? r.v[2 + dst.index].x : r.v[2 + src0.index].x;
Float4 v = version < 0x0104 ? r.vf[2 + dst.index].y : r.vf[2 + src0.index].y; Float4 v = version < 0x0104 ? r.v[2 + dst.index].y : r.v[2 + src0.index].y;
Float4 s = version < 0x0104 ? r.vf[2 + dst.index].z : r.vf[2 + src0.index].z; Float4 s = version < 0x0104 ? r.v[2 + dst.index].z : r.v[2 + src0.index].z;
Float4 t = version < 0x0104 ? r.vf[2 + dst.index].w : r.vf[2 + src0.index].w; Float4 t = version < 0x0104 ? r.v[2 + dst.index].w : r.v[2 + src0.index].w;
switch(opcode) switch(opcode)
{ {
...@@ -257,12 +257,12 @@ namespace sw ...@@ -257,12 +257,12 @@ namespace sw
} }
} }
} }
} }
Bool PixelPipeline::alphaTest(PixelRoutine::Registers &rBase, Int cMask[4]) Bool PixelPipeline::alphaTest(PixelRoutine::Registers &rBase, Int cMask[4])
{ {
Registers& r = *static_cast<Registers*>(&rBase); Registers& r = *static_cast<Registers*>(&rBase);
r.current.x = Min(r.current.x, Short4(0x0FFF, 0x0FFF, 0x0FFF, 0x0FFF)); r.current.x = Max(r.current.x, Short4(0x0000, 0x0000, 0x0000, 0x0000)); r.current.x = Min(r.current.x, Short4(0x0FFF, 0x0FFF, 0x0FFF, 0x0FFF)); r.current.x = Max(r.current.x, Short4(0x0000, 0x0000, 0x0000, 0x0000));
r.current.y = Min(r.current.y, Short4(0x0FFF, 0x0FFF, 0x0FFF, 0x0FFF)); r.current.y = Max(r.current.y, Short4(0x0000, 0x0000, 0x0000, 0x0000)); r.current.y = Min(r.current.y, Short4(0x0FFF, 0x0FFF, 0x0FFF, 0x0FFF)); r.current.y = Max(r.current.y, Short4(0x0000, 0x0000, 0x0000, 0x0000));
r.current.z = Min(r.current.z, Short4(0x0FFF, 0x0FFF, 0x0FFF, 0x0FFF)); r.current.z = Max(r.current.z, Short4(0x0000, 0x0000, 0x0000, 0x0000)); r.current.z = Min(r.current.z, Short4(0x0FFF, 0x0FFF, 0x0FFF, 0x0FFF)); r.current.z = Max(r.current.z, Short4(0x0000, 0x0000, 0x0000, 0x0000));
...@@ -299,13 +299,13 @@ namespace sw ...@@ -299,13 +299,13 @@ namespace sw
pass = pass | cMask[q]; pass = pass | cMask[q];
} }
return pass != 0x0; return pass != 0x0;
} }
void PixelPipeline::rasterOperation(PixelRoutine::Registers &rBase, Float4 &fog, Pointer<Byte> cBuffer[4], Int &x, Int sMask[4], Int zMask[4], Int cMask[4]) void PixelPipeline::rasterOperation(PixelRoutine::Registers &rBase, Float4 &fog, Pointer<Byte> cBuffer[4], Int &x, Int sMask[4], Int zMask[4], Int cMask[4])
{ {
Registers& r = *static_cast<Registers*>(&rBase); Registers& r = *static_cast<Registers*>(&rBase);
if(!state.colorWriteActive(0)) if(!state.colorWriteActive(0))
{ {
return; return;
...@@ -342,7 +342,7 @@ namespace sw ...@@ -342,7 +342,7 @@ namespace sw
r.current.z &= Short4(0xF800u); r.current.z &= Short4(0xF800u);
} }
fogBlend(r, r.current, fog, r.z[0], r.rhw); fogBlend(r, r.current, fog);
for(unsigned int q = 0; q < state.multiSample; q++) for(unsigned int q = 0; q < state.multiSample; q++)
{ {
...@@ -361,7 +361,7 @@ namespace sw ...@@ -361,7 +361,7 @@ namespace sw
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
convertSigned12(oC, r.current); convertSigned12(oC, r.current);
PixelRoutine::fogBlend(r, oC, fog, r.z[0], r.rhw); PixelRoutine::fogBlend(r, oC, fog);
for(unsigned int q = 0; q < state.multiSample; q++) for(unsigned int q = 0; q < state.multiSample; q++)
{ {
...@@ -377,9 +377,9 @@ namespace sw ...@@ -377,9 +377,9 @@ namespace sw
break; break;
default: default:
ASSERT(false); ASSERT(false);
} }
} }
void PixelPipeline::blendTexture(Registers &r, Vector4s &temp, Vector4s &texture, int stage) void PixelPipeline::blendTexture(Registers &r, Vector4s &temp, Vector4s &texture, int stage)
{ {
Vector4s *arg1; Vector4s *arg1;
...@@ -1172,9 +1172,9 @@ namespace sw ...@@ -1172,9 +1172,9 @@ namespace sw
default: default:
ASSERT(false); ASSERT(false);
} }
} }
void PixelPipeline::fogBlend(Registers &r, Vector4s &current, Float4 &f, Float4 &z, Float4 &rhw) void PixelPipeline::fogBlend(Registers &r, Vector4s &current, Float4 &f)
{ {
if(!state.fogActive) if(!state.fogActive)
{ {
...@@ -1183,7 +1183,7 @@ namespace sw ...@@ -1183,7 +1183,7 @@ namespace sw
if(state.pixelFogMode != FOG_NONE) if(state.pixelFogMode != FOG_NONE)
{ {
pixelFog(r, f, z, rhw); pixelFog(r, f);
} }
UShort4 fog = convertFixed16(f, true); UShort4 fog = convertFixed16(f, true);
...@@ -1197,8 +1197,8 @@ namespace sw ...@@ -1197,8 +1197,8 @@ namespace sw
current.x += As<Short4>(MulHigh(invFog, *Pointer<UShort4>(r.data + OFFSET(DrawData, fog.color4[0])))); current.x += As<Short4>(MulHigh(invFog, *Pointer<UShort4>(r.data + OFFSET(DrawData, fog.color4[0]))));
current.y += As<Short4>(MulHigh(invFog, *Pointer<UShort4>(r.data + OFFSET(DrawData, fog.color4[1])))); current.y += As<Short4>(MulHigh(invFog, *Pointer<UShort4>(r.data + OFFSET(DrawData, fog.color4[1]))));
current.z += As<Short4>(MulHigh(invFog, *Pointer<UShort4>(r.data + OFFSET(DrawData, fog.color4[2])))); current.z += As<Short4>(MulHigh(invFog, *Pointer<UShort4>(r.data + OFFSET(DrawData, fog.color4[2]))));
} }
void PixelPipeline::specularPixel(Vector4s &current, Vector4s &specular) void PixelPipeline::specularPixel(Vector4s &current, Vector4s &specular)
{ {
if(!state.specularAdd) if(!state.specularAdd)
...@@ -1209,14 +1209,14 @@ namespace sw ...@@ -1209,14 +1209,14 @@ namespace sw
current.x = AddSat(current.x, specular.x); current.x = AddSat(current.x, specular.x);
current.y = AddSat(current.y, specular.y); current.y = AddSat(current.y, specular.y);
current.z = AddSat(current.z, specular.z); current.z = AddSat(current.z, specular.z);
} }
void PixelPipeline::sampleTexture(Registers &r, Vector4s &c, int coordinates, int stage, bool project) void PixelPipeline::sampleTexture(Registers &r, Vector4s &c, int coordinates, int stage, bool project)
{ {
Float4 u = r.vf[2 + coordinates].x; Float4 u = r.v[2 + coordinates].x;
Float4 v = r.vf[2 + coordinates].y; Float4 v = r.v[2 + coordinates].y;
Float4 w = r.vf[2 + coordinates].z; Float4 w = r.v[2 + coordinates].z;
Float4 q = r.vf[2 + coordinates].w; Float4 q = r.v[2 + coordinates].w;
if(perturbate) if(perturbate)
{ {
...@@ -1264,7 +1264,7 @@ namespace sw ...@@ -1264,7 +1264,7 @@ namespace sw
r.cycles[PERF_TEX] += Ticks() - texTime; r.cycles[PERF_TEX] += Ticks() - texTime;
#endif #endif
} }
Short4 PixelPipeline::convertFixed12(RValue<Float4> cf) Short4 PixelPipeline::convertFixed12(RValue<Float4> cf)
{ {
return RoundShort4(cf * Float4(0x1000)); return RoundShort4(cf * Float4(0x1000));
...@@ -1290,7 +1290,7 @@ namespace sw ...@@ -1290,7 +1290,7 @@ namespace sw
cf.z = convertSigned12(cs.z); cf.z = convertSigned12(cs.z);
cf.w = convertSigned12(cs.w); cf.w = convertSigned12(cs.w);
} }
void PixelPipeline::writeDestination(Registers &r, Vector4s &d, const Dst &dst) void PixelPipeline::writeDestination(Registers &r, Vector4s &d, const Dst &dst)
{ {
switch(dst.type) switch(dst.type)
...@@ -1324,7 +1324,7 @@ namespace sw ...@@ -1324,7 +1324,7 @@ namespace sw
ASSERT(false); ASSERT(false);
} }
} }
Vector4s PixelPipeline::fetchRegisterS(Registers &r, const Src &src) Vector4s PixelPipeline::fetchRegisterS(Registers &r, const Src &src)
{ {
Vector4s *reg; Vector4s *reg;
...@@ -1451,7 +1451,7 @@ namespace sw ...@@ -1451,7 +1451,7 @@ namespace sw
return mod; return mod;
} }
void PixelPipeline::MOV(Vector4s &dst, Vector4s &src0) void PixelPipeline::MOV(Vector4s &dst, Vector4s &src0)
{ {
dst.x = src0.x; dst.x = src0.x;
...@@ -1887,9 +1887,9 @@ namespace sw ...@@ -1887,9 +1887,9 @@ namespace sw
Float4 E[3]; // Eye vector Float4 E[3]; // Eye vector
E[0] = r.vf[2 + stage - 2].w; E[0] = r.v[2 + stage - 2].w;
E[1] = r.vf[2 + stage - 1].w; E[1] = r.v[2 + stage - 1].w;
E[2] = r.vf[2 + stage - 0].w; E[2] = r.v[2 + stage - 0].w;
// Reflection // Reflection
Float4 u__; Float4 u__;
...@@ -1964,5 +1964,5 @@ namespace sw ...@@ -1964,5 +1964,5 @@ namespace sw
t0 = AddSat(t0, src0.y); t0 = AddSat(t0, src0.y);
dst.y = t0; dst.y = t0;
} }
} }
...@@ -59,7 +59,7 @@ namespace sw ...@@ -59,7 +59,7 @@ namespace sw
void fixedFunction(Registers& r); void fixedFunction(Registers& r);
void blendTexture(Registers &r, Vector4s &temp, Vector4s &texture, int stage); void blendTexture(Registers &r, Vector4s &temp, Vector4s &texture, int stage);
void fogBlend(Registers &r, Vector4s &current, Float4 &fog, Float4 &z, Float4 &rhw); void fogBlend(Registers &r, Vector4s &current, Float4 &fog);
void specularPixel(Vector4s &current, Vector4s &specular); void specularPixel(Vector4s &current, Vector4s &specular);
void sampleTexture(Registers &r, Vector4s &c, int coordinates, int sampler, bool project = false); void sampleTexture(Registers &r, Vector4s &c, int coordinates, int sampler, bool project = false);
......
...@@ -121,14 +121,14 @@ namespace sw ...@@ -121,14 +121,14 @@ namespace sw
{ {
if(dst.type == Shader::PARAMETER_TEXTURE) if(dst.type == Shader::PARAMETER_TEXTURE)
{ {
d.x = r.vf[2 + dst.index].x; d.x = r.v[2 + dst.index].x;
d.y = r.vf[2 + dst.index].y; d.y = r.v[2 + dst.index].y;
d.z = r.vf[2 + dst.index].z; d.z = r.v[2 + dst.index].z;
d.w = r.vf[2 + dst.index].w; d.w = r.v[2 + dst.index].w;
} }
else else
{ {
d = r.rf[dst.index]; d = r.r[dst.index];
} }
} }
...@@ -342,19 +342,19 @@ namespace sw ...@@ -342,19 +342,19 @@ namespace sw
case Shader::PARAMETER_TEMP: case Shader::PARAMETER_TEMP:
if(dst.rel.type == Shader::PARAMETER_VOID) if(dst.rel.type == Shader::PARAMETER_VOID)
{ {
if(dst.x) pDst.x = r.rf[dst.index].x; if(dst.x) pDst.x = r.r[dst.index].x;
if(dst.y) pDst.y = r.rf[dst.index].y; if(dst.y) pDst.y = r.r[dst.index].y;
if(dst.z) pDst.z = r.rf[dst.index].z; if(dst.z) pDst.z = r.r[dst.index].z;
if(dst.w) pDst.w = r.rf[dst.index].w; if(dst.w) pDst.w = r.r[dst.index].w;
} }
else else
{ {
Int a = relativeAddress(r, dst); Int a = relativeAddress(r, dst);
if(dst.x) pDst.x = r.rf[dst.index + a].x; if(dst.x) pDst.x = r.r[dst.index + a].x;
if(dst.y) pDst.y = r.rf[dst.index + a].y; if(dst.y) pDst.y = r.r[dst.index + a].y;
if(dst.z) pDst.z = r.rf[dst.index + a].z; if(dst.z) pDst.z = r.r[dst.index + a].z;
if(dst.w) pDst.w = r.rf[dst.index + a].w; if(dst.w) pDst.w = r.r[dst.index + a].w;
} }
break; break;
case Shader::PARAMETER_COLOROUT: case Shader::PARAMETER_COLOROUT:
...@@ -425,19 +425,19 @@ namespace sw ...@@ -425,19 +425,19 @@ namespace sw
case Shader::PARAMETER_TEMP: case Shader::PARAMETER_TEMP:
if(dst.rel.type == Shader::PARAMETER_VOID) if(dst.rel.type == Shader::PARAMETER_VOID)
{ {
if(dst.x) r.rf[dst.index].x = d.x; if(dst.x) r.r[dst.index].x = d.x;
if(dst.y) r.rf[dst.index].y = d.y; if(dst.y) r.r[dst.index].y = d.y;
if(dst.z) r.rf[dst.index].z = d.z; if(dst.z) r.r[dst.index].z = d.z;
if(dst.w) r.rf[dst.index].w = d.w; if(dst.w) r.r[dst.index].w = d.w;
} }
else else
{ {
Int a = relativeAddress(r, dst); Int a = relativeAddress(r, dst);
if(dst.x) r.rf[dst.index + a].x = d.x; if(dst.x) r.r[dst.index + a].x = d.x;
if(dst.y) r.rf[dst.index + a].y = d.y; if(dst.y) r.r[dst.index + a].y = d.y;
if(dst.z) r.rf[dst.index + a].z = d.z; if(dst.z) r.r[dst.index + a].z = d.z;
if(dst.w) r.rf[dst.index + a].w = d.w; if(dst.w) r.r[dst.index + a].w = d.w;
} }
break; break;
case Shader::PARAMETER_COLOROUT: case Shader::PARAMETER_COLOROUT:
...@@ -539,7 +539,7 @@ namespace sw ...@@ -539,7 +539,7 @@ namespace sw
if(index == 0) if(index == 0)
{ {
fogBlend(r, r.oC[index], fog, r.z[0], r.rhw); fogBlend(r, r.oC[index], fog);
} }
switch(state.targetFormat[index]) switch(state.targetFormat[index])
...@@ -714,32 +714,32 @@ namespace sw ...@@ -714,32 +714,32 @@ namespace sw
case Shader::PARAMETER_TEMP: case Shader::PARAMETER_TEMP:
if(src.rel.type == Shader::PARAMETER_VOID) if(src.rel.type == Shader::PARAMETER_VOID)
{ {
reg = r.rf[i]; reg = r.r[i];
} }
else else
{ {
Int a = relativeAddress(r, src); Int a = relativeAddress(r, src);
reg = r.rf[i + a]; reg = r.r[i + a];
} }
break; break;
case Shader::PARAMETER_INPUT: case Shader::PARAMETER_INPUT:
{ {
if(src.rel.type == Shader::PARAMETER_VOID) // Not relative if(src.rel.type == Shader::PARAMETER_VOID) // Not relative
{ {
reg = r.vf[i]; reg = r.v[i];
} }
else if(src.rel.type == Shader::PARAMETER_LOOP) else if(src.rel.type == Shader::PARAMETER_LOOP)
{ {
Int aL = r.aL[r.loopDepth]; Int aL = r.aL[r.loopDepth];
reg = r.vf[i + aL]; reg = r.v[i + aL];
} }
else else
{ {
Int a = relativeAddress(r, src); Int a = relativeAddress(r, src);
reg = r.vf[i + a]; reg = r.v[i + a];
} }
} }
break; break;
...@@ -747,7 +747,7 @@ namespace sw ...@@ -747,7 +747,7 @@ namespace sw
reg = readConstant(r, src, offset); reg = readConstant(r, src, offset);
break; break;
case Shader::PARAMETER_TEXTURE: case Shader::PARAMETER_TEXTURE:
reg = r.vf[2 + i]; reg = r.v[2 + i];
break; break;
case Shader::PARAMETER_MISCTYPE: case Shader::PARAMETER_MISCTYPE:
if(src.index == 0) reg = r.vPos; if(src.index == 0) reg = r.vPos;
...@@ -760,7 +760,7 @@ namespace sw ...@@ -760,7 +760,7 @@ namespace sw
} }
else if(src.rel.type == Shader::PARAMETER_TEMP) else if(src.rel.type == Shader::PARAMETER_TEMP)
{ {
reg.x = As<Float4>(Int4(i) + As<Int4>(r.rf[src.rel.index].x)); reg.x = As<Float4>(Int4(i) + As<Int4>(r.r[src.rel.index].x));
} }
return reg; return reg;
case Shader::PARAMETER_PREDICATE: return reg; // Dummy case Shader::PARAMETER_PREDICATE: return reg; // Dummy
...@@ -898,11 +898,11 @@ namespace sw ...@@ -898,11 +898,11 @@ namespace sw
if(var.rel.type == Shader::PARAMETER_TEMP) if(var.rel.type == Shader::PARAMETER_TEMP)
{ {
return As<Int>(Extract(r.rf[var.rel.index].x, 0)) * var.rel.scale; return As<Int>(Extract(r.r[var.rel.index].x, 0)) * var.rel.scale;
} }
else if(var.rel.type == Shader::PARAMETER_INPUT) else if(var.rel.type == Shader::PARAMETER_INPUT)
{ {
return As<Int>(Extract(r.vf[var.rel.index].x, 0)) * var.rel.scale; return As<Int>(Extract(r.v[var.rel.index].x, 0)) * var.rel.scale;
} }
else if(var.rel.type == Shader::PARAMETER_OUTPUT) else if(var.rel.type == Shader::PARAMETER_OUTPUT)
{ {
......
...@@ -38,7 +38,10 @@ namespace sw ...@@ -38,7 +38,10 @@ namespace sw
private: private:
struct Registers : public PixelRoutine::Registers struct Registers : public PixelRoutine::Registers
{ {
Registers(const PixelShader *shader) : PixelRoutine::Registers(shader), loopDepth(-1) Registers(const PixelShader *shader) :
PixelRoutine::Registers(shader),
r(shader && shader->dynamicallyIndexedTemporaries),
loopDepth(-1)
{ {
enableStack[0] = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); enableStack[0] = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
...@@ -53,6 +56,12 @@ namespace sw ...@@ -53,6 +56,12 @@ namespace sw
} }
} }
// Temporary registers
RegisterArray<4096> r;
// Color outputs
Vector4f oC[4];
// Shader variables // Shader variables
Vector4f vPos; Vector4f vPos;
Vector4f vFace; Vector4f vFace;
......
...@@ -29,17 +29,16 @@ namespace sw ...@@ -29,17 +29,16 @@ namespace sw
PixelRoutine::Registers::Registers(const PixelShader *shader) : PixelRoutine::Registers::Registers(const PixelShader *shader) :
QuadRasterizer::Registers(), QuadRasterizer::Registers(),
rf(shader && shader->dynamicallyIndexedTemporaries), v(shader && shader->dynamicallyIndexedInput)
vf(shader && shader->dynamicallyIndexedInput)
{ {
if(!shader || shader->getVersion() < 0x0200 || forceClearRegisters) if(!shader || shader->getVersion() < 0x0200 || forceClearRegisters)
{ {
for(int i = 0; i < 10; i++) for(int i = 0; i < 10; i++)
{ {
vf[i].x = Float4(0.0f); v[i].x = Float4(0.0f);
vf[i].y = Float4(0.0f); v[i].y = Float4(0.0f);
vf[i].z = Float4(0.0f); v[i].z = Float4(0.0f);
vf[i].w = Float4(0.0f); v[i].w = Float4(0.0f);
} }
} }
} }
...@@ -169,11 +168,11 @@ namespace sw ...@@ -169,11 +168,11 @@ namespace sw
{ {
if(!state.interpolant[interpolant].centroid) if(!state.interpolant[interpolant].centroid)
{ {
r.vf[interpolant][component] = interpolate(xxxx, r.Dv[interpolant][component], rhw, r.primitive + OFFSET(Primitive, V[interpolant][component]), (state.interpolant[interpolant].flat & (1 << component)) != 0, state.perspective); r.v[interpolant][component] = interpolate(xxxx, r.Dv[interpolant][component], rhw, r.primitive + OFFSET(Primitive, V[interpolant][component]), (state.interpolant[interpolant].flat & (1 << component)) != 0, state.perspective);
} }
else else
{ {
r.vf[interpolant][component] = interpolateCentroid(XXXX, YYYY, rhwCentroid, r.primitive + OFFSET(Primitive, V[interpolant][component]), (state.interpolant[interpolant].flat & (1 << component)) != 0, state.perspective); r.v[interpolant][component] = interpolateCentroid(XXXX, YYYY, rhwCentroid, r.primitive + OFFSET(Primitive, V[interpolant][component]), (state.interpolant[interpolant].flat & (1 << component)) != 0, state.perspective);
} }
} }
} }
...@@ -185,19 +184,19 @@ namespace sw ...@@ -185,19 +184,19 @@ namespace sw
case 0: case 0:
break; break;
case 1: case 1:
rcp = reciprocal(r.vf[interpolant].y); rcp = reciprocal(r.v[interpolant].y);
r.vf[interpolant].x = r.vf[interpolant].x * rcp; r.v[interpolant].x = r.v[interpolant].x * rcp;
break; break;
case 2: case 2:
rcp = reciprocal(r.vf[interpolant].z); rcp = reciprocal(r.v[interpolant].z);
r.vf[interpolant].x = r.vf[interpolant].x * rcp; r.v[interpolant].x = r.v[interpolant].x * rcp;
r.vf[interpolant].y = r.vf[interpolant].y * rcp; r.v[interpolant].y = r.v[interpolant].y * rcp;
break; break;
case 3: case 3:
rcp = reciprocal(r.vf[interpolant].w); rcp = reciprocal(r.v[interpolant].w);
r.vf[interpolant].x = r.vf[interpolant].x * rcp; r.v[interpolant].x = r.v[interpolant].x * rcp;
r.vf[interpolant].y = r.vf[interpolant].y * rcp; r.v[interpolant].y = r.v[interpolant].y * rcp;
r.vf[interpolant].z = r.vf[interpolant].z * rcp; r.v[interpolant].z = r.v[interpolant].z * rcp;
break; break;
} }
} }
...@@ -602,7 +601,7 @@ namespace sw ...@@ -602,7 +601,7 @@ namespace sw
cMask[3] &= aMask3; cMask[3] &= aMask3;
} }
void PixelRoutine::fogBlend(Registers &r, Vector4f &c0, Float4 &fog, Float4 &z, Float4 &rhw) void PixelRoutine::fogBlend(Registers &r, Vector4f &c0, Float4 &fog)
{ {
if(!state.fogActive) if(!state.fogActive)
{ {
...@@ -611,7 +610,7 @@ namespace sw ...@@ -611,7 +610,7 @@ namespace sw
if(state.pixelFogMode != FOG_NONE) if(state.pixelFogMode != FOG_NONE)
{ {
pixelFog(r, fog, z, rhw); pixelFog(r, fog);
fog = Min(fog, Float4(1.0f)); fog = Min(fog, Float4(1.0f));
fog = Max(fog, Float4(0.0f)); fog = Max(fog, Float4(0.0f));
...@@ -630,7 +629,7 @@ namespace sw ...@@ -630,7 +629,7 @@ namespace sw
c0.z += *Pointer<Float4>(r.data + OFFSET(DrawData,fog.colorF[2])); c0.z += *Pointer<Float4>(r.data + OFFSET(DrawData,fog.colorF[2]));
} }
void PixelRoutine::pixelFog(Registers &r, Float4 &visibility, Float4 &z, Float4 &rhw) void PixelRoutine::pixelFog(Registers &r, Float4 &visibility)
{ {
Float4 &zw = visibility; Float4 &zw = visibility;
...@@ -638,17 +637,17 @@ namespace sw ...@@ -638,17 +637,17 @@ namespace sw
{ {
if(state.wBasedFog) if(state.wBasedFog)
{ {
zw = rhw; zw = r.rhw;
} }
else else
{ {
if(complementaryDepthBuffer) if(complementaryDepthBuffer)
{ {
zw = Float4(1.0f) - z; zw = Float4(1.0f) - r.z[0];
} }
else else
{ {
zw = z; zw = r.z[0];
} }
} }
} }
......
...@@ -37,11 +37,9 @@ namespace sw ...@@ -37,11 +37,9 @@ namespace sw
Float4 w; // Used as is Float4 w; // Used as is
Float4 rhw; // Reciprocal w Float4 rhw; // Reciprocal w
RegisterArray<4096> rf; // Computation registers RegisterArray<10> v; // Varying registers
RegisterArray<10> vf; // Varying registers
// Outputs // Depth output
Vector4f oC[4];
Float4 oDepth; Float4 oDepth;
}; };
...@@ -56,41 +54,46 @@ namespace sw ...@@ -56,41 +54,46 @@ namespace sw
virtual void quad(QuadRasterizer::Registers &r, Pointer<Byte> cBuffer[4], Pointer<Byte> &zBuffer, Pointer<Byte> &sBuffer, Int cMask[4], Int &x, Int &y); virtual void quad(QuadRasterizer::Registers &r, Pointer<Byte> cBuffer[4], Pointer<Byte> &zBuffer, Pointer<Byte> &sBuffer, Int cMask[4], Int &x, Int &y);
void alphaTest(Registers &r, Int &aMask, Short4 &alpha);
void alphaToCoverage(Registers &r, Int cMask[4], Float4 &alpha);
void fogBlend(Registers &r, Vector4f &c0, Float4 &fog);
void pixelFog(Registers &r, Float4 &visibility);
// Raster operations
void alphaBlend(Registers &r, int index, Pointer<Byte> &cBuffer, Vector4s &current, Int &x);
void logicOperation(Registers &r, int index, Pointer<Byte> &cBuffer, Vector4s &current, Int &x);
void writeColor(Registers &r, int index, Pointer<Byte> &cBuffer, Int &i, Vector4s &current, Int &sMask, Int &zMask, Int &cMask);
void alphaBlend(Registers &r, int index, Pointer<Byte> &cBuffer, Vector4f &oC, Int &x);
void writeColor(Registers &r, int index, Pointer<Byte> &cBuffer, Int &i, Vector4f &oC, Int &sMask, Int &zMask, Int &cMask);
UShort4 convertFixed16(Float4 &cf, bool saturate = true);
void linearToSRGB12_16(Registers &r, Vector4s &c);
SamplerCore *sampler[TEXTURE_IMAGE_UNITS];
private:
Float4 interpolateCentroid(Float4 &x, Float4 &y, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective); Float4 interpolateCentroid(Float4 &x, Float4 &y, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective);
void stencilTest(Registers &r, Pointer<Byte> &sBuffer, int q, Int &x, Int &sMask, Int &cMask); void stencilTest(Registers &r, Pointer<Byte> &sBuffer, int q, Int &x, Int &sMask, Int &cMask);
void stencilTest(Registers &r, Byte8 &value, StencilCompareMode stencilCompareMode, bool CCW); void stencilTest(Registers &r, Byte8 &value, StencilCompareMode stencilCompareMode, bool CCW);
void stencilOperation(Registers &r, Byte8 &newValue, Byte8 &bufferValue, StencilOperation stencilPassOperation, StencilOperation stencilZFailOperation, StencilOperation stencilFailOperation, bool CCW, Int &zMask, Int &sMask); void stencilOperation(Registers &r, Byte8 &newValue, Byte8 &bufferValue, StencilOperation stencilPassOperation, StencilOperation stencilZFailOperation, StencilOperation stencilFailOperation, bool CCW, Int &zMask, Int &sMask);
void stencilOperation(Registers &r, Byte8 &output, Byte8 &bufferValue, StencilOperation operation, bool CCW); void stencilOperation(Registers &r, Byte8 &output, Byte8 &bufferValue, StencilOperation operation, bool CCW);
Bool depthTest(Registers &r, Pointer<Byte> &zBuffer, int q, Int &x, Float4 &z, Int &sMask, Int &zMask, Int &cMask); Bool depthTest(Registers &r, Pointer<Byte> &zBuffer, int q, Int &x, Float4 &z, Int &sMask, Int &zMask, Int &cMask);
void alphaTest(Registers &r, Int &aMask, Short4 &alpha);
void alphaToCoverage(Registers &r, Int cMask[4], Float4 &alpha);
void fogBlend(Registers &r, Vector4f &c0, Float4 &fog, Float4 &z, Float4 &rhw);
void pixelFog(Registers &r, Float4 &visibility, Float4 &z, Float4 &rhw);
// Raster operations // Raster operations
void blendFactor(Registers &r, const Vector4s &blendFactor, const Vector4s &current, const Vector4s &pixel, BlendFactor blendFactorActive); void blendFactor(Registers &r, const Vector4s &blendFactor, const Vector4s &current, const Vector4s &pixel, BlendFactor blendFactorActive);
void blendFactorAlpha(Registers &r, const Vector4s &blendFactor, const Vector4s &current, const Vector4s &pixel, BlendFactor blendFactorAlphaActive); void blendFactorAlpha(Registers &r, const Vector4s &blendFactor, const Vector4s &current, const Vector4s &pixel, BlendFactor blendFactorAlphaActive);
void readPixel(Registers &r, int index, Pointer<Byte> &cBuffer, Int &x, Vector4s &pixel); void readPixel(Registers &r, int index, Pointer<Byte> &cBuffer, Int &x, Vector4s &pixel);
void alphaBlend(Registers &r, int index, Pointer<Byte> &cBuffer, Vector4s &current, Int &x);
void logicOperation(Registers &r, int index, Pointer<Byte> &cBuffer, Vector4s &current, Int &x);
void writeColor(Registers &r, int index, Pointer<Byte> &cBuffer, Int &i, Vector4s &current, Int &sMask, Int &zMask, Int &cMask);
void blendFactor(Registers &r, const Vector4f &blendFactor, const Vector4f &oC, const Vector4f &pixel, BlendFactor blendFactorActive); void blendFactor(Registers &r, const Vector4f &blendFactor, const Vector4f &oC, const Vector4f &pixel, BlendFactor blendFactorActive);
void blendFactorAlpha(Registers &r, const Vector4f &blendFactor, const Vector4f &oC, const Vector4f &pixel, BlendFactor blendFactorAlphaActive); void blendFactorAlpha(Registers &r, const Vector4f &blendFactor, const Vector4f &oC, const Vector4f &pixel, BlendFactor blendFactorAlphaActive);
void alphaBlend(Registers &r, int index, Pointer<Byte> &cBuffer, Vector4f &oC, Int &x);
void writeColor(Registers &r, int index, Pointer<Byte> &cBuffer, Int &i, Vector4f &oC, Int &sMask, Int &zMask, Int &cMask);
void writeStencil(Registers &r, Pointer<Byte> &sBuffer, int q, Int &x, Int &sMask, Int &zMask, Int &cMask); void writeStencil(Registers &r, Pointer<Byte> &sBuffer, int q, Int &x, Int &sMask, Int &zMask, Int &cMask);
void writeDepth(Registers &r, Pointer<Byte> &zBuffer, int q, Int &x, Float4 &z, Int &zMask); void writeDepth(Registers &r, Pointer<Byte> &zBuffer, int q, Int &x, Float4 &z, Int &zMask);
UShort4 convertFixed16(Float4 &cf, bool saturate = true);
void sRGBtoLinear16_12_16(Registers &r, Vector4s &c); void sRGBtoLinear16_12_16(Registers &r, Vector4s &c);
void sRGBtoLinear12_16(Registers &r, Vector4s &c); void sRGBtoLinear12_16(Registers &r, Vector4s &c);
void linearToSRGB16_12_16(Registers &r, Vector4s &c); void linearToSRGB16_12_16(Registers &r, Vector4s &c);
void linearToSRGB12_16(Registers &r, Vector4s &c);
Float4 sRGBtoLinear(const Float4 &x); Float4 sRGBtoLinear(const Float4 &x);
bool colorUsed(); bool colorUsed();
SamplerCore *sampler[TEXTURE_IMAGE_UNITS];
}; };
} }
......
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