Make vertex registers members of routine classes.
Bug 22652760
Change-Id: I698ce910ee4302178d7235fa316aaa2b268e71a8
Reviewed-on: https://swiftshader-review.googlesource.com/4560
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Shader/VertexPipeline.cpp b/src/Shader/VertexPipeline.cpp
index f212b18..c2fa31f 100644
--- a/src/Shader/VertexPipeline.cpp
+++ b/src/Shader/VertexPipeline.cpp
@@ -53,7 +53,7 @@
{
for(int i = 0; i < 4; i++)
{
- Float4 B = r.v[BlendIndices].x;
+ Float4 B = v[BlendIndices].x;
UInt indices;
switch(i)
@@ -88,9 +88,9 @@
switch(state.vertexBlendMatrixCount)
{
- case 4: weight2 = r.v[BlendWeight].z;
- case 3: weight1 = r.v[BlendWeight].y;
- case 2: weight0 = r.v[BlendWeight].x;
+ case 4: weight2 = v[BlendWeight].z;
+ case 3: weight1 = v[BlendWeight].y;
+ case 2: weight0 = v[BlendWeight].x;
case 1:
break;
}
@@ -162,23 +162,23 @@
if(!state.preTransformed)
{
- position = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.transformT)), true);
+ position = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.transformT)), true);
}
else
{
- position = r.v[PositionT];
+ position = v[PositionT];
}
- r.o[Pos].x = position.x;
- r.o[Pos].y = position.y;
- r.o[Pos].z = position.z;
- r.o[Pos].w = position.w;
+ o[Pos].x = position.x;
+ o[Pos].y = position.y;
+ o[Pos].z = position.z;
+ o[Pos].w = position.w;
- Vector4f vertexPosition = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
+ Vector4f vertexPosition = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.cameraTransformT)), true);
if(state.vertexNormalActive)
{
- normal = transformBlend(r.v[Normal], Pointer<Byte>(r.data + OFFSET(DrawData,ff.normalTransformT)), false);
+ normal = transformBlend(v[Normal], Pointer<Byte>(data + OFFSET(DrawData,ff.normalTransformT)), false);
if(state.normalizeNormals)
{
@@ -191,53 +191,53 @@
// FIXME: Don't process if not used at all
if(state.diffuseActive && state.input[Color0])
{
- Vector4f diffuse = r.v[Color0];
+ Vector4f diffuse = v[Color0];
- r.o[D0].x = diffuse.x;
- r.o[D0].y = diffuse.y;
- r.o[D0].z = diffuse.z;
- r.o[D0].w = diffuse.w;
+ o[D0].x = diffuse.x;
+ o[D0].y = diffuse.y;
+ o[D0].z = diffuse.z;
+ o[D0].w = diffuse.w;
}
else
{
- 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);
+ o[D0].x = Float4(1.0f);
+ o[D0].y = Float4(1.0f);
+ o[D0].z = Float4(1.0f);
+ o[D0].w = Float4(1.0f);
}
// FIXME: Don't process if not used at all
if(state.specularActive && state.input[Color1])
{
- Vector4f specular = r.v[Color1];
+ Vector4f specular = v[Color1];
- r.o[D1].x = specular.x;
- r.o[D1].y = specular.y;
- r.o[D1].z = specular.z;
- r.o[D1].w = specular.w;
+ o[D1].x = specular.x;
+ o[D1].y = specular.y;
+ o[D1].z = specular.z;
+ o[D1].w = specular.w;
}
else
{
- 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);
+ o[D1].x = Float4(0.0f);
+ o[D1].y = Float4(0.0f);
+ o[D1].z = Float4(0.0f);
+ o[D1].w = Float4(1.0f);
}
}
else
{
- 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);
+ o[D0].x = Float4(0.0f);
+ o[D0].y = Float4(0.0f);
+ o[D0].z = Float4(0.0f);
+ o[D0].w = Float4(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);
+ o[D1].x = Float4(0.0f);
+ o[D1].y = Float4(0.0f);
+ o[D1].z = Float4(0.0f);
+ o[D1].w = Float4(0.0f);
Vector4f ambient;
- Float4 globalAmbient = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.globalAmbient)); // FIXME: Unpack
+ Float4 globalAmbient = *Pointer<Float4>(data + OFFSET(DrawData,ff.globalAmbient)); // FIXME: Unpack
ambient.x = globalAmbient.x;
ambient.y = globalAmbient.y;
@@ -257,7 +257,7 @@
{
Float4 d; // Distance
- L.x = L.y = L.z = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.lightPosition[i])); // FIXME: Unpack
+ L.x = L.y = L.z = *Pointer<Float4>(data + OFFSET(DrawData,ff.lightPosition[i])); // FIXME: Unpack
L.x = L.x.xxxx;
L.y = L.y.yyyy;
L.z = L.z.zzzz;
@@ -272,16 +272,16 @@
L.z *= d;
d = Rcp_pp(d); // FIXME: Sufficient precision?
- Float4 q = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.attenuationQuadratic[i]));
- Float4 l = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.attenuationLinear[i]));
- Float4 c = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.attenuationConstant[i]));
+ Float4 q = *Pointer<Float4>(data + OFFSET(DrawData,ff.attenuationQuadratic[i]));
+ Float4 l = *Pointer<Float4>(data + OFFSET(DrawData,ff.attenuationLinear[i]));
+ Float4 c = *Pointer<Float4>(data + OFFSET(DrawData,ff.attenuationConstant[i]));
att = Rcp_pp((q * d + l) * d + c);
}
// Ambient per light
{
- Float4 lightAmbient = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.lightAmbient[i])); // FIXME: Unpack
+ Float4 lightAmbient = *Pointer<Float4>(data + OFFSET(DrawData,ff.lightAmbient[i])); // FIXME: Unpack
ambient.x = ambient.x + lightAmbient.x * att;
ambient.y = ambient.y + lightAmbient.y * att;
@@ -301,26 +301,26 @@
if(state.vertexDiffuseMaterialSourceActive == MATERIAL_MATERIAL)
{
- diff.x = diff.y = diff.z = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialDiffuse)); // FIXME: Unpack
+ diff.x = diff.y = diff.z = *Pointer<Float4>(data + OFFSET(DrawData,ff.materialDiffuse)); // FIXME: Unpack
diff.x = diff.x.xxxx;
diff.y = diff.y.yyyy;
diff.z = diff.z.zzzz;
}
else if(state.vertexDiffuseMaterialSourceActive == MATERIAL_COLOR1)
{
- diff = r.v[Color0];
+ diff = v[Color0];
}
else if(state.vertexDiffuseMaterialSourceActive == MATERIAL_COLOR2)
{
- diff = r.v[Color1];
+ diff = v[Color1];
}
else ASSERT(false);
- Float4 lightDiffuse = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.lightDiffuse[i]));
+ Float4 lightDiffuse = *Pointer<Float4>(data + OFFSET(DrawData,ff.lightDiffuse[i]));
- r.o[D0].x = r.o[D0].x + diff.x * dot * lightDiffuse.x; // FIXME: Clamp first?
- r.o[D0].y = r.o[D0].y + diff.y * dot * lightDiffuse.y; // FIXME: Clamp first?
- r.o[D0].z = r.o[D0].z + diff.z * dot * lightDiffuse.z; // FIXME: Clamp first?
+ o[D0].x = o[D0].x + diff.x * dot * lightDiffuse.x; // FIXME: Clamp first?
+ o[D0].y = o[D0].y + diff.y * dot * lightDiffuse.y; // FIXME: Clamp first?
+ o[D0].z = o[D0].z + diff.z * dot * lightDiffuse.z; // FIXME: Clamp first?
}
// Specular
@@ -330,7 +330,7 @@
Vector4f C; // Camera vector
Float4 pow;
- pow = *Pointer<Float>(r.data + OFFSET(DrawData,ff.materialShininess));
+ pow = *Pointer<Float>(data + OFFSET(DrawData,ff.materialShininess));
S.x = Float4(0.0f) - vertexPosition.x;
S.y = Float4(0.0f) - vertexPosition.y;
@@ -351,7 +351,7 @@
if(state.vertexSpecularMaterialSourceActive == MATERIAL_MATERIAL)
{
- Float4 materialSpecular = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialSpecular)); // FIXME: Unpack
+ Float4 materialSpecular = *Pointer<Float4>(data + OFFSET(DrawData,ff.materialSpecular)); // FIXME: Unpack
spec.x = materialSpecular.x;
spec.y = materialSpecular.y;
@@ -359,15 +359,15 @@
}
else if(state.vertexSpecularMaterialSourceActive == MATERIAL_COLOR1)
{
- spec = r.v[Color0];
+ spec = v[Color0];
}
else if(state.vertexSpecularMaterialSourceActive == MATERIAL_COLOR2)
{
- spec = r.v[Color1];
+ spec = v[Color1];
}
else ASSERT(false);
- Float4 lightSpecular = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.lightSpecular[i]));
+ Float4 lightSpecular = *Pointer<Float4>(data + OFFSET(DrawData,ff.lightSpecular[i]));
spec.x *= lightSpecular.x;
spec.y *= lightSpecular.y;
@@ -383,22 +383,22 @@
if(secondaryColor)
{
- 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;
+ o[D1].x = o[D1].x + spec.x;
+ o[D1].y = o[D1].y + spec.y;
+ o[D1].z = o[D1].z + spec.z;
}
else
{
- r.o[D0].x = r.o[D0].x + spec.x;
- r.o[D0].y = r.o[D0].y + spec.y;
- r.o[D0].z = r.o[D0].z + spec.z;
+ o[D0].x = o[D0].x + spec.x;
+ o[D0].y = o[D0].y + spec.y;
+ o[D0].z = o[D0].z + spec.z;
}
}
}
if(state.vertexAmbientMaterialSourceActive == MATERIAL_MATERIAL)
{
- Float4 materialAmbient = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialAmbient)); // FIXME: Unpack
+ Float4 materialAmbient = *Pointer<Float4>(data + OFFSET(DrawData,ff.materialAmbient)); // FIXME: Unpack
ambient.x = ambient.x * materialAmbient.x;
ambient.y = ambient.y * materialAmbient.y;
@@ -406,7 +406,7 @@
}
else if(state.vertexAmbientMaterialSourceActive == MATERIAL_COLOR1)
{
- Vector4f materialDiffuse = r.v[Color0];
+ Vector4f materialDiffuse = v[Color0];
ambient.x = ambient.x * materialDiffuse.x;
ambient.y = ambient.y * materialDiffuse.y;
@@ -414,7 +414,7 @@
}
else if(state.vertexAmbientMaterialSourceActive == MATERIAL_COLOR2)
{
- Vector4f materialSpecular = r.v[Color1];
+ Vector4f materialSpecular = v[Color1];
ambient.x = ambient.x * materialSpecular.x;
ambient.y = ambient.y * materialSpecular.y;
@@ -422,51 +422,51 @@
}
else ASSERT(false);
- r.o[D0].x = r.o[D0].x + ambient.x;
- r.o[D0].y = r.o[D0].y + ambient.y;
- r.o[D0].z = r.o[D0].z + ambient.z;
+ o[D0].x = o[D0].x + ambient.x;
+ o[D0].y = o[D0].y + ambient.y;
+ o[D0].z = o[D0].z + ambient.z;
// Emissive
if(state.vertexEmissiveMaterialSourceActive == MATERIAL_MATERIAL)
{
- Float4 materialEmission = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialEmission)); // FIXME: Unpack
+ Float4 materialEmission = *Pointer<Float4>(data + OFFSET(DrawData,ff.materialEmission)); // FIXME: Unpack
- 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;
+ o[D0].x = o[D0].x + materialEmission.x;
+ o[D0].y = o[D0].y + materialEmission.y;
+ o[D0].z = o[D0].z + materialEmission.z;
}
else if(state.vertexEmissiveMaterialSourceActive == MATERIAL_COLOR1)
{
- Vector4f materialSpecular = r.v[Color0];
+ Vector4f materialSpecular = v[Color0];
- 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;
+ o[D0].x = o[D0].x + materialSpecular.x;
+ o[D0].y = o[D0].y + materialSpecular.y;
+ o[D0].z = o[D0].z + materialSpecular.z;
}
else if(state.vertexEmissiveMaterialSourceActive == MATERIAL_COLOR2)
{
- Vector4f materialSpecular = r.v[Color1];
+ Vector4f materialSpecular = v[Color1];
- 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;
+ o[D0].x = o[D0].x + materialSpecular.x;
+ o[D0].y = o[D0].y + materialSpecular.y;
+ o[D0].z = o[D0].z + materialSpecular.z;
}
else ASSERT(false);
// Diffuse alpha component
if(state.vertexDiffuseMaterialSourceActive == MATERIAL_MATERIAL)
{
- r.o[D0].w = Float4(*Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialDiffuse[0]))).wwww; // FIXME: Unpack
+ o[D0].w = Float4(*Pointer<Float4>(data + OFFSET(DrawData,ff.materialDiffuse[0]))).wwww; // FIXME: Unpack
}
else if(state.vertexDiffuseMaterialSourceActive == MATERIAL_COLOR1)
{
- Vector4f alpha = r.v[Color0];
- r.o[D0].w = alpha.w;
+ Vector4f alpha = v[Color0];
+ o[D0].w = alpha.w;
}
else if(state.vertexDiffuseMaterialSourceActive == MATERIAL_COLOR2)
{
- Vector4f alpha = r.v[Color1];
- r.o[D0].w = alpha.w;
+ Vector4f alpha = v[Color1];
+ o[D0].w = alpha.w;
}
else ASSERT(false);
@@ -475,17 +475,17 @@
// Specular alpha component
if(state.vertexSpecularMaterialSourceActive == MATERIAL_MATERIAL)
{
- r.o[D1].w = Float4(*Pointer<Float4>(r.data + OFFSET(DrawData,ff.materialSpecular[3]))).wwww; // FIXME: Unpack
+ o[D1].w = Float4(*Pointer<Float4>(data + OFFSET(DrawData,ff.materialSpecular[3]))).wwww; // FIXME: Unpack
}
else if(state.vertexSpecularMaterialSourceActive == MATERIAL_COLOR1)
{
- Vector4f alpha = r.v[Color0];
- r.o[D1].w = alpha.w;
+ Vector4f alpha = v[Color0];
+ o[D1].w = alpha.w;
}
else if(state.vertexSpecularMaterialSourceActive == MATERIAL_COLOR2)
{
- Vector4f alpha = r.v[Color1];
- r.o[D1].w = alpha.w;
+ Vector4f alpha = v[Color1];
+ o[D1].w = alpha.w;
}
else ASSERT(false);
}
@@ -509,21 +509,21 @@
case FOG_NONE:
if(state.specularActive)
{
- r.o[Fog].x = r.o[D1].w;
+ o[Fog].x = o[D1].w;
}
else
{
- r.o[Fog].x = Float4(0.0f);
+ o[Fog].x = Float4(0.0f);
}
break;
case FOG_LINEAR:
- r.o[Fog].x = f * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.scale)) + *Pointer<Float4>(r.data + OFFSET(DrawData,fog.offset));
+ o[Fog].x = f * *Pointer<Float4>(data + OFFSET(DrawData,fog.scale)) + *Pointer<Float4>(data + OFFSET(DrawData,fog.offset));
break;
case FOG_EXP:
- r.o[Fog].x = exponential2(f * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.densityE)), true);
+ o[Fog].x = exponential2(f * *Pointer<Float4>(data + OFFSET(DrawData,fog.densityE)), true);
break;
case FOG_EXP2:
- r.o[Fog].x = exponential2((f * f) * *Pointer<Float4>(r.data + OFFSET(DrawData,fog.density2E)), true);
+ o[Fog].x = exponential2((f * f) * *Pointer<Float4>(data + OFFSET(DrawData,fog.density2E)), true);
break;
default:
ASSERT(false);
@@ -548,38 +548,38 @@
{
case TEXGEN_NONE:
{
- Vector4f v = r.v[TexCoord0 + i];
+ Vector4f &&varying = v[TexCoord0 + i];
- 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;
+ o[T0 + stage].x = varying.x;
+ o[T0 + stage].y = varying.y;
+ o[T0 + stage].z = varying.z;
+ o[T0 + stage].w = varying.w;
}
break;
case TEXGEN_PASSTHRU:
{
- Vector4f v = r.v[TexCoord0 + i];
+ Vector4f &&varying = v[TexCoord0 + i];
- 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;
+ o[T0 + stage].x = varying.x;
+ o[T0 + stage].y = varying.y;
+ o[T0 + stage].z = varying.z;
+ o[T0 + stage].w = varying.w;
if(state.input[TexCoord0 + i])
{
switch(state.input[TexCoord0 + i].count)
{
case 1:
- r.o[T0 + stage].y = Float4(1.0f);
- r.o[T0 + stage].z = Float4(0.0f);
- r.o[T0 + stage].w = Float4(0.0f);
+ o[T0 + stage].y = Float4(1.0f);
+ o[T0 + stage].z = Float4(0.0f);
+ o[T0 + stage].w = Float4(0.0f);
break;
case 2:
- r.o[T0 + stage].z = Float4(1.0f);
- r.o[T0 + stage].w = Float4(0.0f);
+ o[T0 + stage].z = Float4(1.0f);
+ o[T0 + stage].w = Float4(0.0f);
break;
case 3:
- r.o[T0 + stage].w = Float4(1.0f);
+ o[T0 + stage].w = Float4(1.0f);
break;
case 4:
break;
@@ -606,22 +606,22 @@
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;
- r.o[T0 + stage].w = Nc.w;
+ o[T0 + stage].x = Nc.x;
+ o[T0 + stage].y = Nc.y;
+ o[T0 + stage].z = Nc.z;
+ o[T0 + stage].w = Nc.w;
}
break;
case TEXGEN_POSITION:
{
- Vector4f Pn = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true); // Position in camera space
+ Vector4f Pn = transformBlend(v[Position], Pointer<Byte>(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;
- r.o[T0 + stage].w = Pn.w;
+ o[T0 + stage].x = Pn.x;
+ o[T0 + stage].y = Pn.y;
+ o[T0 + stage].z = Pn.z;
+ o[T0 + stage].w = Pn.w;
}
break;
case TEXGEN_REFLECTION:
@@ -639,7 +639,7 @@
Vector4f Ec; // Eye vector in camera space
Vector4f N2;
- Ec = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
+ Ec = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.cameraTransformT)), true);
Ec = normalize(Ec);
// R = E - 2 * N * (E . N)
@@ -669,10 +669,10 @@
R.w = Float4(1.0f);
- 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;
+ o[T0 + stage].x = R.x;
+ o[T0 + stage].y = R.y;
+ o[T0 + stage].z = R.z;
+ o[T0 + stage].w = R.w;
}
break;
case TEXGEN_SPHEREMAP:
@@ -690,7 +690,7 @@
Vector4f Ec; // Eye vector in camera space
Vector4f N2;
- Ec = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
+ Ec = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.cameraTransformT)), true);
Ec = normalize(Ec);
// R = E - 2 * N * (E . N)
@@ -726,10 +726,10 @@
R.z = Float4(1.0f);
R.w = Float4(0.0f);
- 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;
+ o[T0 + stage].x = R.x;
+ o[T0 + stage].y = R.y;
+ o[T0 + stage].z = R.z;
+ o[T0 + stage].w = R.w;
}
break;
default:
@@ -744,46 +744,46 @@
Vector4f T;
Vector4f t;
- 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;
+ T.x = o[T0 + stage].x;
+ T.y = o[T0 + stage].y;
+ T.z = o[T0 + stage].z;
+ T.w = o[T0 + stage].w;
switch(state.textureState[stage].textureTransformCountActive)
{
case 4:
- texTrans3.x = texTrans3.y = texTrans3.z = texTrans3.w = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.textureTransform[stage][3])); // FIXME: Unpack
+ texTrans3.x = texTrans3.y = texTrans3.z = texTrans3.w = *Pointer<Float4>(data + OFFSET(DrawData,ff.textureTransform[stage][3])); // FIXME: Unpack
texTrans3.x = texTrans3.x.xxxx;
texTrans3.y = texTrans3.y.yyyy;
texTrans3.z = texTrans3.z.zzzz;
texTrans3.w = texTrans3.w.wwww;
t.w = dot4(T, texTrans3);
case 3:
- texTrans2.x = texTrans2.y = texTrans2.z = texTrans2.w = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.textureTransform[stage][2])); // FIXME: Unpack
+ texTrans2.x = texTrans2.y = texTrans2.z = texTrans2.w = *Pointer<Float4>(data + OFFSET(DrawData,ff.textureTransform[stage][2])); // FIXME: Unpack
texTrans2.x = texTrans2.x.xxxx;
texTrans2.y = texTrans2.y.yyyy;
texTrans2.z = texTrans2.z.zzzz;
texTrans2.w = texTrans2.w.wwww;
t.z = dot4(T, texTrans2);
case 2:
- texTrans1.x = texTrans1.y = texTrans1.z = texTrans1.w = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.textureTransform[stage][1])); // FIXME: Unpack
+ texTrans1.x = texTrans1.y = texTrans1.z = texTrans1.w = *Pointer<Float4>(data + OFFSET(DrawData,ff.textureTransform[stage][1])); // FIXME: Unpack
texTrans1.x = texTrans1.x.xxxx;
texTrans1.y = texTrans1.y.yyyy;
texTrans1.z = texTrans1.z.zzzz;
texTrans1.w = texTrans1.w.wwww;
t.y = dot4(T, texTrans1);
case 1:
- texTrans0.x = texTrans0.y = texTrans0.z = texTrans0.w = *Pointer<Float4>(r.data + OFFSET(DrawData,ff.textureTransform[stage][0])); // FIXME: Unpack
+ texTrans0.x = texTrans0.y = texTrans0.z = texTrans0.w = *Pointer<Float4>(data + OFFSET(DrawData,ff.textureTransform[stage][0])); // FIXME: Unpack
texTrans0.x = texTrans0.x.xxxx;
texTrans0.y = texTrans0.y.yyyy;
texTrans0.z = texTrans0.z.zzzz;
texTrans0.w = texTrans0.w.wwww;
t.x = dot4(T, texTrans0);
- 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;
+ o[T0 + stage].x = t.x;
+ o[T0 + stage].y = t.y;
+ o[T0 + stage].z = t.z;
+ o[T0 + stage].w = t.w;
case 0:
break;
default:
@@ -801,26 +801,26 @@
if(state.input[PointSize])
{
- r.o[Pts].y = r.v[PointSize].x;
+ o[Pts].y = v[PointSize].x;
}
else
{
- r.o[Pts].y = *Pointer<Float4>(r.data + OFFSET(DrawData,point.pointSize));
+ o[Pts].y = *Pointer<Float4>(data + OFFSET(DrawData,point.pointSize));
}
if(state.pointScaleActive && !state.preTransformed)
{
- Vector4f p = transformBlend(r.v[Position], Pointer<Byte>(r.data + OFFSET(DrawData,ff.cameraTransformT)), true);
+ Vector4f p = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.cameraTransformT)), true);
Float4 d = Sqrt(dot3(p, p)); // FIXME: length(p);
- Float4 A = *Pointer<Float>(r.data + OFFSET(DrawData,point.pointScaleA)); // FIXME: Unpack
- Float4 B = *Pointer<Float>(r.data + OFFSET(DrawData,point.pointScaleB)); // FIXME: Unpack
- Float4 C = *Pointer<Float>(r.data + OFFSET(DrawData,point.pointScaleC)); // FIXME: Unpack
+ Float4 A = *Pointer<Float>(data + OFFSET(DrawData,point.pointScaleA)); // FIXME: Unpack
+ Float4 B = *Pointer<Float>(data + OFFSET(DrawData,point.pointScaleB)); // FIXME: Unpack
+ Float4 C = *Pointer<Float>(data + OFFSET(DrawData,point.pointScaleC)); // FIXME: Unpack
A = RcpSqrt_pp(A + d * (B + d * C));
- r.o[Pts].y = r.o[Pts].y * Float4(*Pointer<Float>(r.data + OFFSET(DrawData,viewportHeight))) * A; // FIXME: Unpack
+ o[Pts].y = o[Pts].y * Float4(*Pointer<Float>(data + OFFSET(DrawData,viewportHeight))) * A; // FIXME: Unpack
}
}
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index a6126db..1999efe 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -20,7 +20,8 @@
namespace sw
{
- VertexProgram::VertexProgram(const VertexProcessor::State &state, const VertexShader *shader) : VertexRoutine(state, shader)
+ VertexProgram::VertexProgram(const VertexProcessor::State &state, const VertexShader *shader)
+ : VertexRoutine(state, shader), shader(shader), r(shader->dynamicallyIndexedTemporaries)
{
ifDepth = 0;
loopRepDepth = 0;
@@ -32,6 +33,24 @@
{
labelBlock[i] = 0;
}
+
+ loopDepth = -1;
+ enableStack[0] = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+
+ if(shader && shader->containsBreakInstruction())
+ {
+ enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ }
+
+ if(shader && shader->containsContinueInstruction())
+ {
+ enableContinue = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ }
+
+ if(shader->instanceIdDeclared)
+ {
+ instanceID = *Pointer<Int>(data + OFFSET(DrawData,instanceID));
+ }
}
VertexProgram::~VertexProgram()
@@ -46,7 +65,7 @@
{
for(int i = 0; i < VERTEX_TEXTURE_IMAGE_UNITS; i++)
{
- sampler[i] = new SamplerCore(r.constants, state.samplerState[i]);
+ sampler[i] = new SamplerCore(constants, state.samplerState[i]);
}
if(!state.preTransformed)
@@ -65,12 +84,12 @@
unsigned short version = shader->getVersion();
- r.enableIndex = 0;
- r.stackIndex = 0;
+ enableIndex = 0;
+ stackIndex = 0;
if(shader->containsLeaveInstruction())
{
- r.enableLeave = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ enableLeave = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
}
// Create all call site return blocks up front
@@ -342,79 +361,79 @@
case Shader::PARAMETER_TEMP:
if(dst.rel.type == Shader::PARAMETER_VOID)
{
- if(dst.x) pDst.x = r.r[dst.index].x;
- if(dst.y) pDst.y = r.r[dst.index].y;
- if(dst.z) pDst.z = r.r[dst.index].z;
- if(dst.w) pDst.w = r.r[dst.index].w;
+ if(dst.x) pDst.x = r[dst.index].x;
+ if(dst.y) pDst.y = r[dst.index].y;
+ if(dst.z) pDst.z = r[dst.index].z;
+ if(dst.w) pDst.w = r[dst.index].w;
}
else
{
Int a = relativeAddress(dst);
- if(dst.x) pDst.x = r.r[dst.index + a].x;
- if(dst.y) pDst.y = r.r[dst.index + a].y;
- if(dst.z) pDst.z = r.r[dst.index + a].z;
- if(dst.w) pDst.w = r.r[dst.index + a].w;
+ if(dst.x) pDst.x = r[dst.index + a].x;
+ if(dst.y) pDst.y = r[dst.index + a].y;
+ if(dst.z) pDst.z = r[dst.index + a].z;
+ if(dst.w) pDst.w = r[dst.index + a].w;
}
break;
- case Shader::PARAMETER_ADDR: pDst = r.a0; break;
+ case Shader::PARAMETER_ADDR: pDst = a0; break;
case Shader::PARAMETER_RASTOUT:
switch(dst.index)
{
case 0:
- if(dst.x) pDst.x = r.o[Pos].x;
- if(dst.y) pDst.y = r.o[Pos].y;
- if(dst.z) pDst.z = r.o[Pos].z;
- if(dst.w) pDst.w = r.o[Pos].w;
+ if(dst.x) pDst.x = o[Pos].x;
+ if(dst.y) pDst.y = o[Pos].y;
+ if(dst.z) pDst.z = o[Pos].z;
+ if(dst.w) pDst.w = o[Pos].w;
break;
case 1:
- pDst.x = r.o[Fog].x;
+ pDst.x = o[Fog].x;
break;
case 2:
- pDst.x = r.o[Pts].y;
+ pDst.x = o[Pts].y;
break;
default:
ASSERT(false);
}
break;
case Shader::PARAMETER_ATTROUT:
- if(dst.x) pDst.x = r.o[D0 + dst.index].x;
- if(dst.y) pDst.y = r.o[D0 + dst.index].y;
- if(dst.z) pDst.z = r.o[D0 + dst.index].z;
- if(dst.w) pDst.w = r.o[D0 + dst.index].w;
+ if(dst.x) pDst.x = o[D0 + dst.index].x;
+ if(dst.y) pDst.y = o[D0 + dst.index].y;
+ if(dst.z) pDst.z = o[D0 + dst.index].z;
+ if(dst.w) pDst.w = o[D0 + dst.index].w;
break;
case Shader::PARAMETER_TEXCRDOUT:
// case Shader::PARAMETER_OUTPUT:
if(version < 0x0300)
{
- if(dst.x) pDst.x = r.o[T0 + dst.index].x;
- if(dst.y) pDst.y = r.o[T0 + dst.index].y;
- if(dst.z) pDst.z = r.o[T0 + dst.index].z;
- if(dst.w) pDst.w = r.o[T0 + dst.index].w;
+ if(dst.x) pDst.x = o[T0 + dst.index].x;
+ if(dst.y) pDst.y = o[T0 + dst.index].y;
+ if(dst.z) pDst.z = o[T0 + dst.index].z;
+ if(dst.w) pDst.w = o[T0 + dst.index].w;
}
else
{
if(dst.rel.type == Shader::PARAMETER_VOID) // Not relative
{
- if(dst.x) pDst.x = r.o[dst.index].x;
- if(dst.y) pDst.y = r.o[dst.index].y;
- if(dst.z) pDst.z = r.o[dst.index].z;
- if(dst.w) pDst.w = r.o[dst.index].w;
+ if(dst.x) pDst.x = o[dst.index].x;
+ if(dst.y) pDst.y = o[dst.index].y;
+ if(dst.z) pDst.z = o[dst.index].z;
+ if(dst.w) pDst.w = o[dst.index].w;
}
else
{
Int a = relativeAddress(dst);
- if(dst.x) pDst.x = r.o[dst.index + a].x;
- if(dst.y) pDst.y = r.o[dst.index + a].y;
- if(dst.z) pDst.z = r.o[dst.index + a].z;
- if(dst.w) pDst.w = r.o[dst.index + a].w;
+ if(dst.x) pDst.x = o[dst.index + a].x;
+ if(dst.y) pDst.y = o[dst.index + a].y;
+ if(dst.z) pDst.z = o[dst.index + a].z;
+ if(dst.w) pDst.w = o[dst.index + a].w;
}
}
break;
- case Shader::PARAMETER_LABEL: break;
- case Shader::PARAMETER_PREDICATE: pDst = r.p0; break;
- case Shader::PARAMETER_INPUT: break;
+ case Shader::PARAMETER_LABEL: break;
+ case Shader::PARAMETER_PREDICATE: pDst = p0; break;
+ case Shader::PARAMETER_INPUT: break;
default:
ASSERT(false);
}
@@ -430,10 +449,10 @@
{
unsigned char pSwizzle = instruction->predicateSwizzle;
- Float4 xPredicate = r.p0[(pSwizzle >> 0) & 0x03];
- Float4 yPredicate = r.p0[(pSwizzle >> 2) & 0x03];
- Float4 zPredicate = r.p0[(pSwizzle >> 4) & 0x03];
- Float4 wPredicate = r.p0[(pSwizzle >> 6) & 0x03];
+ Float4 xPredicate = p0[(pSwizzle >> 0) & 0x03];
+ Float4 yPredicate = p0[(pSwizzle >> 2) & 0x03];
+ Float4 zPredicate = p0[(pSwizzle >> 4) & 0x03];
+ Float4 wPredicate = p0[(pSwizzle >> 6) & 0x03];
if(!instruction->predicateNot)
{
@@ -469,83 +488,83 @@
case Shader::PARAMETER_TEMP:
if(dst.rel.type == Shader::PARAMETER_VOID)
{
- if(dst.x) r.r[dst.index].x = d.x;
- if(dst.y) r.r[dst.index].y = d.y;
- if(dst.z) r.r[dst.index].z = d.z;
- if(dst.w) r.r[dst.index].w = d.w;
+ if(dst.x) r[dst.index].x = d.x;
+ if(dst.y) r[dst.index].y = d.y;
+ if(dst.z) r[dst.index].z = d.z;
+ if(dst.w) r[dst.index].w = d.w;
}
else
{
Int a = relativeAddress(dst);
- if(dst.x) r.r[dst.index + a].x = d.x;
- if(dst.y) r.r[dst.index + a].y = d.y;
- if(dst.z) r.r[dst.index + a].z = d.z;
- if(dst.w) r.r[dst.index + a].w = d.w;
+ if(dst.x) r[dst.index + a].x = d.x;
+ if(dst.y) r[dst.index + a].y = d.y;
+ if(dst.z) r[dst.index + a].z = d.z;
+ if(dst.w) r[dst.index + a].w = d.w;
}
break;
case Shader::PARAMETER_ADDR:
- if(dst.x) r.a0.x = d.x;
- if(dst.y) r.a0.y = d.y;
- if(dst.z) r.a0.z = d.z;
- if(dst.w) r.a0.w = d.w;
+ if(dst.x) a0.x = d.x;
+ if(dst.y) a0.y = d.y;
+ if(dst.z) a0.z = d.z;
+ if(dst.w) a0.w = d.w;
break;
case Shader::PARAMETER_RASTOUT:
switch(dst.index)
{
case 0:
- if(dst.x) r.o[Pos].x = d.x;
- if(dst.y) r.o[Pos].y = d.y;
- if(dst.z) r.o[Pos].z = d.z;
- if(dst.w) r.o[Pos].w = d.w;
+ if(dst.x) o[Pos].x = d.x;
+ if(dst.y) o[Pos].y = d.y;
+ if(dst.z) o[Pos].z = d.z;
+ if(dst.w) o[Pos].w = d.w;
break;
case 1:
- r.o[Fog].x = d.x;
+ o[Fog].x = d.x;
break;
case 2:
- r.o[Pts].y = d.x;
+ o[Pts].y = d.x;
break;
default: ASSERT(false);
}
break;
case Shader::PARAMETER_ATTROUT:
- if(dst.x) r.o[D0 + dst.index].x = d.x;
- if(dst.y) r.o[D0 + dst.index].y = d.y;
- if(dst.z) r.o[D0 + dst.index].z = d.z;
- if(dst.w) r.o[D0 + dst.index].w = d.w;
+ if(dst.x) o[D0 + dst.index].x = d.x;
+ if(dst.y) o[D0 + dst.index].y = d.y;
+ if(dst.z) o[D0 + dst.index].z = d.z;
+ if(dst.w) o[D0 + dst.index].w = d.w;
break;
case Shader::PARAMETER_TEXCRDOUT:
// case Shader::PARAMETER_OUTPUT:
if(version < 0x0300)
{
- if(dst.x) r.o[T0 + dst.index].x = d.x;
- if(dst.y) r.o[T0 + dst.index].y = d.y;
- if(dst.z) r.o[T0 + dst.index].z = d.z;
- if(dst.w) r.o[T0 + dst.index].w = d.w;
+ if(dst.x) o[T0 + dst.index].x = d.x;
+ if(dst.y) o[T0 + dst.index].y = d.y;
+ if(dst.z) o[T0 + dst.index].z = d.z;
+ if(dst.w) o[T0 + dst.index].w = d.w;
}
else
{
if(dst.rel.type == Shader::PARAMETER_VOID) // Not relative
{
- if(dst.x) r.o[dst.index].x = d.x;
- if(dst.y) r.o[dst.index].y = d.y;
- if(dst.z) r.o[dst.index].z = d.z;
- if(dst.w) r.o[dst.index].w = d.w;
+ if(dst.x) o[dst.index].x = d.x;
+ if(dst.y) o[dst.index].y = d.y;
+ if(dst.z) o[dst.index].z = d.z;
+ if(dst.w) o[dst.index].w = d.w;
}
else
{
Int a = relativeAddress(dst);
- if(dst.x) r.o[dst.index + a].x = d.x;
- if(dst.y) r.o[dst.index + a].y = d.y;
- if(dst.z) r.o[dst.index + a].z = d.z;
- if(dst.w) r.o[dst.index + a].w = d.w;
+ if(dst.x) o[dst.index + a].x = d.x;
+ if(dst.y) o[dst.index + a].y = d.y;
+ if(dst.z) o[dst.index + a].z = d.z;
+ if(dst.w) o[dst.index + a].w = d.w;
}
}
break;
- case Shader::PARAMETER_LABEL: break;
- case Shader::PARAMETER_PREDICATE: r.p0 = d; break;
- case Shader::PARAMETER_INPUT: break;
+ case Shader::PARAMETER_LABEL: break;
+ case Shader::PARAMETER_PREDICATE: p0 = d; break;
+ case Shader::PARAMETER_INPUT: break;
default:
ASSERT(false);
}
@@ -571,28 +590,28 @@
case 0xFF:
continue;
case Shader::USAGE_PSIZE:
- r.o[i].y = r.v[i].x;
+ o[i].y = v[i].x;
break;
case Shader::USAGE_TEXCOORD:
- r.o[i].x = r.v[i].x;
- r.o[i].y = r.v[i].y;
- r.o[i].z = r.v[i].z;
- r.o[i].w = r.v[i].w;
+ o[i].x = v[i].x;
+ o[i].y = v[i].y;
+ o[i].z = v[i].z;
+ o[i].w = v[i].w;
break;
case Shader::USAGE_POSITION:
- r.o[i].x = r.v[i].x;
- r.o[i].y = r.v[i].y;
- r.o[i].z = r.v[i].z;
- r.o[i].w = r.v[i].w;
+ o[i].x = v[i].x;
+ o[i].y = v[i].y;
+ o[i].z = v[i].z;
+ o[i].w = v[i].w;
break;
case Shader::USAGE_COLOR:
- r.o[i].x = r.v[i].x;
- r.o[i].y = r.v[i].y;
- r.o[i].z = r.v[i].z;
- r.o[i].w = r.v[i].w;
+ o[i].x = v[i].x;
+ o[i].y = v[i].y;
+ o[i].z = v[i].z;
+ o[i].w = v[i].w;
break;
case Shader::USAGE_FOG:
- r.o[i].x = r.v[i].x;
+ o[i].x = v[i].x;
break;
default:
ASSERT(false);
@@ -601,28 +620,28 @@
}
else
{
- r.o[Pos].x = r.v[PositionT].x;
- r.o[Pos].y = r.v[PositionT].y;
- r.o[Pos].z = r.v[PositionT].z;
- r.o[Pos].w = r.v[PositionT].w;
+ o[Pos].x = v[PositionT].x;
+ o[Pos].y = v[PositionT].y;
+ o[Pos].z = v[PositionT].z;
+ o[Pos].w = v[PositionT].w;
for(int i = 0; i < 2; i++)
{
- r.o[D0 + i].x = r.v[Color0 + i].x;
- r.o[D0 + i].y = r.v[Color0 + i].y;
- r.o[D0 + i].z = r.v[Color0 + i].z;
- r.o[D0 + i].w = r.v[Color0 + i].w;
+ o[D0 + i].x = v[Color0 + i].x;
+ o[D0 + i].y = v[Color0 + i].y;
+ o[D0 + i].z = v[Color0 + i].z;
+ o[D0 + i].w = v[Color0 + i].w;
}
for(int i = 0; i < 8; i++)
{
- r.o[T0 + i].x = r.v[TexCoord0 + i].x;
- r.o[T0 + i].y = r.v[TexCoord0 + i].y;
- r.o[T0 + i].z = r.v[TexCoord0 + i].z;
- r.o[T0 + i].w = r.v[TexCoord0 + i].w;
+ o[T0 + i].x = v[TexCoord0 + i].x;
+ o[T0 + i].y = v[TexCoord0 + i].y;
+ o[T0 + i].z = v[TexCoord0 + i].z;
+ o[T0 + i].w = v[TexCoord0 + i].w;
}
- r.o[Pts].y = r.v[PointSize].x;
+ o[Pts].y = v[PointSize].x;
}
}
@@ -636,11 +655,11 @@
case Shader::PARAMETER_TEMP:
if(src.rel.type == Shader::PARAMETER_VOID)
{
- reg = r.r[i];
+ reg = r[i];
}
else
{
- reg = r.r[i + relativeAddress(src)];
+ reg = r[i + relativeAddress(src)];
}
break;
case Shader::PARAMETER_CONST:
@@ -649,25 +668,25 @@
case Shader::PARAMETER_INPUT:
if(src.rel.type == Shader::PARAMETER_VOID)
{
- reg = r.v[i];
+ reg = v[i];
}
else
{
- reg = r.v[i + relativeAddress(src)];
+ reg = v[i + relativeAddress(src)];
}
break;
- case Shader::PARAMETER_VOID: return r.r[0]; // Dummy
+ case Shader::PARAMETER_VOID: return r[0]; // Dummy
case Shader::PARAMETER_FLOAT4LITERAL:
reg.x = Float4(src.value[0]);
reg.y = Float4(src.value[1]);
reg.z = Float4(src.value[2]);
reg.w = Float4(src.value[3]);
break;
- case Shader::PARAMETER_ADDR: reg = r.a0; break;
- case Shader::PARAMETER_CONSTBOOL: return r.r[0]; // Dummy
- case Shader::PARAMETER_CONSTINT: return r.r[0]; // Dummy
- case Shader::PARAMETER_LOOP: return r.r[0]; // Dummy
- case Shader::PARAMETER_PREDICATE: return r.r[0]; // Dummy
+ case Shader::PARAMETER_ADDR: reg = a0; break;
+ case Shader::PARAMETER_CONSTBOOL: return r[0]; // Dummy
+ case Shader::PARAMETER_CONSTINT: return r[0]; // Dummy
+ case Shader::PARAMETER_LOOP: return r[0]; // Dummy
+ case Shader::PARAMETER_PREDICATE: return r[0]; // Dummy
case Shader::PARAMETER_SAMPLER:
if(src.rel.type == Shader::PARAMETER_VOID)
{
@@ -675,21 +694,21 @@
}
else if(src.rel.type == Shader::PARAMETER_TEMP)
{
- reg.x = As<Float4>(Int4(i) + As<Int4>(r.r[src.rel.index].x));
+ reg.x = As<Float4>(Int4(i) + As<Int4>(r[src.rel.index].x));
}
return reg;
case Shader::PARAMETER_OUTPUT:
if(src.rel.type == Shader::PARAMETER_VOID)
{
- reg = r.o[i];
+ reg = o[i];
}
else
{
- reg = r.o[i + relativeAddress(src)];
+ reg = o[i + relativeAddress(src)];
}
break;
case Shader::PARAMETER_MISCTYPE:
- reg.x = As<Float>(Int(r.instanceID));
+ reg.x = As<Float>(Int(instanceID));
return reg;
default:
ASSERT(false);
@@ -748,7 +767,7 @@
if(src.rel.type == Shader::PARAMETER_VOID) // Not relative
{
- c.x = c.y = c.z = c.w = *Pointer<Float4>(r.data + OFFSET(DrawData,vs.c[i]));
+ c.x = c.y = c.z = c.w = *Pointer<Float4>(data + OFFSET(DrawData,vs.c[i]));
c.x = c.x.xxxx;
c.y = c.y.yyyy;
@@ -778,9 +797,9 @@
}
else if(src.rel.type == Shader::PARAMETER_LOOP)
{
- Int loopCounter = r.aL[r.loopDepth];
+ Int loopCounter = aL[loopDepth];
- c.x = c.y = c.z = c.w = *Pointer<Float4>(r.data + OFFSET(DrawData,vs.c[i]) + loopCounter * 16);
+ c.x = c.y = c.z = c.w = *Pointer<Float4>(data + OFFSET(DrawData,vs.c[i]) + loopCounter * 16);
c.x = c.x.xxxx;
c.y = c.y.yyyy;
@@ -793,7 +812,7 @@
{
Int a = relativeAddress(src);
- c.x = c.y = c.z = c.w = *Pointer<Float4>(r.data + OFFSET(DrawData,vs.c[i]) + a * 16);
+ c.x = c.y = c.z = c.w = *Pointer<Float4>(data + OFFSET(DrawData,vs.c[i]) + a * 16);
c.x = c.x.xxxx;
c.y = c.y.yyyy;
@@ -807,11 +826,11 @@
switch(src.rel.type)
{
- case Shader::PARAMETER_ADDR: a = r.a0[component]; break;
- case Shader::PARAMETER_TEMP: a = r.r[src.rel.index][component]; break;
- case Shader::PARAMETER_INPUT: a = r.v[src.rel.index][component]; break;
- case Shader::PARAMETER_OUTPUT: a = r.o[src.rel.index][component]; break;
- case Shader::PARAMETER_CONST: a = *Pointer<Float>(r.data + OFFSET(DrawData,vs.c[src.rel.index][component])); break;
+ case Shader::PARAMETER_ADDR: a = a0[component]; break;
+ case Shader::PARAMETER_TEMP: a = r[src.rel.index][component]; break;
+ case Shader::PARAMETER_INPUT: a = v[src.rel.index][component]; break;
+ case Shader::PARAMETER_OUTPUT: a = o[src.rel.index][component]; break;
+ case Shader::PARAMETER_CONST: a = *Pointer<Float>(data + OFFSET(DrawData,vs.c[src.rel.index][component])); break;
default: ASSERT(false);
}
@@ -824,10 +843,10 @@
Int index2 = Extract(index, 2);
Int index3 = Extract(index, 3);
- c.x = *Pointer<Float4>(r.data + OFFSET(DrawData,vs.c) + index0 * 16, 16);
- c.y = *Pointer<Float4>(r.data + OFFSET(DrawData,vs.c) + index1 * 16, 16);
- c.z = *Pointer<Float4>(r.data + OFFSET(DrawData,vs.c) + index2 * 16, 16);
- c.w = *Pointer<Float4>(r.data + OFFSET(DrawData,vs.c) + index3 * 16, 16);
+ c.x = *Pointer<Float4>(data + OFFSET(DrawData,vs.c) + index0 * 16, 16);
+ c.y = *Pointer<Float4>(data + OFFSET(DrawData,vs.c) + index1 * 16, 16);
+ c.z = *Pointer<Float4>(data + OFFSET(DrawData,vs.c) + index2 * 16, 16);
+ c.w = *Pointer<Float4>(data + OFFSET(DrawData,vs.c) + index3 * 16, 16);
transpose4x4(c.x, c.y, c.z, c.w);
}
@@ -842,25 +861,25 @@
if(var.rel.type == Shader::PARAMETER_TEMP)
{
- return As<Int>(Extract(r.r[var.rel.index].x, 0)) * var.rel.scale;
+ return As<Int>(Extract(r[var.rel.index].x, 0)) * var.rel.scale;
}
else if(var.rel.type == Shader::PARAMETER_INPUT)
{
- return As<Int>(Extract(r.v[var.rel.index].x, 0)) * var.rel.scale;
+ return As<Int>(Extract(v[var.rel.index].x, 0)) * var.rel.scale;
}
else if(var.rel.type == Shader::PARAMETER_OUTPUT)
{
- return As<Int>(Extract(r.o[var.rel.index].x, 0)) * var.rel.scale;
+ return As<Int>(Extract(o[var.rel.index].x, 0)) * var.rel.scale;
}
else if(var.rel.type == Shader::PARAMETER_CONST)
{
- RValue<Int4> c = *Pointer<Int4>(r.data + OFFSET(DrawData, vs.c[var.rel.index]));
+ RValue<Int4> c = *Pointer<Int4>(data + OFFSET(DrawData, vs.c[var.rel.index]));
return Extract(c, 0) * var.rel.scale;
}
else if(var.rel.type == Shader::PARAMETER_LOOP)
{
- return r.aL[r.loopDepth];
+ return aL[loopDepth];
}
else ASSERT(false);
@@ -869,23 +888,23 @@
Int4 VertexProgram::enableMask(const Shader::Instruction *instruction)
{
- Int4 enable = instruction->analysisBranch ? Int4(r.enableStack[r.enableIndex]) : Int4(0xFFFFFFFF);
+ Int4 enable = instruction->analysisBranch ? Int4(enableStack[enableIndex]) : Int4(0xFFFFFFFF);
if(!whileTest)
{
if(shader->containsBreakInstruction() && instruction->analysisBreak)
{
- enable &= r.enableBreak;
+ enable &= enableBreak;
}
if(shader->containsContinueInstruction() && instruction->analysisContinue)
{
- enable &= r.enableContinue;
+ enable &= enableContinue;
}
if(shader->containsLeaveInstruction() && instruction->analysisLeave)
{
- enable &= r.enableLeave;
+ enable &= enableLeave;
}
}
@@ -956,20 +975,20 @@
if(breakDepth == 0)
{
- r.enableIndex = r.enableIndex - breakDepth;
+ enableIndex = enableIndex - breakDepth;
Nucleus::createBr(endBlock);
}
else
{
- r.enableBreak = r.enableBreak & ~r.enableStack[r.enableIndex];
- Bool allBreak = SignMask(r.enableBreak) == 0x0;
+ enableBreak = enableBreak & ~enableStack[enableIndex];
+ Bool allBreak = SignMask(enableBreak) == 0x0;
- r.enableIndex = r.enableIndex - breakDepth;
+ enableIndex = enableIndex - breakDepth;
branch(allBreak, endBlock, deadBlock);
}
Nucleus::setInsertBlock(deadBlock);
- r.enableIndex = r.enableIndex + breakDepth;
+ enableIndex = enableIndex + breakDepth;
}
void VertexProgram::BREAKC(Vector4f &src0, Vector4f &src1, Control control)
@@ -993,7 +1012,7 @@
void VertexProgram::BREAKP(const Src &predicateRegister) // FIXME: Factor out parts common with BREAKC
{
- Int4 condition = As<Int4>(r.p0[predicateRegister.swizzle & 0x3]);
+ Int4 condition = As<Int4>(p0[predicateRegister.swizzle & 0x3]);
if(predicateRegister.modifier == Shader::MODIFIER_NOT)
{
@@ -1005,24 +1024,24 @@
void VertexProgram::BREAK(Int4 &condition)
{
- condition &= r.enableStack[r.enableIndex];
+ condition &= enableStack[enableIndex];
llvm::BasicBlock *continueBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth - 1];
- r.enableBreak = r.enableBreak & ~condition;
- Bool allBreak = SignMask(r.enableBreak) == 0x0;
+ enableBreak = enableBreak & ~condition;
+ Bool allBreak = SignMask(enableBreak) == 0x0;
- r.enableIndex = r.enableIndex - breakDepth;
+ enableIndex = enableIndex - breakDepth;
branch(allBreak, endBlock, continueBlock);
Nucleus::setInsertBlock(continueBlock);
- r.enableIndex = r.enableIndex + breakDepth;
+ enableIndex = enableIndex + breakDepth;
}
void VertexProgram::CONTINUE()
{
- r.enableContinue = r.enableContinue & ~r.enableStack[r.enableIndex];
+ enableContinue = enableContinue & ~enableStack[enableIndex];
}
void VertexProgram::TEST()
@@ -1039,15 +1058,15 @@
if(callRetBlock[labelIndex].size() > 1)
{
- r.callStack[r.stackIndex++] = UInt(callSiteIndex);
+ callStack[stackIndex++] = UInt(callSiteIndex);
}
- Int4 restoreLeave = r.enableLeave;
+ Int4 restoreLeave = enableLeave;
Nucleus::createBr(labelBlock[labelIndex]);
Nucleus::setInsertBlock(callRetBlock[labelIndex][callSiteIndex]);
- r.enableLeave = restoreLeave;
+ enableLeave = restoreLeave;
}
void VertexProgram::CALLNZ(int labelIndex, int callSiteIndex, const Src &src)
@@ -1065,7 +1084,7 @@
void VertexProgram::CALLNZb(int labelIndex, int callSiteIndex, const Src &boolRegister)
{
- Bool condition = (*Pointer<Byte>(r.data + OFFSET(DrawData,vs.b[boolRegister.index])) != Byte(0)); // FIXME
+ Bool condition = (*Pointer<Byte>(data + OFFSET(DrawData,vs.b[boolRegister.index])) != Byte(0)); // FIXME
if(boolRegister.modifier == Shader::MODIFIER_NOT)
{
@@ -1079,27 +1098,27 @@
if(callRetBlock[labelIndex].size() > 1)
{
- r.callStack[r.stackIndex++] = UInt(callSiteIndex);
+ callStack[stackIndex++] = UInt(callSiteIndex);
}
- Int4 restoreLeave = r.enableLeave;
+ Int4 restoreLeave = enableLeave;
branch(condition, labelBlock[labelIndex], callRetBlock[labelIndex][callSiteIndex]);
Nucleus::setInsertBlock(callRetBlock[labelIndex][callSiteIndex]);
- r.enableLeave = restoreLeave;
+ enableLeave = restoreLeave;
}
void VertexProgram::CALLNZp(int labelIndex, int callSiteIndex, const Src &predicateRegister)
{
- Int4 condition = As<Int4>(r.p0[predicateRegister.swizzle & 0x3]);
+ Int4 condition = As<Int4>(p0[predicateRegister.swizzle & 0x3]);
if(predicateRegister.modifier == Shader::MODIFIER_NOT)
{
condition = ~condition;
}
- condition &= r.enableStack[r.enableIndex];
+ condition &= enableStack[enableIndex];
if(!labelBlock[labelIndex])
{
@@ -1108,19 +1127,19 @@
if(callRetBlock[labelIndex].size() > 1)
{
- r.callStack[r.stackIndex++] = UInt(callSiteIndex);
+ callStack[stackIndex++] = UInt(callSiteIndex);
}
- r.enableIndex++;
- r.enableStack[r.enableIndex] = condition;
- Int4 restoreLeave = r.enableLeave;
+ enableIndex++;
+ enableStack[enableIndex] = condition;
+ Int4 restoreLeave = enableLeave;
Bool notAllFalse = SignMask(condition) != 0;
branch(notAllFalse, labelBlock[labelIndex], callRetBlock[labelIndex][callSiteIndex]);
Nucleus::setInsertBlock(callRetBlock[labelIndex][callSiteIndex]);
- r.enableIndex--;
- r.enableLeave = restoreLeave;
+ enableIndex--;
+ enableLeave = restoreLeave;
}
void VertexProgram::ELSE()
@@ -1132,12 +1151,12 @@
if(isConditionalIf[ifDepth])
{
- Int4 condition = ~r.enableStack[r.enableIndex] & r.enableStack[r.enableIndex - 1];
+ Int4 condition = ~enableStack[enableIndex] & enableStack[enableIndex - 1];
Bool notAllFalse = SignMask(condition) != 0;
branch(notAllFalse, falseBlock, endBlock);
- r.enableStack[r.enableIndex] = ~r.enableStack[r.enableIndex] & r.enableStack[r.enableIndex - 1];
+ enableStack[enableIndex] = ~enableStack[enableIndex] & enableStack[enableIndex - 1];
}
else
{
@@ -1162,7 +1181,7 @@
if(isConditionalIf[ifDepth])
{
breakDepth--;
- r.enableIndex--;
+ enableIndex--;
}
}
@@ -1170,7 +1189,7 @@
{
loopRepDepth--;
- r.aL[r.loopDepth] = r.aL[r.loopDepth] + r.increment[r.loopDepth]; // FIXME: +=
+ aL[loopDepth] = aL[loopDepth] + increment[loopDepth]; // FIXME: +=
llvm::BasicBlock *testBlock = loopRepTestBlock[loopRepDepth];
llvm::BasicBlock *endBlock = loopRepEndBlock[loopRepDepth];
@@ -1178,8 +1197,8 @@
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(endBlock);
- r.loopDepth--;
- r.enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ loopDepth--;
+ enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
}
void VertexProgram::ENDREP()
@@ -1192,8 +1211,8 @@
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(endBlock);
- r.loopDepth--;
- r.enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ loopDepth--;
+ enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
}
void VertexProgram::ENDWHILE()
@@ -1206,8 +1225,8 @@
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(endBlock);
- r.enableIndex--;
- r.enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ enableIndex--;
+ enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
whileTest = false;
}
@@ -1232,7 +1251,7 @@
{
ASSERT(ifDepth < 24 + 4);
- Bool condition = (*Pointer<Byte>(r.data + OFFSET(DrawData,vs.b[boolRegister.index])) != Byte(0)); // FIXME
+ Bool condition = (*Pointer<Byte>(data + OFFSET(DrawData,vs.b[boolRegister.index])) != Byte(0)); // FIXME
if(boolRegister.modifier == Shader::MODIFIER_NOT)
{
@@ -1252,7 +1271,7 @@
void VertexProgram::IFp(const Src &predicateRegister)
{
- Int4 condition = As<Int4>(r.p0[predicateRegister.swizzle & 0x3]);
+ Int4 condition = As<Int4>(p0[predicateRegister.swizzle & 0x3]);
if(predicateRegister.modifier == Shader::MODIFIER_NOT)
{
@@ -1283,10 +1302,10 @@
void VertexProgram::IF(Int4 &condition)
{
- condition &= r.enableStack[r.enableIndex];
+ condition &= enableStack[enableIndex];
- r.enableIndex++;
- r.enableStack[r.enableIndex] = condition;
+ enableIndex++;
+ enableStack[enableIndex] = condition;
llvm::BasicBlock *trueBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *falseBlock = Nucleus::createBasicBlock();
@@ -1315,16 +1334,16 @@
void VertexProgram::LOOP(const Src &integerRegister)
{
- r.loopDepth++;
+ loopDepth++;
- r.iteration[r.loopDepth] = *Pointer<Int>(r.data + OFFSET(DrawData,vs.i[integerRegister.index][0]));
- r.aL[r.loopDepth] = *Pointer<Int>(r.data + OFFSET(DrawData,vs.i[integerRegister.index][1]));
- r.increment[r.loopDepth] = *Pointer<Int>(r.data + OFFSET(DrawData,vs.i[integerRegister.index][2]));
+ iteration[loopDepth] = *Pointer<Int>(data + OFFSET(DrawData,vs.i[integerRegister.index][0]));
+ aL[loopDepth] = *Pointer<Int>(data + OFFSET(DrawData,vs.i[integerRegister.index][1]));
+ increment[loopDepth] = *Pointer<Int>(data + OFFSET(DrawData,vs.i[integerRegister.index][2]));
// FIXME: Compiles to two instructions?
- If(r.increment[r.loopDepth] == 0)
+ If(increment[loopDepth] == 0)
{
- r.increment[r.loopDepth] = 1;
+ increment[loopDepth] = 1;
}
llvm::BasicBlock *loopBlock = Nucleus::createBasicBlock();
@@ -1338,10 +1357,10 @@
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(testBlock);
- branch(r.iteration[r.loopDepth] > 0, loopBlock, endBlock);
+ branch(iteration[loopDepth] > 0, loopBlock, endBlock);
Nucleus::setInsertBlock(loopBlock);
- r.iteration[r.loopDepth] = r.iteration[r.loopDepth] - 1; // FIXME: --
+ iteration[loopDepth] = iteration[loopDepth] - 1; // FIXME: --
loopRepDepth++;
breakDepth = 0;
@@ -1349,10 +1368,10 @@
void VertexProgram::REP(const Src &integerRegister)
{
- r.loopDepth++;
+ loopDepth++;
- r.iteration[r.loopDepth] = *Pointer<Int>(r.data + OFFSET(DrawData,vs.i[integerRegister.index][0]));
- r.aL[r.loopDepth] = r.aL[r.loopDepth - 1];
+ iteration[loopDepth] = *Pointer<Int>(data + OFFSET(DrawData,vs.i[integerRegister.index][0]));
+ aL[loopDepth] = aL[loopDepth - 1];
llvm::BasicBlock *loopBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *testBlock = Nucleus::createBasicBlock();
@@ -1365,10 +1384,10 @@
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(testBlock);
- branch(r.iteration[r.loopDepth] > 0, loopBlock, endBlock);
+ branch(iteration[loopDepth] > 0, loopBlock, endBlock);
Nucleus::setInsertBlock(loopBlock);
- r.iteration[r.loopDepth] = r.iteration[r.loopDepth] - 1; // FIXME: --
+ iteration[loopDepth] = iteration[loopDepth] - 1; // FIXME: --
loopRepDepth++;
breakDepth = 0;
@@ -1376,7 +1395,7 @@
void VertexProgram::WHILE(const Src &temporaryRegister)
{
- r.enableIndex++;
+ enableIndex++;
llvm::BasicBlock *loopBlock = Nucleus::createBasicBlock();
llvm::BasicBlock *testBlock = Nucleus::createBasicBlock();
@@ -1385,24 +1404,24 @@
loopRepTestBlock[loopRepDepth] = testBlock;
loopRepEndBlock[loopRepDepth] = endBlock;
- Int4 restoreBreak = r.enableBreak;
- Int4 restoreContinue = r.enableContinue;
+ Int4 restoreBreak = enableBreak;
+ Int4 restoreContinue = enableContinue;
// FIXME: jump(testBlock)
Nucleus::createBr(testBlock);
Nucleus::setInsertBlock(testBlock);
- r.enableContinue = restoreContinue;
+ enableContinue = restoreContinue;
const Vector4f &src = fetchRegisterF(temporaryRegister);
Int4 condition = As<Int4>(src.x);
- condition &= r.enableStack[r.enableIndex - 1];
- r.enableStack[r.enableIndex] = condition;
+ condition &= enableStack[enableIndex - 1];
+ enableStack[enableIndex] = condition;
Bool notAllFalse = SignMask(condition) != 0;
branch(notAllFalse, loopBlock, endBlock);
Nucleus::setInsertBlock(endBlock);
- r.enableBreak = restoreBreak;
+ enableBreak = restoreBreak;
Nucleus::setInsertBlock(loopBlock);
@@ -1424,7 +1443,7 @@
if(callRetBlock[currentLabel].size() > 1) // Pop the return destination from the call stack
{
// FIXME: Encapsulate
- UInt index = r.callStack[--r.stackIndex];
+ UInt index = callStack[--stackIndex];
llvm::Value *value = index.loadValue();
llvm::Value *switchInst = Nucleus::createSwitch(value, unreachableBlock, (int)callRetBlock[currentLabel].size());
@@ -1450,7 +1469,7 @@
void VertexProgram::LEAVE()
{
- r.enableLeave = r.enableLeave & ~r.enableStack[r.enableIndex];
+ enableLeave = enableLeave & ~enableStack[enableIndex];
// FIXME: Return from function if all instances left
// FIXME: Use enableLeave in other control-flow constructs
@@ -1511,7 +1530,7 @@
void VertexProgram::TEXSIZE(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 = 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);
@@ -1525,8 +1544,8 @@
{
if(s.type == Shader::PARAMETER_SAMPLER && s.rel.type == Shader::PARAMETER_VOID)
{
- Pointer<Byte> texture = r.data + OFFSET(DrawData,mipmap[16]) + s.index * sizeof(Texture);
- sampler[s.index]->sampleTexture(texture, c, u, v, w, q, r.a0, r.a0, false, false, true);
+ Pointer<Byte> texture = data + OFFSET(DrawData,mipmap[16]) + s.index * sizeof(Texture);
+ sampler[s.index]->sampleTexture(texture, c, u, v, w, q, a0, a0, false, false, true);
}
else
{
@@ -1538,8 +1557,8 @@
{
If(index == i)
{
- Pointer<Byte> texture = r.data + OFFSET(DrawData,mipmap[16]) + i * sizeof(Texture);
- sampler[i]->sampleTexture(texture, c, u, v, w, q, r.a0, r.a0, false, false, true);
+ Pointer<Byte> texture = data + OFFSET(DrawData,mipmap[16]) + i * sizeof(Texture);
+ sampler[i]->sampleTexture(texture, c, u, v, w, q, a0, a0, false, false, true);
// FIXME: When the sampler states are the same, we could use one sampler and just index the texture
}
}
diff --git a/src/Shader/VertexProgram.hpp b/src/Shader/VertexProgram.hpp
index 445801a..8cacf31 100644
--- a/src/Shader/VertexProgram.hpp
+++ b/src/Shader/VertexProgram.hpp
@@ -32,6 +32,28 @@
virtual ~VertexProgram();
private:
+ const VertexShader *const shader;
+
+ RegisterArray<4096> r; // Temporary registers
+ Vector4f a0;
+ Array<Int, 4> aL;
+ Vector4f p0;
+
+ Array<Int, 4> increment;
+ Array<Int, 4> iteration;
+
+ Int loopDepth;
+ Int stackIndex; // FIXME: Inc/decrement callStack
+ Array<UInt, 16> callStack;
+
+ Int enableIndex;
+ Array<Int4, 1 + 24> enableStack;
+ Int4 enableBreak;
+ Int4 enableContinue;
+ Int4 enableLeave;
+
+ Int instanceID;
+
typedef Shader::DestinationParameter Dst;
typedef Shader::SourceParameter Src;
typedef Shader::Control Control;
diff --git a/src/Shader/VertexRoutine.cpp b/src/Shader/VertexRoutine.cpp
index 87d1fa0..96f48e6 100644
--- a/src/Shader/VertexRoutine.cpp
+++ b/src/Shader/VertexRoutine.cpp
@@ -23,7 +23,10 @@
extern bool halfIntegerCoordinates; // Pixel centers are not at integer coordinates
extern bool symmetricNormalizedDepth; // [-1, 1] instead of [0, 1]
- VertexRoutine::VertexRoutine(const VertexProcessor::State &state, const VertexShader *shader) : r(shader), state(state), shader(shader)
+ VertexRoutine::VertexRoutine(const VertexProcessor::State &state, const VertexShader *shader)
+ : v(shader && shader->dynamicallyIndexedInput),
+ o(shader && shader->dynamicallyIndexedOutput),
+ state(state)
{
}
@@ -41,12 +44,7 @@
UInt vertexCount = *Pointer<UInt>(task + OFFSET(VertexTask,vertexCount));
- r.data = data;
- r.constants = *Pointer<Pointer<Byte>>(data + OFFSET(DrawData,constants));
- if(shader && shader->instanceIdDeclared)
- {
- r.instanceID = *Pointer<Int>(data + OFFSET(DrawData, instanceID));
- }
+ constants = *Pointer<Pointer<Byte>>(data + OFFSET(DrawData,constants));
Do
{
@@ -84,10 +82,10 @@
{
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);
+ Pointer<Byte> input = *Pointer<Pointer<Byte>>(data + OFFSET(DrawData,input) + sizeof(void*) * i);
+ UInt stride = *Pointer<UInt>(data + OFFSET(DrawData,stride) + sizeof(unsigned int) * i);
- r.v[i] = readStream(input, stride, state.input[i], index);
+ v[i] = readStream(input, stride, state.input[i], index);
}
}
@@ -95,39 +93,39 @@
{
int pos = state.positionRegister;
- Int4 maxX = CmpLT(r.o[pos].w, r.o[pos].x);
- Int4 maxY = CmpLT(r.o[pos].w, r.o[pos].y);
- Int4 maxZ = CmpLT(r.o[pos].w, r.o[pos].z);
+ Int4 maxX = CmpLT(o[pos].w, o[pos].x);
+ Int4 maxY = CmpLT(o[pos].w, o[pos].y);
+ Int4 maxZ = CmpLT(o[pos].w, o[pos].z);
- Int4 minX = CmpNLE(-r.o[pos].w, r.o[pos].x);
- Int4 minY = CmpNLE(-r.o[pos].w, r.o[pos].y);
- Int4 minZ = CmpNLE(Float4(0.0f), r.o[pos].z);
+ Int4 minX = CmpNLE(-o[pos].w, o[pos].x);
+ Int4 minY = CmpNLE(-o[pos].w, o[pos].y);
+ Int4 minZ = CmpNLE(Float4(0.0f), o[pos].z);
Int flags;
flags = SignMask(maxX);
- r.clipFlags = *Pointer<Int>(r.constants + OFFSET(Constants,maxX) + flags * 4); // FIXME: Array indexing
+ clipFlags = *Pointer<Int>(constants + OFFSET(Constants,maxX) + flags * 4); // FIXME: Array indexing
flags = SignMask(maxY);
- r.clipFlags |= *Pointer<Int>(r.constants + OFFSET(Constants,maxY) + flags * 4);
+ clipFlags |= *Pointer<Int>(constants + OFFSET(Constants,maxY) + flags * 4);
flags = SignMask(maxZ);
- r.clipFlags |= *Pointer<Int>(r.constants + OFFSET(Constants,maxZ) + flags * 4);
+ clipFlags |= *Pointer<Int>(constants + OFFSET(Constants,maxZ) + flags * 4);
flags = SignMask(minX);
- r.clipFlags |= *Pointer<Int>(r.constants + OFFSET(Constants,minX) + flags * 4);
+ clipFlags |= *Pointer<Int>(constants + OFFSET(Constants,minX) + flags * 4);
flags = SignMask(minY);
- r.clipFlags |= *Pointer<Int>(r.constants + OFFSET(Constants,minY) + flags * 4);
+ clipFlags |= *Pointer<Int>(constants + OFFSET(Constants,minY) + flags * 4);
flags = SignMask(minZ);
- r.clipFlags |= *Pointer<Int>(r.constants + OFFSET(Constants,minZ) + flags * 4);
+ clipFlags |= *Pointer<Int>(constants + OFFSET(Constants,minZ) + flags * 4);
- Int4 finiteX = CmpLE(Abs(r.o[pos].x), *Pointer<Float4>(r.constants + OFFSET(Constants,maxPos)));
- Int4 finiteY = CmpLE(Abs(r.o[pos].y), *Pointer<Float4>(r.constants + OFFSET(Constants,maxPos)));
- Int4 finiteZ = CmpLE(Abs(r.o[pos].z), *Pointer<Float4>(r.constants + OFFSET(Constants,maxPos)));
+ Int4 finiteX = CmpLE(Abs(o[pos].x), *Pointer<Float4>(constants + OFFSET(Constants,maxPos)));
+ Int4 finiteY = CmpLE(Abs(o[pos].y), *Pointer<Float4>(constants + OFFSET(Constants,maxPos)));
+ Int4 finiteZ = CmpLE(Abs(o[pos].z), *Pointer<Float4>(constants + OFFSET(Constants,maxPos)));
flags = SignMask(finiteX & finiteY & finiteZ);
- r.clipFlags |= *Pointer<Int>(r.constants + OFFSET(Constants,fini) + flags * 4);
+ clipFlags |= *Pointer<Int>(constants + OFFSET(Constants,fini) + flags * 4);
if(state.preTransformed)
{
- r.clipFlags &= 0xFBFBFBFB; // Don't clip against far clip plane
+ clipFlags &= 0xFBFBFBFB; // Don't clip against far clip plane
}
}
@@ -179,10 +177,10 @@
if(stream.normalized)
{
- if(stream.count >= 1) v.x *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleByte));
- if(stream.count >= 2) v.y *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleByte));
- if(stream.count >= 3) v.z *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleByte));
- if(stream.count >= 4) v.w *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleByte));
+ if(stream.count >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleByte));
+ if(stream.count >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleByte));
+ if(stream.count >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleByte));
+ if(stream.count >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleByte));
}
}
break;
@@ -197,19 +195,19 @@
if(stream.normalized)
{
- if(stream.count >= 1) v.x *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleSByte));
- if(stream.count >= 2) v.y *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleSByte));
- if(stream.count >= 3) v.z *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleSByte));
- if(stream.count >= 4) v.w *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleSByte));
+ if(stream.count >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleSByte));
+ if(stream.count >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleSByte));
+ if(stream.count >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleSByte));
+ if(stream.count >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleSByte));
}
}
break;
case STREAMTYPE_COLOR:
{
- v.x = Float4(*Pointer<Byte4>(source0)) * *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleByte));
- v.y = Float4(*Pointer<Byte4>(source1)) * *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleByte));
- v.z = Float4(*Pointer<Byte4>(source2)) * *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleByte));
- v.w = Float4(*Pointer<Byte4>(source3)) * *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleByte));
+ v.x = Float4(*Pointer<Byte4>(source0)) * *Pointer<Float4>(constants + OFFSET(Constants,unscaleByte));
+ v.y = Float4(*Pointer<Byte4>(source1)) * *Pointer<Float4>(constants + OFFSET(Constants,unscaleByte));
+ v.z = Float4(*Pointer<Byte4>(source2)) * *Pointer<Float4>(constants + OFFSET(Constants,unscaleByte));
+ v.w = Float4(*Pointer<Byte4>(source3)) * *Pointer<Float4>(constants + OFFSET(Constants,unscaleByte));
transpose4x4(v.x, v.y, v.z, v.w);
@@ -230,10 +228,10 @@
if(stream.normalized)
{
- if(stream.count >= 1) v.x *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleShort));
- if(stream.count >= 2) v.y *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleShort));
- if(stream.count >= 3) v.z *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleShort));
- if(stream.count >= 4) v.w *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleShort));
+ if(stream.count >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleShort));
+ if(stream.count >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleShort));
+ if(stream.count >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleShort));
+ if(stream.count >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleShort));
}
}
break;
@@ -248,10 +246,10 @@
if(stream.normalized)
{
- if(stream.count >= 1) v.x *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleUShort));
- if(stream.count >= 2) v.y *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleUShort));
- if(stream.count >= 3) v.z *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleUShort));
- if(stream.count >= 4) v.w *= *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleUShort));
+ if(stream.count >= 1) v.x *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleUShort));
+ if(stream.count >= 2) v.y *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleUShort));
+ if(stream.count >= 3) v.z *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleUShort));
+ if(stream.count >= 4) v.w *= *Pointer<Float4>(constants + OFFSET(Constants,unscaleUShort));
}
}
break;
@@ -356,10 +354,10 @@
break;
case STREAMTYPE_FIXED:
{
- v.x = Float4(*Pointer<Int4>(source0)) * *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleFixed));
- v.y = Float4(*Pointer<Int4>(source1)) * *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleFixed));
- v.z = Float4(*Pointer<Int4>(source2)) * *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleFixed));
- v.w = Float4(*Pointer<Int4>(source3)) * *Pointer<Float4>(r.constants + OFFSET(Constants,unscaleFixed));
+ v.x = Float4(*Pointer<Int4>(source0)) * *Pointer<Float4>(constants + OFFSET(Constants,unscaleFixed));
+ v.y = Float4(*Pointer<Int4>(source1)) * *Pointer<Float4>(constants + OFFSET(Constants,unscaleFixed));
+ v.z = Float4(*Pointer<Int4>(source2)) * *Pointer<Float4>(constants + OFFSET(Constants,unscaleFixed));
+ v.w = Float4(*Pointer<Int4>(source3)) * *Pointer<Float4>(constants + OFFSET(Constants,unscaleFixed));
transpose4xN(v.x, v.y, v.z, v.w, stream.count);
}
@@ -373,10 +371,10 @@
UShort x2 = *Pointer<UShort>(source2 + 0);
UShort x3 = *Pointer<UShort>(source3 + 0);
- v.x.x = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(x0) * 4);
- v.x.y = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(x1) * 4);
- v.x.z = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(x2) * 4);
- v.x.w = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(x3) * 4);
+ v.x.x = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(x0) * 4);
+ v.x.y = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(x1) * 4);
+ v.x.z = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(x2) * 4);
+ v.x.w = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(x3) * 4);
}
if(stream.count >= 2)
@@ -386,10 +384,10 @@
UShort y2 = *Pointer<UShort>(source2 + 2);
UShort y3 = *Pointer<UShort>(source3 + 2);
- v.y.x = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(y0) * 4);
- v.y.y = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(y1) * 4);
- v.y.z = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(y2) * 4);
- v.y.w = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(y3) * 4);
+ v.y.x = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(y0) * 4);
+ v.y.y = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(y1) * 4);
+ v.y.z = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(y2) * 4);
+ v.y.w = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(y3) * 4);
}
if(stream.count >= 3)
@@ -399,10 +397,10 @@
UShort z2 = *Pointer<UShort>(source2 + 4);
UShort z3 = *Pointer<UShort>(source3 + 4);
- v.z.x = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(z0) * 4);
- v.z.y = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(z1) * 4);
- v.z.z = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(z2) * 4);
- v.z.w = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(z3) * 4);
+ v.z.x = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(z0) * 4);
+ v.z.y = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(z1) * 4);
+ v.z.z = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(z2) * 4);
+ v.z.w = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(z3) * 4);
}
if(stream.count >= 4)
@@ -412,10 +410,10 @@
UShort w2 = *Pointer<UShort>(source2 + 6);
UShort w3 = *Pointer<UShort>(source3 + 6);
- v.w.x = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(w0) * 4);
- v.w.y = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(w1) * 4);
- v.w.z = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(w2) * 4);
- v.w.w = *Pointer<Float>(r.constants + OFFSET(Constants,half2float) + Int(w3) * 4);
+ v.w.x = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(w0) * 4);
+ v.w.y = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(w1) * 4);
+ v.w.z = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(w2) * 4);
+ v.w.w = *Pointer<Float>(constants + OFFSET(Constants,half2float) + Int(w3) * 4);
}
}
break;
@@ -446,34 +444,34 @@
// Backtransform
if(state.preTransformed)
{
- Float4 rhw = Float4(1.0f) / r.o[pos].w;
+ Float4 rhw = Float4(1.0f) / o[pos].w;
- Float4 W = *Pointer<Float4>(r.data + OFFSET(DrawData,Wx16)) * Float4(1.0f / 16.0f);
- Float4 H = *Pointer<Float4>(r.data + OFFSET(DrawData,Hx16)) * Float4(1.0f / 16.0f);
- Float4 L = *Pointer<Float4>(r.data + OFFSET(DrawData,X0x16)) * Float4(1.0f / 16.0f);
- Float4 T = *Pointer<Float4>(r.data + OFFSET(DrawData,Y0x16)) * Float4(1.0f / 16.0f);
+ Float4 W = *Pointer<Float4>(data + OFFSET(DrawData,Wx16)) * Float4(1.0f / 16.0f);
+ Float4 H = *Pointer<Float4>(data + OFFSET(DrawData,Hx16)) * Float4(1.0f / 16.0f);
+ Float4 L = *Pointer<Float4>(data + OFFSET(DrawData,X0x16)) * Float4(1.0f / 16.0f);
+ Float4 T = *Pointer<Float4>(data + OFFSET(DrawData,Y0x16)) * Float4(1.0f / 16.0f);
- r.o[pos].x = (r.o[pos].x - L) / W * rhw;
- r.o[pos].y = (r.o[pos].y - T) / H * rhw;
- r.o[pos].z = r.o[pos].z * rhw;
- r.o[pos].w = rhw;
+ o[pos].x = (o[pos].x - L) / W * rhw;
+ o[pos].y = (o[pos].y - T) / H * rhw;
+ o[pos].z = o[pos].z * rhw;
+ o[pos].w = rhw;
}
if(!halfIntegerCoordinates && !state.preTransformed)
{
- r.o[pos].x = r.o[pos].x + *Pointer<Float4>(r.data + OFFSET(DrawData,halfPixelX)) * r.o[pos].w;
- r.o[pos].y = r.o[pos].y + *Pointer<Float4>(r.data + OFFSET(DrawData,halfPixelY)) * r.o[pos].w;
+ o[pos].x = o[pos].x + *Pointer<Float4>(data + OFFSET(DrawData,halfPixelX)) * o[pos].w;
+ o[pos].y = o[pos].y + *Pointer<Float4>(data + OFFSET(DrawData,halfPixelY)) * o[pos].w;
}
if(state.superSampling)
{
- r.o[pos].x = r.o[pos].x + *Pointer<Float4>(r.data + OFFSET(DrawData,XXXX)) * r.o[pos].w;
- r.o[pos].y = r.o[pos].y + *Pointer<Float4>(r.data + OFFSET(DrawData,YYYY)) * r.o[pos].w;
+ o[pos].x = o[pos].x + *Pointer<Float4>(data + OFFSET(DrawData,XXXX)) * o[pos].w;
+ o[pos].y = o[pos].y + *Pointer<Float4>(data + OFFSET(DrawData,YYYY)) * o[pos].w;
}
if(symmetricNormalizedDepth && !state.fixedFunction)
{
- r.o[pos].z = (r.o[pos].z + r.o[pos].w) * Float4(0.5f);
+ o[pos].z = (o[pos].z + o[pos].w) * Float4(0.5f);
}
}
@@ -485,10 +483,10 @@
{
if(state.output[i].write)
{
- v.x = r.o[i].x;
- v.y = r.o[i].y;
- v.z = r.o[i].z;
- v.w = r.o[i].w;
+ v.x = o[i].x;
+ v.y = o[i].y;
+ v.z = o[i].z;
+ v.w = o[i].w;
if(state.output[i].xClamp)
{
@@ -540,23 +538,23 @@
}
}
- *Pointer<Int>(cacheLine + OFFSET(Vertex,clipFlags) + sizeof(Vertex) * 0) = (r.clipFlags >> 0) & 0x0000000FF; // FIXME: unsigned char Vertex::clipFlags
- *Pointer<Int>(cacheLine + OFFSET(Vertex,clipFlags) + sizeof(Vertex) * 1) = (r.clipFlags >> 8) & 0x0000000FF;
- *Pointer<Int>(cacheLine + OFFSET(Vertex,clipFlags) + sizeof(Vertex) * 2) = (r.clipFlags >> 16) & 0x0000000FF;
- *Pointer<Int>(cacheLine + OFFSET(Vertex,clipFlags) + sizeof(Vertex) * 3) = (r.clipFlags >> 24) & 0x0000000FF;
+ *Pointer<Int>(cacheLine + OFFSET(Vertex,clipFlags) + sizeof(Vertex) * 0) = (clipFlags >> 0) & 0x0000000FF; // FIXME: unsigned char Vertex::clipFlags
+ *Pointer<Int>(cacheLine + OFFSET(Vertex,clipFlags) + sizeof(Vertex) * 1) = (clipFlags >> 8) & 0x0000000FF;
+ *Pointer<Int>(cacheLine + OFFSET(Vertex,clipFlags) + sizeof(Vertex) * 2) = (clipFlags >> 16) & 0x0000000FF;
+ *Pointer<Int>(cacheLine + OFFSET(Vertex,clipFlags) + sizeof(Vertex) * 3) = (clipFlags >> 24) & 0x0000000FF;
int pos = state.positionRegister;
- v.x = r.o[pos].x;
- v.y = r.o[pos].y;
- v.z = r.o[pos].z;
- v.w = r.o[pos].w;
+ v.x = o[pos].x;
+ v.y = o[pos].y;
+ v.z = o[pos].z;
+ v.w = o[pos].w;
Float4 w = As<Float4>(As<Int4>(v.w) | (As<Int4>(CmpEQ(v.w, Float4(0.0f))) & As<Int4>(Float4(1.0f))));
Float4 rhw = Float4(1.0f) / w;
- v.x = As<Float4>(RoundInt(*Pointer<Float4>(r.data + OFFSET(DrawData,X0x16)) + v.x * rhw * *Pointer<Float4>(r.data + OFFSET(DrawData,Wx16))));
- v.y = As<Float4>(RoundInt(*Pointer<Float4>(r.data + OFFSET(DrawData,Y0x16)) + v.y * rhw * *Pointer<Float4>(r.data + OFFSET(DrawData,Hx16))));
+ v.x = As<Float4>(RoundInt(*Pointer<Float4>(data + OFFSET(DrawData,X0x16)) + v.x * rhw * *Pointer<Float4>(data + OFFSET(DrawData,Wx16))));
+ v.y = As<Float4>(RoundInt(*Pointer<Float4>(data + OFFSET(DrawData,Y0x16)) + v.y * rhw * *Pointer<Float4>(data + OFFSET(DrawData,Hx16))));
v.z = v.z * rhw;
v.w = rhw;
diff --git a/src/Shader/VertexRoutine.hpp b/src/Shader/VertexRoutine.hpp
index 3eec924..1861d10 100644
--- a/src/Shader/VertexRoutine.hpp
+++ b/src/Shader/VertexRoutine.hpp
@@ -41,59 +41,14 @@
void generate();
protected:
- struct Registers
- {
- Registers(const VertexShader *shader) :
- v(shader && shader->dynamicallyIndexedInput),
- r(shader && shader->dynamicallyIndexedTemporaries),
- o(shader && shader->dynamicallyIndexedOutput)
- {
- loopDepth = -1;
- enableStack[0] = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
+ Pointer<Byte> constants;
- if(shader && shader->containsBreakInstruction())
- {
- enableBreak = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
- }
+ Int clipFlags;
- if(shader && shader->containsContinueInstruction())
- {
- enableContinue = Int4(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
- }
- }
-
- Pointer<Byte> data;
- Pointer<Byte> constants;
-
- Int clipFlags;
-
- RegisterArray<16> v;
- RegisterArray<4096> r;
- RegisterArray<12> o;
- Vector4f a0;
- Array<Int, 4> aL;
- Vector4f p0;
-
- Array<Int, 4> increment;
- Array<Int, 4> iteration;
-
- Int loopDepth;
- Int stackIndex; // FIXME: Inc/decrement callStack
- Array<UInt, 16> callStack;
-
- Int enableIndex;
- Array<Int4, 1 + 24> enableStack;
- Int4 enableBreak;
- Int4 enableContinue;
- Int4 enableLeave;
-
- Int instanceID;
- };
-
- Registers r;
+ RegisterArray<16> v; // Varying registers
+ RegisterArray<12> o; // Output registers
const VertexProcessor::State &state;
- const VertexShader *const shader;
private:
virtual void pipeline() = 0;