Index: src/gpu/gl/GrGLGpu.cpp |
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp |
index 3b7ccd32417718a14367399125d5247981f84978..8dc8e44d87f85c190bf2c71d1fd6e5af4dee703b 100644 |
--- a/src/gpu/gl/GrGLGpu.cpp |
+++ b/src/gpu/gl/GrGLGpu.cpp |
@@ -443,11 +443,14 @@ void GrGLGpu::onResetContext(uint32_t resetBits) { |
if (resetBits & kMSAAEnable_GrGLBackendState) { |
fMSAAEnabled = kUnknown_TriState; |
- // In mixed samples mode coverage modulation allows the coverage to be converted to |
- // "opacity", which can then be blended into the color buffer to accomplish antialiasing. |
- // Enable coverage modulation suitable for premultiplied alpha colors. |
- // This state has no effect when not rendering to a mixed sampled target. |
if (this->caps()->usesMixedSamples()) { |
+ if (0 != this->caps()->maxRasterSamples()) { |
+ fHWRasterMultisampleEnabled = kUnknown_TriState; |
+ fHWNumRasterSamples = 0; |
+ } |
+ |
+ // The skia blend modes all use premultiplied alpha and therefore expect RGBA coverage |
+ // modulation. This state has no effect when not rendering to a mixed sampled target. |
GL_CALL(CoverageModulation(GR_GL_RGBA)); |
} |
} |
@@ -1711,7 +1714,7 @@ bool GrGLGpu::flushGLState(const DrawArgs& args) { |
GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTarget()); |
this->flushStencil(pipeline.getStencil()); |
this->flushScissor(pipeline.getScissorState(), glRT->getViewport(), glRT->origin()); |
- this->flushHWAAState(glRT, pipeline.isHWAntialiasState()); |
+ this->flushHWAAState(glRT, pipeline.isHWAntialiasState(), !pipeline.getStencil().isDisabled()); |
// This must come after textures are flushed because a texture may need |
// to be msaa-resolved (which will modify bound FBO state). |
@@ -2384,7 +2387,7 @@ void GrGLGpu::performFlushWorkaround() { |
*/ |
this->disableScissor(); |
// using PLS in the presence of MSAA results in GL_INVALID_OPERATION |
- this->flushHWAAState(nullptr, false); |
+ this->flushHWAAState(nullptr, false, false); |
SkASSERT(!fHWPLSEnabled); |
SkASSERT(fMSAAEnabled != kYes_TriState); |
GL_CALL(Enable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE)); |
@@ -2716,7 +2719,7 @@ void GrGLGpu::flushStencil(const GrStencilSettings& stencilSettings) { |
} |
} |
-void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA) { |
+void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool stencilEnabled) { |
SkASSERT(!useHWAA || rt->isStencilBufferMultisampled()); |
if (this->glCaps().multisampleDisableSupport()) { |
@@ -2732,6 +2735,29 @@ void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA) { |
} |
} |
} |
+ |
+ if (0 != this->caps()->maxRasterSamples()) { |
+ if (useHWAA && rt->hasMixedSamples() && !stencilEnabled) { |
+ // Since stencil is disabled and we want more samples than are in the color buffer, we |
+ // need to tell the rasterizer explicitly how many to run. |
+ if (kYes_TriState != fHWRasterMultisampleEnabled) { |
+ GL_CALL(Enable(GR_GL_RASTER_MULTISAMPLE)); |
+ fHWRasterMultisampleEnabled = kYes_TriState; |
+ } |
+ if (rt->numStencilSamples() != fHWNumRasterSamples) { |
+ SkASSERT(rt->numStencilSamples() <= this->caps()->maxRasterSamples()); |
+ GL_CALL(RasterSamples(rt->numStencilSamples(), GR_GL_TRUE)); |
+ fHWNumRasterSamples = rt->numStencilSamples(); |
+ } |
+ } else { |
+ if (kNo_TriState != fHWRasterMultisampleEnabled) { |
+ GL_CALL(Disable(GR_GL_RASTER_MULTISAMPLE)); |
+ fHWRasterMultisampleEnabled = kNo_TriState; |
+ } |
+ } |
+ } else { |
+ SkASSERT(!useHWAA || !rt->hasMixedSamples() || stencilEnabled); |
+ } |
} |
void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo, const GrSwizzle& swizzle) { |
@@ -3474,7 +3500,7 @@ void GrGLGpu::drawDebugWireRect(GrRenderTarget* rt, const SkIRect& rect, GrColor |
this->flushBlend(blendInfo, GrSwizzle::RGBA()); |
this->flushColorWrite(true); |
this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); |
- this->flushHWAAState(glRT, false); |
+ this->flushHWAAState(glRT, false, false); |
this->disableScissor(); |
GrStencilSettings stencil; |
stencil.setDisabled(); |
@@ -3552,7 +3578,7 @@ void GrGLGpu::copySurfaceAsDraw(GrSurface* dst, |
this->flushBlend(blendInfo, GrSwizzle::RGBA()); |
this->flushColorWrite(true); |
this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); |
- this->flushHWAAState(dstRT, false); |
+ this->flushHWAAState(dstRT, false, false); |
this->disableScissor(); |
GrStencilSettings stencil; |
stencil.setDisabled(); |