Store interpolation data in routine

When the shader contains interpolation instruction, interpolation related data needs to be stored in the routine in order to be able to perform the interpolation operations in the middle of running the spirv shader. Bug: b/171415086 Change-Id: I08fc6befdca1df92fa50326d9047926ac3417aa5 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/51734Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Commit-Queue: Alexis Hétu <sugoi@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 09df3eba
......@@ -62,8 +62,10 @@ void PixelRoutine::quad(Pointer<Byte> cBuffer[RENDERTARGETS], Pointer<Byte> &zBu
Int zMask[4]; // Depth mask
Int sMask[4]; // Stencil mask
bool shaderContainsInterpolation = spirvShader && spirvShader->getUsedCapabilities().InterpolationFunction;
bool shaderContainsSampleQualifier = spirvShader && spirvShader->getModes().ContainsSampleQualifier;
bool perSampleShading = (state.sampleShadingEnabled && (state.minSampleShading > 0.0f)) ||
(spirvShader && spirvShader->getModes().ContainsSampleQualifier);
shaderContainsInterpolation || shaderContainsSampleQualifier;
unsigned int numSampleRenders = perSampleShading ? state.multiSampleCount : 1;
for(unsigned int i = 0; i < numSampleRenders; ++i)
......@@ -131,7 +133,7 @@ void PixelRoutine::quad(Pointer<Byte> cBuffer[RENDERTARGETS], Pointer<Byte> &zBu
Float4 XXXX = Float4(0.0f);
Float4 YYYY = Float4(0.0f);
if(state.centroid)
if(state.centroid || shaderContainsInterpolation)
{
Float4 WWWW(1.0e-9f);
......@@ -155,7 +157,7 @@ void PixelRoutine::quad(Pointer<Byte> cBuffer[RENDERTARGETS], Pointer<Byte> &zBu
w = interpolate(xxxx, Dw, rhw, primitive + OFFSET(Primitive, w), false, false);
rhw = reciprocal(w, false, false, true);
if(state.centroid)
if(state.centroid || shaderContainsInterpolation)
{
rhwCentroid = reciprocal(SpirvRoutine::interpolateAtXY(XXXX, YYYY, rhwCentroid, primitive + OFFSET(Primitive, w), false, false));
}
......@@ -163,6 +165,19 @@ void PixelRoutine::quad(Pointer<Byte> cBuffer[RENDERTARGETS], Pointer<Byte> &zBu
if(spirvShader)
{
if(shaderContainsInterpolation)
{
routine.interpolationData.primitive = primitive;
routine.interpolationData.x = xxxx;
routine.interpolationData.y = yyyy;
routine.interpolationData.rhw = rhw;
routine.interpolationData.xCentroid = XXXX;
routine.interpolationData.yCentroid = YYYY;
routine.interpolationData.rhwCentroid = rhwCentroid;
}
if(perSampleShading && (state.multiSampleCount > 1))
{
xxxx += Float4(Constants::SampleLocationsX[sampleId]);
......
......@@ -397,6 +397,7 @@ SpirvShader::SpirvShader(
case spv::CapabilityStorageImageExtendedFormats: capabilities.StorageImageExtendedFormats = true; break;
case spv::CapabilityImageQuery: capabilities.ImageQuery = true; break;
case spv::CapabilityDerivativeControl: capabilities.DerivativeControl = true; break;
case spv::CapabilityInterpolationFunction: capabilities.InterpolationFunction = true; break;
case spv::CapabilityGroupNonUniform: capabilities.GroupNonUniform = true; break;
case spv::CapabilityGroupNonUniformVote: capabilities.GroupNonUniformVote = true; break;
case spv::CapabilityGroupNonUniformArithmetic: capabilities.GroupNonUniformArithmetic = true; break;
......
......@@ -584,6 +584,7 @@ public:
bool StorageImageExtendedFormats : 1;
bool ImageQuery : 1;
bool DerivativeControl : 1;
bool InterpolationFunction : 1;
bool GroupNonUniform : 1;
bool GroupNonUniformVote : 1;
bool GroupNonUniformBallot : 1;
......@@ -1352,12 +1353,24 @@ public:
Pointer<Byte> function;
};
struct InterpolationData
{
Pointer<Byte> primitive;
SIMD::Float x;
SIMD::Float y;
SIMD::Float rhw;
SIMD::Float xCentroid;
SIMD::Float yCentroid;
SIMD::Float rhwCentroid;
};
vk::PipelineLayout const *const pipelineLayout;
std::unordered_map<SpirvShader::Object::ID, Variable> variables;
std::unordered_map<SpirvShader::Object::ID, SamplerCache> samplerCache;
Variable inputs = Variable{ MAX_INTERFACE_COMPONENTS };
Variable outputs = Variable{ MAX_INTERFACE_COMPONENTS };
InterpolationData interpolationData;
Pointer<Byte> workgroupMemory;
Pointer<Pointer<Byte>> descriptorSets;
......
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