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 ...@@ -62,8 +62,10 @@ void PixelRoutine::quad(Pointer<Byte> cBuffer[RENDERTARGETS], Pointer<Byte> &zBu
Int zMask[4]; // Depth mask Int zMask[4]; // Depth mask
Int sMask[4]; // Stencil 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)) || bool perSampleShading = (state.sampleShadingEnabled && (state.minSampleShading > 0.0f)) ||
(spirvShader && spirvShader->getModes().ContainsSampleQualifier); shaderContainsInterpolation || shaderContainsSampleQualifier;
unsigned int numSampleRenders = perSampleShading ? state.multiSampleCount : 1; unsigned int numSampleRenders = perSampleShading ? state.multiSampleCount : 1;
for(unsigned int i = 0; i < numSampleRenders; ++i) for(unsigned int i = 0; i < numSampleRenders; ++i)
...@@ -131,7 +133,7 @@ void PixelRoutine::quad(Pointer<Byte> cBuffer[RENDERTARGETS], Pointer<Byte> &zBu ...@@ -131,7 +133,7 @@ void PixelRoutine::quad(Pointer<Byte> cBuffer[RENDERTARGETS], Pointer<Byte> &zBu
Float4 XXXX = Float4(0.0f); Float4 XXXX = Float4(0.0f);
Float4 YYYY = Float4(0.0f); Float4 YYYY = Float4(0.0f);
if(state.centroid) if(state.centroid || shaderContainsInterpolation)
{ {
Float4 WWWW(1.0e-9f); Float4 WWWW(1.0e-9f);
...@@ -155,7 +157,7 @@ void PixelRoutine::quad(Pointer<Byte> cBuffer[RENDERTARGETS], Pointer<Byte> &zBu ...@@ -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); w = interpolate(xxxx, Dw, rhw, primitive + OFFSET(Primitive, w), false, false);
rhw = reciprocal(w, false, false, true); 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)); 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 ...@@ -163,6 +165,19 @@ void PixelRoutine::quad(Pointer<Byte> cBuffer[RENDERTARGETS], Pointer<Byte> &zBu
if(spirvShader) 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)) if(perSampleShading && (state.multiSampleCount > 1))
{ {
xxxx += Float4(Constants::SampleLocationsX[sampleId]); xxxx += Float4(Constants::SampleLocationsX[sampleId]);
......
...@@ -397,6 +397,7 @@ SpirvShader::SpirvShader( ...@@ -397,6 +397,7 @@ SpirvShader::SpirvShader(
case spv::CapabilityStorageImageExtendedFormats: capabilities.StorageImageExtendedFormats = true; break; case spv::CapabilityStorageImageExtendedFormats: capabilities.StorageImageExtendedFormats = true; break;
case spv::CapabilityImageQuery: capabilities.ImageQuery = true; break; case spv::CapabilityImageQuery: capabilities.ImageQuery = true; break;
case spv::CapabilityDerivativeControl: capabilities.DerivativeControl = 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::CapabilityGroupNonUniform: capabilities.GroupNonUniform = true; break;
case spv::CapabilityGroupNonUniformVote: capabilities.GroupNonUniformVote = true; break; case spv::CapabilityGroupNonUniformVote: capabilities.GroupNonUniformVote = true; break;
case spv::CapabilityGroupNonUniformArithmetic: capabilities.GroupNonUniformArithmetic = true; break; case spv::CapabilityGroupNonUniformArithmetic: capabilities.GroupNonUniformArithmetic = true; break;
......
...@@ -584,6 +584,7 @@ public: ...@@ -584,6 +584,7 @@ public:
bool StorageImageExtendedFormats : 1; bool StorageImageExtendedFormats : 1;
bool ImageQuery : 1; bool ImageQuery : 1;
bool DerivativeControl : 1; bool DerivativeControl : 1;
bool InterpolationFunction : 1;
bool GroupNonUniform : 1; bool GroupNonUniform : 1;
bool GroupNonUniformVote : 1; bool GroupNonUniformVote : 1;
bool GroupNonUniformBallot : 1; bool GroupNonUniformBallot : 1;
...@@ -1352,12 +1353,24 @@ public: ...@@ -1352,12 +1353,24 @@ public:
Pointer<Byte> function; 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; vk::PipelineLayout const *const pipelineLayout;
std::unordered_map<SpirvShader::Object::ID, Variable> variables; std::unordered_map<SpirvShader::Object::ID, Variable> variables;
std::unordered_map<SpirvShader::Object::ID, SamplerCache> samplerCache; std::unordered_map<SpirvShader::Object::ID, SamplerCache> samplerCache;
Variable inputs = Variable{ MAX_INTERFACE_COMPONENTS }; Variable inputs = Variable{ MAX_INTERFACE_COMPONENTS };
Variable outputs = Variable{ MAX_INTERFACE_COMPONENTS }; Variable outputs = Variable{ MAX_INTERFACE_COMPONENTS };
InterpolationData interpolationData;
Pointer<Byte> workgroupMemory; Pointer<Byte> workgroupMemory;
Pointer<Pointer<Byte>> descriptorSets; 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