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
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();
return state;
......
......@@ -83,15 +83,6 @@ namespace sw
VkLogicOp logicalOperation : BITS(VK_LOGIC_OP_END_RANGE);
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
......
......@@ -47,14 +47,7 @@ namespace sw
union
{
struct
{
PlaneEquation C[2][4];
PlaneEquation T[8][4];
PlaneEquation f;
};
PlaneEquation V[MAX_FRAGMENT_INPUTS][4];
PlaneEquation V[MAX_INTERFACE_COMPONENTS];
};
float area;
......
......@@ -238,19 +238,15 @@ namespace sw
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(state.interpolant[interpolant].component & (1 << component))
{
Dv[interpolant][component] = *Pointer<Float4>(primitive + OFFSET(Primitive,V[interpolant][component].C), 16);
if (spirvShader->inputs[interpolant].Type == SpirvShader::ATTRIBTYPE_UNUSED)
continue;
if(!(state.interpolant[interpolant].flat & (1 << component)))
{
Dv[interpolant][component] += yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive,V[interpolant][component].B), 16);
}
}
Dv[interpolant] = *Pointer<Float4>(primitive + OFFSET(Primitive, V[interpolant].C), 16);
if (!spirvShader->inputs[interpolant].Flat)
{
Dv[interpolant] += yyyy * *Pointer<Float4>(primitive + OFFSET(Primitive, V[interpolant].B), 16);
}
}
......
......@@ -35,7 +35,7 @@ namespace sw
Float4 Dz[4];
Float4 Dw;
Float4 Dv[MAX_FRAGMENT_INPUTS][4];
Float4 Dv[MAX_INTERFACE_COMPONENTS];
Float4 Df;
UInt occlusion;
......
......@@ -30,20 +30,17 @@ namespace sw
extern bool forceClearRegisters;
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);
v[i].y = Float4(0.0f);
v[i].z = Float4(0.0f);
v[i].w = Float4(0.0f);
(*routine.inputs)[i] = Float4(0.0f);
}
}
spirvShader->emitEarly(&routine);
}
PixelRoutine::~PixelRoutine()
......@@ -144,21 +141,24 @@ namespace sw
}
}
// TODO: rethink what we want to do here for pull-mode interpolation
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++)
auto const & input = spirvShader->inputs[interpolant];
if (input.Type != SpirvShader::ATTRIBTYPE_UNUSED)
{
if(state.interpolant[interpolant].component & (1 << component))
if (input.Centroid)
{
if(!state.interpolant[interpolant].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);
}
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] =
interpolateCentroid(XXXX, YYYY, rhwCentroid,
primitive + OFFSET(Primitive, V[interpolant]),
input.Flat, state.perspective);
}
else
{
(*routine.inputs)[interpolant] =
interpolate(xxxx, Dv[interpolant], rhw,
primitive + OFFSET(Primitive, V[interpolant]),
input.Flat, state.perspective, false);
}
}
}
......
......@@ -34,7 +34,6 @@ namespace sw
Float4 w; // Used as is
Float4 rhw; // Reciprocal w
RegisterArray<MAX_FRAGMENT_INPUTS> v; // Varying registers
SpirvRoutine routine;
// 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