Update SwiftShader to April code dump.
April code dump from Transgaming. Adds new shader compiler.
diff --git a/src/Shader/VertexPipeline.cpp b/src/Shader/VertexPipeline.cpp
index 112b451..1e39ca7 100644
--- a/src/Shader/VertexPipeline.cpp
+++ b/src/Shader/VertexPipeline.cpp
@@ -1,6 +1,6 @@
// SwiftShader Software Renderer
//
-// Copyright(c) 2005-2011 TransGaming Inc.
+// Copyright(c) 2005-2012 TransGaming Inc.
//
// 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
@@ -24,7 +24,7 @@
namespace sw
{
- VertexPipeline::VertexPipeline(const VertexProcessor::State &state) : VertexRoutine(state)
+ VertexPipeline::VertexPipeline(const VertexProcessor::State &state) : VertexRoutine(state, 0)
{
}
@@ -32,9 +32,9 @@
{
}
- Color4f VertexPipeline::transformBlend(Registers &r, Color4f &src, Pointer<Byte> &matrix, bool homogeneous)
+ Vector4f VertexPipeline::transformBlend(Registers &r, Register &src, Pointer<Byte> &matrix, bool homogeneous)
{
- Color4f dst;
+ Vector4f dst;
if(state.vertexBlendMatrixCount == 0)
{
@@ -51,14 +51,15 @@
{
for(int i = 0; i < 4; i++)
{
+ Float4 B = r.v[BlendIndices].x;
UInt indices;
switch(i)
{
- case 0: indices = As<UInt>(Float(r.v[BlendIndices].x.x)); break;
- case 1: indices = As<UInt>(Float(r.v[BlendIndices].x.y)); break;
- case 2: indices = As<UInt>(Float(r.v[BlendIndices].x.z)); break;
- case 3: indices = As<UInt>(Float(r.v[BlendIndices].x.w)); break;
+ case 0: indices = As<UInt>(Float(B.x)); break;
+ case 1: indices = As<UInt>(Float(B.y)); break;
+ case 2: indices = As<UInt>(Float(B.z)); break;
+ case 3: indices = As<UInt>(Float(B.w)); break;
}
index0[i] = (indices & UInt(0x000000FF)) << UInt(6); // FIXME: (indices & 0x000000FF) << 6
@@ -100,13 +101,13 @@
{
weight1 = Float4(1.0f) - weight0;
- Color4f pos0;
- Color4f pos1;
+ Vector4f pos0;
+ Vector4f pos1;
pos0 = transform(src, matrix, index0, homogeneous);
pos1 = transform(src, matrix, index1, homogeneous);
- dst.x = pos0.x * weight0 + pos1.x * weight1; // FIXME: Color4f operators
+ dst.x = pos0.x * weight0 + pos1.x * weight1; // FIXME: Vector4f operators
dst.y = pos0.y * weight0 + pos1.y * weight1;
dst.z = pos0.z * weight0 + pos1.z * weight1;
dst.w = pos0.w * weight0 + pos1.w * weight1;
@@ -115,9 +116,9 @@
{
weight2 = Float4(1.0f) - (weight0 + weight1);
- Color4f pos0;
- Color4f pos1;
- Color4f pos2;
+ Vector4f pos0;
+ Vector4f pos1;
+ Vector4f pos2;
pos0 = transform(src, matrix, index0, homogeneous);
pos1 = transform(src, matrix, index1, homogeneous);
@@ -132,10 +133,10 @@
{
weight3 = Float4(1.0f) - (weight0 + weight1 + weight2);
- Color4f pos0;
- Color4f pos1;
- Color4f pos2;
- Color4f pos3;
+ Vector4f pos0;
+ Vector4f pos1;
+ Vector4f pos2;
+ Vector4f pos3;
pos0 = transform(src, matrix, index0, homogeneous);
pos1 = transform(src, matrix, index1, homogeneous);
@@ -154,8 +155,8 @@
void VertexPipeline::pipeline(Registers &r)
{
- Color4f position;
- Color4f normal;
+ Vector4f position;
+ Vector4f normal;
if(!state.preTransformed)
{
@@ -166,10 +167,10 @@
position = r.v[PositionT];
}
- r.ox[Pos] = position.x;
- r.oy[Pos] = position.y;
- r.oz[Pos] = position.z;
- r.ow[Pos] = position.w;
+ r.o[Pos].x = position.x;
+ r.o[Pos].y = position.y;
+ r.o[Pos].z = position.z;
+ r.o[Pos].w = position.w;
if(state.vertexNormalActive)
{
@@ -186,59 +187,59 @@
// FIXME: Don't process if not used at all
if(state.diffuseActive && state.input[Color0])
{
- Color4f diffuse = r.v[Color0];
+ Vector4f diffuse = r.v[Color0];
- r.ox[D0] = diffuse.x;
- r.oy[D0] = diffuse.y;
- r.oz[D0] = diffuse.z;
- r.ow[D0] = diffuse.w;
+ r.o[D0].x = diffuse.x;
+ r.o[D0].y = diffuse.y;
+ r.o[D0].z = diffuse.z;
+ r.o[D0].w = diffuse.w;
}
else
{
- r.ox[D0] = Float4(1.0f, 1.0f, 1.0f, 1.0f);
- r.oy[D0] = Float4(1.0f, 1.0f, 1.0f, 1.0f);
- r.oz[D0] = Float4(1.0f, 1.0f, 1.0f, 1.0f);
- r.ow[D0] = Float4(1.0f, 1.0f, 1.0f, 1.0f);
+ r.o[D0].x = Float4(1.0f);
+ r.o[D0].y = Float4(1.0f);
+ r.o[D0].z = Float4(1.0f);
+ r.o[D0].w = Float4(1.0f);
}
// FIXME: Don't process if not used at all
if(state.specularActive && state.input[Color1])
{
- Color4f specular = r.v[Color1];
+ Vector4f specular = r.v[Color1];
- r.ox[D1] = specular.x;
- r.oy[D1] = specular.y;
- r.oz[D1] = specular.z;
- r.ow[D1] = specular.w;
+ r.o[D1].x = specular.x;
+ r.o[D1].y = specular.y;
+ r.o[D1].z = specular.z;
+ r.o[D1].w = specular.w;
}
else
{
- r.ox[D1] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- r.oy[D1] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- r.oz[D1] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- r.ow[D1] = Float4(1.0f, 1.0f, 1.0f, 1.0f);
+ r.o[D1].x = Float4(0.0f);
+ r.o[D1].y = Float4(0.0f);
+ r.o[D1].z = Float4(0.0f);
+ r.o[D1].w = Float4(1.0f);
}
}
else
{
- Color4f diffuseSum;
+ Vector4f diffuseSum;
- r.ox[D0] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- r.oy[D0] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- r.oz[D0] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- r.ow[D0] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
+ r.o[D0].x = Float4(0.0f);
+ r.o[D0].y = Float4(0.0f);
+ r.o[D0].z = Float4(0.0f);
+ r.o[D0].w = Float4(0.0f);
- r.ox[D1] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- r.oy[D1] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- r.oz[D1] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- r.ow[D1] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
+ r.o[D1].x = Float4(0.0f);
+ r.o[D1].y = Float4(0.0f);
+ r.o[D1].z = Float4(0.0f);
+ r.o[D1].w = Float4(0.0f);
- diffuseSum.x = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- diffuseSum.y = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- diffuseSum.z = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- diffuseSum.w = Float4(0.0f, 0.0f, 0.0f, 0.0f);
+ diffuseSum.x = Float4(0.0f);
+ diffuseSum.y = Float4(0.0f);
+ diffuseSum.z = Float4(0.0f);
+ diffuseSum.w = Float4(0.0f);
- Color4f vertexPosition = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
+ Vector4f vertexPosition = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
for(int i = 0; i < 8; i++)
{
@@ -247,7 +248,7 @@
continue;
}
- Color4f L; // Light vector
+ Vector4f L; // Light vector
Float4 att; // Attenuation
// Attenuation
@@ -280,9 +281,9 @@
{
Float4 lightAmbient = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.lightAmbient[i])); // FIXME: Unpack
- r.ox[D0] = r.ox[D0] + lightAmbient.x * att;
- r.oy[D0] = r.oy[D0] + lightAmbient.y * att;
- r.oz[D0] = r.oz[D0] + lightAmbient.z * att;
+ r.o[D0].x = r.o[D0].x + lightAmbient.x * att;
+ r.o[D0].y = r.o[D0].y + lightAmbient.y * att;
+ r.o[D0].z = r.o[D0].z + lightAmbient.z * att;
}
// Diffuse
@@ -291,10 +292,10 @@
Float4 dot;
dot = dot3(L, normal);
- dot = Max(dot, Float4(0.0f, 0.0f, 0.0f, 0.0f));
+ dot = Max(dot, Float4(0.0f));
dot *= att;
- Color4f diff;
+ Vector4f diff;
if(state.vertexDiffuseMaterialSourceActive == Context::MATERIAL)
{
@@ -323,15 +324,15 @@
// Specular
if(state.vertexSpecularActive)
{
- Color4f S;
- Color4f C; // Camera vector
+ Vector4f S;
+ Vector4f C; // Camera vector
Float4 pow;
pow = *Pointer<Float>(r.data + OFFSET(DrawData,ff.materialShininess));
- S.x = Float4(0.0f, 0.0f, 0.0f, 0.0f) - vertexPosition.x;
- S.y = Float4(0.0f, 0.0f, 0.0f, 0.0f) - vertexPosition.y;
- S.z = Float4(0.0f, 0.0f, 0.0f, 0.0f) - vertexPosition.z;
+ S.x = Float4(0.0f) - vertexPosition.x;
+ S.y = Float4(0.0f) - vertexPosition.y;
+ S.z = Float4(0.0f) - vertexPosition.z;
C = normalize(S);
S.x = L.x + C.x;
@@ -344,7 +345,7 @@
Float4 P = power(dot, pow);
P *= att;
- Color4f spec;
+ Vector4f spec;
if(state.vertexSpecularMaterialSourceActive == Context::MATERIAL)
{
@@ -374,93 +375,93 @@
spec.y *= P;
spec.z *= P;
- spec.x = Max(spec.x, Float4(0.0f, 0.0f, 0.0f, 0.0f));
- spec.y = Max(spec.y, Float4(0.0f, 0.0f, 0.0f, 0.0f));
- spec.z = Max(spec.z, Float4(0.0f, 0.0f, 0.0f, 0.0f));
+ spec.x = Max(spec.x, Float4(0.0f));
+ spec.y = Max(spec.y, Float4(0.0f));
+ spec.z = Max(spec.z, Float4(0.0f));
- r.ox[D1] = r.ox[D1] + spec.x;
- r.oy[D1] = r.oy[D1] + spec.y;
- r.oz[D1] = r.oz[D1] + spec.z;
+ r.o[D1].x = r.o[D1].x + spec.x;
+ r.o[D1].y = r.o[D1].y + spec.y;
+ r.o[D1].z = r.o[D1].z + spec.z;
}
}
Float4 globalAmbient = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.globalAmbient)); // FIXME: Unpack
- r.ox[D0] = r.ox[D0] + globalAmbient.x;
- r.oy[D0] = r.oy[D0] + globalAmbient.y;
- r.oz[D0] = r.oz[D0] + globalAmbient.z;
+ r.o[D0].x = r.o[D0].x + globalAmbient.x;
+ r.o[D0].y = r.o[D0].y + globalAmbient.y;
+ r.o[D0].z = r.o[D0].z + globalAmbient.z;
if(state.vertexAmbientMaterialSourceActive == Context::MATERIAL)
{
Float4 materialAmbient = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialAmbient)); // FIXME: Unpack
- r.ox[D0] = r.ox[D0] * materialAmbient.x;
- r.oy[D0] = r.oy[D0] * materialAmbient.y;
- r.oz[D0] = r.oz[D0] * materialAmbient.z;
+ r.o[D0].x = r.o[D0].x * materialAmbient.x;
+ r.o[D0].y = r.o[D0].y * materialAmbient.y;
+ r.o[D0].z = r.o[D0].z * materialAmbient.z;
}
else if(state.vertexAmbientMaterialSourceActive == Context::COLOR1)
{
- Color4f materialDiffuse = r.v[Color0];
+ Vector4f materialDiffuse = r.v[Color0];
- r.ox[D0] = r.ox[D0] * materialDiffuse.x;
- r.oy[D0] = r.oy[D0] * materialDiffuse.y;
- r.oz[D0] = r.oz[D0] * materialDiffuse.z;
+ r.o[D0].x = r.o[D0].x * materialDiffuse.x;
+ r.o[D0].y = r.o[D0].y * materialDiffuse.y;
+ r.o[D0].z = r.o[D0].z * materialDiffuse.z;
}
else if(state.vertexAmbientMaterialSourceActive == Context::COLOR2)
{
- Color4f materialSpecular = r.v[Color1];
+ Vector4f materialSpecular = r.v[Color1];
- r.ox[D0] = r.ox[D0] * materialSpecular.x;
- r.oy[D0] = r.oy[D0] * materialSpecular.y;
- r.oz[D0] = r.oz[D0] * materialSpecular.z;
+ r.o[D0].x = r.o[D0].x * materialSpecular.x;
+ r.o[D0].y = r.o[D0].y * materialSpecular.y;
+ r.o[D0].z = r.o[D0].z * materialSpecular.z;
}
else ASSERT(false);
- r.ox[D0] = r.ox[D0] + diffuseSum.x;
- r.oy[D0] = r.oy[D0] + diffuseSum.y;
- r.oz[D0] = r.oz[D0] + diffuseSum.z;
+ r.o[D0].x = r.o[D0].x + diffuseSum.x;
+ r.o[D0].y = r.o[D0].y + diffuseSum.y;
+ r.o[D0].z = r.o[D0].z + diffuseSum.z;
// Emissive
if(state.vertexEmissiveMaterialSourceActive == Context::MATERIAL)
{
Float4 materialEmission = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialEmission)); // FIXME: Unpack
- r.ox[D0] = r.ox[D0] + materialEmission.x;
- r.oy[D0] = r.oy[D0] + materialEmission.y;
- r.oz[D0] = r.oz[D0] + materialEmission.z;
+ r.o[D0].x = r.o[D0].x + materialEmission.x;
+ r.o[D0].y = r.o[D0].y + materialEmission.y;
+ r.o[D0].z = r.o[D0].z + materialEmission.z;
}
else if(state.vertexEmissiveMaterialSourceActive == Context::COLOR1)
{
- Color4f materialSpecular = r.v[Color0];
+ Vector4f materialSpecular = r.v[Color0];
- r.ox[D0] = r.ox[D0] + materialSpecular.x;
- r.oy[D0] = r.oy[D0] + materialSpecular.y;
- r.oz[D0] = r.oz[D0] + materialSpecular.z;
+ r.o[D0].x = r.o[D0].x + materialSpecular.x;
+ r.o[D0].y = r.o[D0].y + materialSpecular.y;
+ r.o[D0].z = r.o[D0].z + materialSpecular.z;
}
else if(state.vertexEmissiveMaterialSourceActive == Context::COLOR2)
{
- Color4f materialSpecular = r.v[Color1];
+ Vector4f materialSpecular = r.v[Color1];
- r.ox[D0] = r.ox[D0] + materialSpecular.x;
- r.oy[D0] = r.oy[D0] + materialSpecular.y;
- r.oz[D0] = r.oz[D0] + materialSpecular.z;
+ r.o[D0].x = r.o[D0].x + materialSpecular.x;
+ r.o[D0].y = r.o[D0].y + materialSpecular.y;
+ r.o[D0].z = r.o[D0].z + materialSpecular.z;
}
else ASSERT(false);
// Diffuse alpha component
if(state.vertexDiffuseMaterialSourceActive == Context::MATERIAL)
{
- r.ow[D0] = Float4(*Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialDiffuse[0]))).wwww; // FIXME: Unpack
+ r.o[D0].w = Float4(*Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialDiffuse[0]))).wwww; // FIXME: Unpack
}
else if(state.vertexDiffuseMaterialSourceActive == Context::COLOR1)
{
- Color4f alpha = r.v[Color0];
- r.ow[D0] = alpha.w;
+ Vector4f alpha = r.v[Color0];
+ r.o[D0].w = alpha.w;
}
else if(state.vertexDiffuseMaterialSourceActive == Context::COLOR2)
{
- Color4f alpha = r.v[Color1];
- r.ow[D0] = alpha.w;
+ Vector4f alpha = r.v[Color1];
+ r.o[D0].w = alpha.w;
}
else ASSERT(false);
@@ -469,17 +470,17 @@
// Specular alpha component
if(state.vertexSpecularMaterialSourceActive == Context::MATERIAL)
{
- r.ow[D1] = Float4(*Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialSpecular[3]))).wwww; // FIXME: Unpack
+ r.o[D1].w = Float4(*Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialSpecular[3]))).wwww; // FIXME: Unpack
}
else if(state.vertexSpecularMaterialSourceActive == Context::COLOR1)
{
- Color4f alpha = r.v[Color0];
- r.ow[D1] = alpha.w;
+ Vector4f alpha = r.v[Color0];
+ r.o[D1].w = alpha.w;
}
else if(state.vertexSpecularMaterialSourceActive == Context::COLOR2)
{
- Color4f alpha = r.v[Color1];
- r.ow[D1] = alpha.w;
+ Vector4f alpha = r.v[Color1];
+ r.o[D1].w = alpha.w;
}
else ASSERT(false);
}
@@ -492,11 +493,11 @@
case Context::FOG_NONE:
if(state.specularActive)
{
- r.ox[Fog] = r.ow[D1];
+ r.o[Fog].x = r.o[D1].w;
}
else
{
- r.ox[Fog] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
+ r.o[Fog].x = Float4(0.0f);
}
break;
case Context::FOG_LINEAR:
@@ -504,21 +505,21 @@
case Context::FOG_EXP2:
if(!state.rangeFogActive)
{
- r.ox[Fog] = r.oz[Pos];
+ r.o[Fog].x = r.o[Pos].z;
}
else
{
- Color4f pos;
+ Vector4f pos;
- pos.x = r.ox[Pos];
- pos.y = r.oy[Pos];
- pos.z = r.oz[Pos];
- pos.w = r.ow[Pos];
+ pos.x = r.o[Pos].x;
+ pos.y = r.o[Pos].y;
+ pos.z = r.o[Pos].z;
+ pos.w = r.o[Pos].w;
- r.ox[Fog] = Sqrt(dot3(pos, pos)); // FIXME: oFog = length(o[Pos]);
+ r.o[Fog].x = Sqrt(dot3(pos, pos)); // FIXME: oFog = length(o[Pos]);
}
- r.ox[Fog] = r.ox[Fog] * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.scale)) + *Pointer<Float4>(r.data + OFFSET(DrawData,fog.offset));
+ r.o[Fog].x = r.o[Fog].x * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.scale)) + *Pointer<Float4>(r.data + OFFSET(DrawData,fog.offset));
break;
default:
ASSERT(false);
@@ -533,7 +534,7 @@
processPointSize(r);
}
- void VertexPipeline::processTextureCoordinate(Registers &r, int stage, Color4f &normal, Color4f &position)
+ void VertexPipeline::processTextureCoordinate(Registers &r, int stage, Vector4f &normal, Vector4f &position)
{
if(state.output[T0 + stage].write)
{
@@ -543,28 +544,28 @@
{
case Context::TEXGEN_PASSTHRU:
{
- Color4f v = r.v[TexCoord0 + i];
+ Vector4f v = r.v[TexCoord0 + i];
- r.ox[T0 + stage] = v.x;
- r.oy[T0 + stage] = v.y;
- r.oz[T0 + stage] = v.z;
- r.ow[T0 + stage] = v.w;
+ r.o[T0 + stage].x = v.x;
+ r.o[T0 + stage].y = v.y;
+ r.o[T0 + stage].z = v.z;
+ r.o[T0 + stage].w = v.w;
- if(state.input[TexCoord0 + i].type == STREAMTYPE_FLOAT)
+ if(state.input[TexCoord0 + i])
{
switch(state.input[TexCoord0 + i].count)
{
case 1:
- r.oy[T0 + stage] = Float4(1.0f, 1.0f, 1.0f, 1.0f);
- r.oz[T0 + stage] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- r.ow[T0 + stage] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
+ r.o[T0 + stage].y = Float4(1.0f);
+ r.o[T0 + stage].z = Float4(0.0f);
+ r.o[T0 + stage].w = Float4(0.0f);
break;
case 2:
- r.oz[T0 + stage] = Float4(1.0f, 1.0f, 1.0f, 1.0f);
- r.ow[T0 + stage] = Float4(0.0f, 0.0f, 0.0f, 0.0f);
+ r.o[T0 + stage].z = Float4(1.0f);
+ r.o[T0 + stage].w = Float4(0.0f);
break;
case 3:
- r.ow[T0 + stage] = Float4(1.0f, 1.0f, 1.0f, 1.0f);
+ r.o[T0 + stage].w = Float4(1.0f);
break;
case 4:
break;
@@ -572,12 +573,11 @@
ASSERT(false);
}
}
- else ASSERT(!state.input[TexCoord0 + i]); // Point sprite; coordinates provided by setup
}
break;
case Context::TEXGEN_NORMAL:
{
- Color4f Nc; // Normal vector in camera space
+ Vector4f Nc; // Normal vector in camera space
if(state.vertexNormalActive)
{
@@ -585,51 +585,51 @@
}
else
{
- Nc.x = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- Nc.y = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- Nc.z = Float4(0.0f, 0.0f, 0.0f, 0.0f);
+ Nc.x = Float4(0.0f);
+ Nc.y = Float4(0.0f);
+ Nc.z = Float4(0.0f);
}
- Nc.w = Float4(1.0f, 1.0f, 1.0f, 1.0f);
+ Nc.w = Float4(1.0f);
- r.ox[T0 + stage] = Nc.x;
- r.oy[T0 + stage] = Nc.y;
- r.oz[T0 + stage] = Nc.z;
- r.ow[T0 + stage] = Nc.w;
+ r.o[T0 + stage].x = Nc.x;
+ r.o[T0 + stage].y = Nc.y;
+ r.o[T0 + stage].z = Nc.z;
+ r.o[T0 + stage].w = Nc.w;
}
break;
case Context::TEXGEN_POSITION:
{
- Color4f Pn = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true); // Position in camera space
+ Vector4f Pn = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true); // Position in camera space
- Pn.w = Float4(1.0f, 1.0f, 1.0f, 1.0f);
+ Pn.w = Float4(1.0f);
- r.ox[T0 + stage] = Pn.x;
- r.oy[T0 + stage] = Pn.y;
- r.oz[T0 + stage] = Pn.z;
- r.ow[T0 + stage] = Pn.w;
+ r.o[T0 + stage].x = Pn.x;
+ r.o[T0 + stage].y = Pn.y;
+ r.o[T0 + stage].z = Pn.z;
+ r.o[T0 + stage].w = Pn.w;
}
break;
case Context::TEXGEN_REFLECTION:
{
- Color4f R; // Reflection vector
+ Vector4f R; // Reflection vector
if(state.vertexNormalActive)
{
- Color4f Nc; // Normal vector in camera space
+ Vector4f Nc; // Normal vector in camera space
Nc = normal;
if(state.localViewerActive)
{
- Color4f Ec; // Eye vector in camera space
- Color4f N2;
+ 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 = normalize(Ec);
// R = E - 2 * N * (E . N)
- Float4 dot = Float4(2.0f, 2.0f, 2.0f, 2.0f) * dot3(Ec, Nc);
+ Float4 dot = Float4(2.0f) * dot3(Ec, Nc);
R.x = Ec.x - Nc.x * dot;
R.y = Ec.y - Nc.y * dot;
@@ -641,46 +641,46 @@
// v = -2 * Nz * Ny
// w = 1 - 2 * Nz * Nz
- R.x = -Float4(2.0f, 2.0f, 2.0f, 2.0f) * Nc.z * Nc.x;
- R.y = -Float4(2.0f, 2.0f, 2.0f, 2.0f) * Nc.z * Nc.y;
- R.z = Float4(1.0f, 1.0f, 1.0f, 1.0f) - Float4(2.0f, 2.0f, 2.0f, 2.0f) * Nc.z * Nc.z;
+ R.x = -Float4(2.0f) * Nc.z * Nc.x;
+ R.y = -Float4(2.0f) * Nc.z * Nc.y;
+ R.z = Float4(1.0f) - Float4(2.0f) * Nc.z * Nc.z;
}
}
else
{
- R.x = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- R.y = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- R.z = Float4(0.0f, 0.0f, 0.0f, 0.0f);
+ R.x = Float4(0.0f);
+ R.y = Float4(0.0f);
+ R.z = Float4(0.0f);
}
- R.w = Float4(1.0f, 1.0f, 1.0f, 1.0f);
+ R.w = Float4(1.0f);
- r.ox[T0 + stage] = R.x;
- r.oy[T0 + stage] = R.y;
- r.oz[T0 + stage] = R.z;
- r.ow[T0 + stage] = R.w;
+ r.o[T0 + stage].x = R.x;
+ r.o[T0 + stage].y = R.y;
+ r.o[T0 + stage].z = R.z;
+ r.o[T0 + stage].w = R.w;
}
break;
case Context::TEXGEN_SPHEREMAP:
{
- Color4f R; // Reflection vector
+ Vector4f R; // Reflection vector
if(state.vertexNormalActive)
{
- Color4f Nc; // Normal vector in camera space
+ Vector4f Nc; // Normal vector in camera space
Nc = normal;
if(state.localViewerActive)
{
- Color4f Ec; // Eye vector in camera space
- Color4f N2;
+ 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 = normalize(Ec);
// R = E - 2 * N * (E . N)
- Float4 dot = Float4(2.0f, 2.0f, 2.0f, 2.0f) * dot3(Ec, Nc);
+ Float4 dot = Float4(2.0f) * dot3(Ec, Nc);
R.x = Ec.x - Nc.x * dot;
R.y = Ec.y - Nc.y * dot;
@@ -692,48 +692,48 @@
// v = -2 * Nz * Ny
// w = 1 - 2 * Nz * Nz
- R.x = -Float4(2.0f, 2.0f, 2.0f, 2.0f) * Nc.z * Nc.x;
- R.y = -Float4(2.0f, 2.0f, 2.0f, 2.0f) * Nc.z * Nc.y;
- R.z = Float4(1.0f, 1.0f, 1.0f, 1.0f) - Float4(2.0f, 2.0f, 2.0f, 2.0f) * Nc.z * Nc.z;
+ R.x = -Float4(2.0f) * Nc.z * Nc.x;
+ R.y = -Float4(2.0f) * Nc.z * Nc.y;
+ R.z = Float4(1.0f) - Float4(2.0f) * Nc.z * Nc.z;
}
}
else
{
- R.x = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- R.y = Float4(0.0f, 0.0f, 0.0f, 0.0f);
- R.z = Float4(0.0f, 0.0f, 0.0f, 0.0f);
+ R.x = Float4(0.0f);
+ R.y = Float4(0.0f);
+ R.z = Float4(0.0f);
}
- R.z -= Float4(1.0f, 1.0f, 1.0f, 1.0f);
+ R.z -= Float4(1.0f);
R = normalize(R);
- R.x = Float4(0.5f, 0.5f, 0.5f, 0.5f) * R.x + Float4(0.5f, 0.5f, 0.5f, 0.5f);
- R.y = Float4(0.5f, 0.5f, 0.5f, 0.5f) * R.y + Float4(0.5f, 0.5f, 0.5f, 0.5f);
+ R.x = Float4(0.5f) * R.x + Float4(0.5f);
+ R.y = Float4(0.5f) * R.y + Float4(0.5f);
- R.z = Float4(1.0f, 1.0f, 1.0f, 1.0f);
- R.w = Float4(0.0f, 0.0f, 0.0f, 0.0f);
+ R.z = Float4(1.0f);
+ R.w = Float4(0.0f);
- r.ox[T0 + stage] = R.x;
- r.oy[T0 + stage] = R.y;
- r.oz[T0 + stage] = R.z;
- r.ow[T0 + stage] = R.w;
+ r.o[T0 + stage].x = R.x;
+ r.o[T0 + stage].y = R.y;
+ r.o[T0 + stage].z = R.z;
+ r.o[T0 + stage].w = R.w;
}
break;
default:
ASSERT(false);
}
- Color4f texTrans0;
- Color4f texTrans1;
- Color4f texTrans2;
- Color4f texTrans3;
+ Vector4f texTrans0;
+ Vector4f texTrans1;
+ Vector4f texTrans2;
+ Vector4f texTrans3;
- Color4f T;
- Color4f t;
+ Vector4f T;
+ Vector4f t;
- T.x = r.ox[T0 + stage];
- T.y = r.oy[T0 + stage];
- T.z = r.oz[T0 + stage];
- T.w = r.ow[T0 + stage];
+ T.x = r.o[T0 + stage].x;
+ T.y = r.o[T0 + stage].y;
+ T.z = r.o[T0 + stage].z;
+ T.w = r.o[T0 + stage].w;
switch(state.textureState[stage].textureTransformCountActive)
{
@@ -766,10 +766,10 @@
texTrans0.w = texTrans0.w.wwww;
t.x = dot4(T, texTrans0);
- r.ox[T0 + stage] = t.x;
- r.oy[T0 + stage] = t.y;
- r.oz[T0 + stage] = t.z;
- r.ow[T0 + stage] = t.w;
+ r.o[T0 + stage].x = t.x;
+ r.o[T0 + stage].y = t.y;
+ r.o[T0 + stage].z = t.z;
+ r.o[T0 + stage].w = t.w;
case 0:
break;
default:
@@ -787,16 +787,16 @@
if(state.input[PSize])
{
- r.oy[Pts] = r.v[PSize].x;
+ r.o[Pts].y = r.v[PSize].x;
}
else
{
- r.oy[Pts] = *Pointer<Float4>(r.data + OFFSET(DrawData,point.pointSize));
+ r.o[Pts].y = *Pointer<Float4>(r.data + OFFSET(DrawData,point.pointSize));
}
if(state.pointScaleActive && !state.preTransformed)
{
- Color4f p = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
+ Vector4f p = transformBlend(r, r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
Float4 d = Sqrt(dot3(p, p)); // FIXME: length(p);
@@ -806,18 +806,13 @@
A = RcpSqrt_pp(A + d * (B + d * C));
- r.oy[Pts] = r.oy[Pts] * Float4(*Pointer<Float>(r.data + OFFSET(DrawData,viewportHeight))) * A; // FIXME: Unpack
+ r.o[Pts].y = r.o[Pts].y * Float4(*Pointer<Float>(r.data + OFFSET(DrawData,viewportHeight))) * A; // FIXME: Unpack
}
}
- Color4f VertexPipeline::transform(Color4f &src, Pointer<Byte> &matrix, bool homogeneous)
+ Vector4f VertexPipeline::transform(Register &src, Pointer<Byte> &matrix, bool homogeneous)
{
- Color4f dst;
-
- Color4f row0;
- Color4f row1;
- Color4f row2;
- Color4f row3;
+ Vector4f dst;
if(homogeneous)
{
@@ -862,14 +857,9 @@
return dst;
}
- Color4f VertexPipeline::transform(Color4f &src, Pointer<Byte> &matrix, UInt index[4], bool homogeneous)
+ Vector4f VertexPipeline::transform(Register &src, Pointer<Byte> &matrix, UInt index[4], bool homogeneous)
{
- Color4f dst;
-
- Color4f row0;
- Color4f row1;
- Color4f row2;
- Color4f row3;
+ Vector4f dst;
if(homogeneous)
{
@@ -914,9 +904,9 @@
return dst;
}
- Color4f VertexPipeline::normalize(Color4f &src)
+ Vector4f VertexPipeline::normalize(Vector4f &src)
{
- Color4f dst;
+ Vector4f dst;
Float4 rcpLength = RcpSqrt_pp(dot3(src, src));
@@ -933,11 +923,11 @@
dst = dst * dst;
dst = dst * dst;
- dst = Float4(As<Int4>(dst) - As<Int4>(Float4(1.0f, 1.0f, 1.0f, 1.0f)));
+ dst = Float4(As<Int4>(dst) - As<Int4>(Float4(1.0f)));
dst *= src1;
- dst = As<Float4>(Int4(dst) + As<Int4>(Float4(1.0f, 1.0f, 1.0f, 1.0f)));
+ dst = As<Float4>(Int4(dst) + As<Int4>(Float4(1.0f)));
dst = RcpSqrt_pp(dst);
dst = RcpSqrt_pp(dst);