Commit 5d61a1cf by Chris Forbes

Wire up FS input to the shader

Bug: b/124177079 Change-Id: I8dac28d2c55ce1c4eb9a815bfad56ba917be32c5 Reviewed-on: https://swiftshader-review.googlesource.com/c/24593Reviewed-by: 's avatarBen Clayton <bclayton@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent d5c6d30d
...@@ -709,44 +709,6 @@ namespace sw ...@@ -709,44 +709,6 @@ namespace sw
const bool point = context->isDrawPoint(); const bool point = context->isDrawPoint();
/* TODO: bring back interpolants by some mechanism */
// for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
// {
// for(int component = 0; component < 4; component++)
// {
// const Shader::Semantic &semantic = context->pixelShader->getInput(interpolant, component);
//
// if(semantic.active())
// {
// bool flat = point;
//
// switch(semantic.usage)
// {
// case Shader::USAGE_TEXCOORD: flat = false; break;
// case Shader::USAGE_COLOR: flat = semantic.flat || point; break;
// }
//
// state.interpolant[interpolant].component |= 1 << component;
//
// if(flat)
// {
// state.interpolant[interpolant].flat |= 1 << component;
// }
// }
// }
// }
//
// if(state.centroid)
// {
// for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
// {
// for(int component = 0; component < 4; component++)
// {
// state.interpolant[interpolant].centroid = context->pixelShader->getInput(interpolant, 0).centroid;
// }
// }
// }
state.hash = state.computeHash(); state.hash = state.computeHash();
return state; return state;
......
...@@ -83,15 +83,6 @@ namespace sw ...@@ -83,15 +83,6 @@ namespace sw
VkLogicOp logicalOperation : BITS(VK_LOGIC_OP_END_RANGE); VkLogicOp logicalOperation : BITS(VK_LOGIC_OP_END_RANGE);
Sampler::State sampler[TEXTURE_IMAGE_UNITS]; Sampler::State sampler[TEXTURE_IMAGE_UNITS];
struct Interpolant
{
unsigned char component : 4;
unsigned char flat : 4;
bool centroid : 1;
};
Interpolant interpolant[MAX_FRAGMENT_INPUTS];
}; };
struct State : States struct State : States
......
...@@ -47,14 +47,7 @@ namespace sw ...@@ -47,14 +47,7 @@ namespace sw
union union
{ {
struct PlaneEquation V[MAX_INTERFACE_COMPONENTS];
{
PlaneEquation C[2][4];
PlaneEquation T[8][4];
PlaneEquation f;
};
PlaneEquation V[MAX_FRAGMENT_INPUTS][4];
}; };
float area; float area;
......
...@@ -238,19 +238,15 @@ namespace sw ...@@ -238,19 +238,15 @@ namespace sw
Dw = *Pointer<Float4>(primitive + OFFSET(Primitive,w.C), 16) + yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive,w.B), 16); Dw = *Pointer<Float4>(primitive + OFFSET(Primitive,w.C), 16) + yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive,w.B), 16);
} }
for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++) for (int interpolant = 0; interpolant < MAX_INTERFACE_COMPONENTS; interpolant++)
{ {
for(int component = 0; component < 4; component++) if (spirvShader->inputs[interpolant].Type == SpirvShader::ATTRIBTYPE_UNUSED)
{ continue;
if(state.interpolant[interpolant].component & (1 << component))
{
Dv[interpolant][component] = *Pointer<Float4>(primitive + OFFSET(Primitive,V[interpolant][component].C), 16);
if(!(state.interpolant[interpolant].flat & (1 << component))) Dv[interpolant] = *Pointer<Float4>(primitive + OFFSET(Primitive, V[interpolant].C), 16);
if (!spirvShader->inputs[interpolant].Flat)
{ {
Dv[interpolant][component] += yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive,V[interpolant][component].B), 16); Dv[interpolant] += yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive, V[interpolant].B), 16);
}
}
} }
} }
......
...@@ -35,7 +35,7 @@ namespace sw ...@@ -35,7 +35,7 @@ namespace sw
Float4 Dz[4]; Float4 Dz[4];
Float4 Dw; Float4 Dw;
Float4 Dv[MAX_FRAGMENT_INPUTS][4]; Float4 Dv[MAX_INTERFACE_COMPONENTS];
Float4 Df; Float4 Df;
UInt occlusion; UInt occlusion;
......
...@@ -30,20 +30,17 @@ namespace sw ...@@ -30,20 +30,17 @@ namespace sw
extern bool forceClearRegisters; extern bool forceClearRegisters;
PixelRoutine::PixelRoutine(const PixelProcessor::State &state, SpirvShader const *spirvShader) PixelRoutine::PixelRoutine(const PixelProcessor::State &state, SpirvShader const *spirvShader)
: QuadRasterizer(state, spirvShader), v(true) /* addressing */ : QuadRasterizer(state, spirvShader) /* addressing */
{ {
if(forceClearRegisters) spirvShader->emitEarly(&routine);
if (forceClearRegisters)
{ {
for(int i = 0; i < MAX_FRAGMENT_INPUTS; i++) for (int i = 0; i < MAX_INTERFACE_COMPONENTS; i++)
{ {
v[i].x = Float4(0.0f); (*routine.inputs)[i] = Float4(0.0f);
v[i].y = Float4(0.0f);
v[i].z = Float4(0.0f);
v[i].w = Float4(0.0f);
} }
} }
spirvShader->emitEarly(&routine);
} }
PixelRoutine::~PixelRoutine() PixelRoutine::~PixelRoutine()
...@@ -144,21 +141,24 @@ namespace sw ...@@ -144,21 +141,24 @@ namespace sw
} }
} }
// TODO: rethink what we want to do here for pull-mode interpolation for (int interpolant = 0; interpolant < MAX_INTERFACE_COMPONENTS; interpolant++)
for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
{
for(int component = 0; component < 4; component++)
{ {
if(state.interpolant[interpolant].component & (1 << component)) auto const & input = spirvShader->inputs[interpolant];
if (input.Type != SpirvShader::ATTRIBTYPE_UNUSED)
{ {
if(!state.interpolant[interpolant].centroid) if (input.Centroid)
{ {
v[interpolant][component] = interpolate(xxxx, Dv[interpolant][component], rhw, primitive + OFFSET(Primitive, V[interpolant][component]), (state.interpolant[interpolant].flat & (1 << component)) != 0, state.perspective, false); (*routine.inputs)[interpolant] =
interpolateCentroid(XXXX, YYYY, rhwCentroid,
primitive + OFFSET(Primitive, V[interpolant]),
input.Flat, state.perspective);
} }
else else
{ {
v[interpolant][component] = interpolateCentroid(XXXX, YYYY, rhwCentroid, primitive + OFFSET(Primitive, V[interpolant][component]), (state.interpolant[interpolant].flat & (1 << component)) != 0, state.perspective); (*routine.inputs)[interpolant] =
} interpolate(xxxx, Dv[interpolant], rhw,
primitive + OFFSET(Primitive, V[interpolant]),
input.Flat, state.perspective, false);
} }
} }
} }
......
...@@ -34,7 +34,6 @@ namespace sw ...@@ -34,7 +34,6 @@ namespace sw
Float4 w; // Used as is Float4 w; // Used as is
Float4 rhw; // Reciprocal w Float4 rhw; // Reciprocal w
RegisterArray<MAX_FRAGMENT_INPUTS> v; // Varying registers
SpirvRoutine routine; SpirvRoutine routine;
// Depth output // Depth output
......
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