Commit eae5b965 by Chris Forbes

Wire up alphaToCoverage support

All the real work was already done; this just needed connecting. Bug: b/118386749 Test: dEQP-VK.pipeline.multisample.alpha_to_coverage.* Change-Id: Ib1e2b7a64a76d8d7df9ed5c93e4cc738efdd83b3 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/29648Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent bc694e28
......@@ -172,6 +172,7 @@ namespace sw
writeSRGB = false;
sampleMask = 0xFFFFFFFF;
alphaToCoverage = false;
}
bool Context::setDepthBufferEnable(bool depthBufferEnable)
......
......@@ -201,6 +201,7 @@ namespace sw
unsigned int sampleMask;
unsigned int multiSampleMask;
int sampleCount;
bool alphaToCoverage;
PushConstantStorage pushConstants;
};
......
......@@ -282,11 +282,7 @@ namespace sw
state.shaderID = 0;
}
if(context->alphaTestActive())
{
state.transparencyAntialiasing = context->sampleCount > 1 ? transparencyAntialiasing : TRANSPARENCY_NONE;
}
state.alphaToCoverage = context->alphaToCoverage;
state.depthWriteEnable = context->depthWriteActive();
if(context->stencilActive())
......
......@@ -61,7 +61,7 @@ namespace sw
bool writeSRGB;
unsigned int multiSample;
unsigned int multiSampleMask;
TransparencyAntialiasing transparencyAntialiasing;
bool alphaToCoverage;
bool centroid;
bool frontFaceCCW;
VkFormat depthFormat;
......@@ -80,11 +80,6 @@ namespace sw
return (colorWriteMask >> (index * 4)) & 0xF;
}
bool alphaTestActive() const
{
return transparencyAntialiasing != TRANSPARENCY_NONE;
}
unsigned int hash;
};
......
......@@ -437,22 +437,19 @@ namespace sw
data->factor = factor;
if(pixelState.transparencyAntialiasing == TRANSPARENCY_ALPHA_TO_COVERAGE)
if(pixelState.alphaToCoverage)
{
float ref = context->alphaReference * (1.0f / 255.0f);
float margin = sw::min(ref, 1.0f - ref);
if(ms == 4)
{
data->a2c0 = replicate(ref - margin * 0.6f);
data->a2c1 = replicate(ref - margin * 0.2f);
data->a2c2 = replicate(ref + margin * 0.2f);
data->a2c3 = replicate(ref + margin * 0.6f);
data->a2c0 = replicate(0.2f);
data->a2c1 = replicate(0.4f);
data->a2c2 = replicate(0.6f);
data->a2c3 = replicate(0.8f);
}
else if(ms == 2)
{
data->a2c0 = replicate(ref - margin * 0.3f);
data->a2c1 = replicate(ref + margin * 0.3f);
data->a2c0 = replicate(0.25f);
data->a2c1 = replicate(0.75f);
}
else ASSERT(false);
}
......
......@@ -99,16 +99,12 @@ namespace sw
Bool PixelProgram::alphaTest(Int cMask[4])
{
if(!state.alphaTestActive())
if(!state.alphaToCoverage)
{
return true;
}
if(state.transparencyAntialiasing == TRANSPARENCY_ALPHA_TO_COVERAGE)
{
alphaToCoverage(cMask, c[0].w);
}
else ASSERT(false);
alphaToCoverage(cMask, c[0].w);
Int pass = cMask[0];
......@@ -221,7 +217,7 @@ namespace sw
{
for(int index = 0; index < RENDERTARGETS; index++)
{
if(!state.colorWriteActive(index) && !(index == 0 && state.alphaTestActive()))
if(!state.colorWriteActive(index) && !(index == 0 && state.alphaToCoverage))
{
continue;
}
......
......@@ -62,7 +62,8 @@ namespace sw
Long pipeTime = Ticks();
#endif
const bool earlyDepthTest = !spirvShader->getModes().DepthReplacing && !state.alphaTestActive();
// TODO: consider shader which modifies sample mask in general
const bool earlyDepthTest = !spirvShader->getModes().DepthReplacing && !state.alphaToCoverage;
Int zMask[4]; // Depth mask
Int sMask[4]; // Stencil mask
......@@ -194,7 +195,7 @@ namespace sw
alphaPass = alphaTest(cMask);
if((spirvShader && spirvShader->getModes().ContainsKill) || state.alphaTestActive())
if((spirvShader && spirvShader->getModes().ContainsKill) || state.alphaToCoverage)
{
for(unsigned int q = 0; q < state.multiSample; q++)
{
......@@ -2476,6 +2477,6 @@ namespace sw
bool PixelRoutine::colorUsed()
{
return state.colorWriteMask || state.alphaTestActive() || (spirvShader && spirvShader->getModes().ContainsKill);
return state.colorWriteMask || state.alphaToCoverage || (spirvShader && spirvShader->getModes().ContainsKill);
}
}
......@@ -355,9 +355,10 @@ GraphicsPipeline::GraphicsPipeline(const VkGraphicsPipelineCreateInfo* pCreateIn
if (multisampleState->pSampleMask)
context.sampleMask = multisampleState->pSampleMask[0];
context.alphaToCoverage = (multisampleState->alphaToCoverageEnable == VK_TRUE);
if((multisampleState->flags != 0) ||
(multisampleState->sampleShadingEnable != 0) ||
(multisampleState->alphaToCoverageEnable != 0) ||
(multisampleState->alphaToOneEnable != 0))
{
UNIMPLEMENTED("multisampleState");
......
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