Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Unified Diff: src/gpu/gl/GrGLGpu.cpp

Issue 1001503002: Implement support for mixed sampled render targets (Closed) Base URL: https://skia.googlesource.com/skia.git@mix1
Patch Set: Fixes and squash with 3rd commit Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/gl/GrGLGpu.cpp
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index b7901400fbd68c132c4b448e20874b9bb64ba291..265545d0062110f27e1bc9c271e7aab0f78e600e 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -447,6 +447,7 @@ GrRenderTarget* GrGLGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDe
GrGLuint fboID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle);
idDesc.fRenderFBO.reset(SkNEW_ARGS(GrGLFBO, (fboID)));
idDesc.fMSColorRenderbufferID = 0;
+ idDesc.fSampleConfig = wrapDesc.fSampleConfig;
idDesc.fLifeCycle = GrGpuResource::kWrapped_LifeCycle;
GrSurfaceDesc desc;
@@ -794,6 +795,7 @@ static bool renderbuffer_storage_msaa(GrGLContext& ctx,
switch (ctx.caps()->msFBOType()) {
case GrGLCaps::kDesktop_ARB_MSFBOType:
case GrGLCaps::kDesktop_EXT_MSFBOType:
+ case GrGLCaps::kStencil_MSFBOType:
case GrGLCaps::kES_3_0_MSFBOType:
GL_ALLOC_CALL(ctx.interface(),
RenderbufferStorageMultisample(GR_GL_RENDERBUFFER,
@@ -828,6 +830,9 @@ bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, bool budgeted
idDesc->fMSColorRenderbufferID = 0;
idDesc->fLifeCycle = budgeted ? GrGpuResource::kCached_LifeCycle :
GrGpuResource::kUncached_LifeCycle;
+ idDesc->fSampleConfig = GrGLCaps::kStencil_MSFBOType ==
+ this->glCaps().msFBOType() ? kStencil_GrSampleConfig :
+ kUnified_GrSampleConfig;
GrGLenum status;
@@ -1147,7 +1152,7 @@ bool GrGLGpu::createStencilBufferForRenderTarget(GrRenderTarget* rt, int width,
SkASSERT(width >= rt->width());
SkASSERT(height >= rt->height());
- int samples = rt->numSamples();
+ int samples = rt->numSamples(kStencil_GrSampleConfig);
GrGLStencilBuffer::IDDesc sbDesc;
int stencilFmtCnt = this->glCaps().stencilFormats().count();
@@ -1390,7 +1395,7 @@ void GrGLGpu::flushScissor(const GrScissorState& scissorState,
this->disableScissor();
}
-bool GrGLGpu::flushGLState(const DrawArgs& args, bool isLineDraw) {
+bool GrGLGpu::flushGLState(const DrawArgs& args, bool isLineDraw, GrSampleConfig sampleConfig) {
GrXferProcessor::BlendInfo blendInfo;
const GrPipeline& pipeline = *args.fPipeline;
args.fPipeline->getXferProcessor()->getBlendInfo(&blendInfo);
@@ -1422,7 +1427,7 @@ bool GrGLGpu::flushGLState(const DrawArgs& args, bool isLineDraw) {
GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTarget());
this->flushStencil(pipeline.getStencil());
this->flushScissor(pipeline.getScissorState(), glRT->getViewport(), glRT->origin());
- this->flushHWAAState(glRT, pipeline.isHWAntialiasState(), isLineDraw);
+ this->flushHWAAState(glRT, pipeline.isHWAntialiasState(), isLineDraw, sampleConfig);
// This must come after textures are flushed because a texture may need
// to be msaa-resolved (which will modify bound FBO state).
@@ -1950,7 +1955,7 @@ void GrGLGpu::onStencilPath(const GrPath* path, const StencilPathState& state) {
void GrGLGpu::onDrawPath(const DrawArgs& args, const GrPath* path,
const GrStencilSettings& stencil) {
- if (!this->flushGLState(args, false)) {
+ if (!this->flushGLState(args, false, kStencil_GrSampleConfig)) {
return;
}
fPathRendering->drawPath(path, stencil);
@@ -1964,7 +1969,7 @@ void GrGLGpu::onDrawPaths(const DrawArgs& args,
GrDrawTarget::PathTransformType transformType,
int count,
const GrStencilSettings& stencil) {
- if (!this->flushGLState(args, false)) {
+ if (!this->flushGLState(args, false, kStencil_GrSampleConfig)) {
return;
}
fPathRendering->drawPaths(pathRange, indices, indexType, transformValues,
@@ -2094,31 +2099,37 @@ void GrGLGpu::flushStencil(const GrStencilSettings& stencilSettings) {
}
}
-void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool isLineDraw) {
+void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool isLineDraw,
+ GrSampleConfig sampleConfig) {
// At least some ATI linux drivers will render GL_LINES incorrectly when MSAA state is enabled but
// the target is not multisampled. Single pixel wide lines are rendered thicker than 1 pixel wide.
#if 0
// Replace RT_HAS_MSAA with this definition once this driver bug is no longer a relevant concern
- #define RT_HAS_MSAA rt->isMultisampled()
+ #define RT_HAS_MSAA rt->isMultisampled(sampleConfig)
#else
- #define RT_HAS_MSAA (rt->isMultisampled() || isLineDraw)
+ #define RT_HAS_MSAA (rt->isMultisampled(sampleConfig) || isLineDraw)
#endif
if (kGL_GrGLStandard == this->glStandard()) {
Chris Dalton 2015/03/14 02:51:30 GL_MULTISAMPLE doesn't traditionally exist in ES 2
- if (RT_HAS_MSAA) {
- if (useHWAA) {
- if (kYes_TriState != fMSAAEnabled) {
- GL_CALL(Enable(GR_GL_MULTISAMPLE));
- fMSAAEnabled = kYes_TriState;
- }
- } else {
- if (kNo_TriState != fMSAAEnabled) {
- GL_CALL(Disable(GR_GL_MULTISAMPLE));
- fMSAAEnabled = kNo_TriState;
- }
+ if (RT_HAS_MSAA && useHWAA) {
+ if (kYes_TriState != fMSAAEnabled) {
+ GL_CALL(Enable(GR_GL_MULTISAMPLE));
+ fMSAAEnabled = kYes_TriState;
+ }
+ } else {
+ if (kNo_TriState != fMSAAEnabled) {
+ GL_CALL(Disable(GR_GL_MULTISAMPLE));
+ fMSAAEnabled = kNo_TriState;
}
}
}
+ if (this->glCaps().fbMixedSamplesSupport()) {
+ if (rt->isMultisampled(kStencil_GrSampleConfig)) {
Chris Dalton 2015/03/14 02:51:30 I think this would want to say: (after applying ht
+ GL_CALL(CoverageModulation(GR_GL_RGBA));
Chris Dalton 2015/03/14 02:51:30 We should add a state variable for fCoverageModula
+ } else {
+ GL_CALL(CoverageModulation(GR_GL_NONE));
+ }
+ }
}
void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) {

Powered by Google App Engine
This is Rietveld 408576698