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;
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);
}
}
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()
}
}
- // 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);
}
}
}