Driver bug workaround: restore_scissor_on_fbo_change

Bug: chromium: 829614
Change-Id: I333aed9a378ab9b7aafaa96bb495378d1db4a61d
Reviewed-on: https://skia-review.googlesource.com/127118
Commit-Queue: Adrienne Walker <enne@chromium.org>
Reviewed-by: Brian Salomon <bsalomon@google.com>
This commit is contained in:
Adrienne Walker 2018-05-15 11:44:34 -07:00 committed by Skia Commit-Bot
parent 9fba557ad5
commit 3ed3399a93
6 changed files with 25 additions and 0 deletions

View File

@ -16,4 +16,6 @@
max_msaa_sample_count_4) \
GPU_OP(MAX_TEXTURE_SIZE_LIMIT_4096, \
max_texture_size_limit_4096) \
GPU_OP(RESTORE_SCISSOR_ON_FBO_CHANGE, \
restore_scissor_on_fbo_change) \
// The End

View File

@ -273,6 +273,8 @@ public:
virtual bool getConfigFromBackendFormat(const GrBackendFormat& format, SkColorType ct,
GrPixelConfig*) const = 0;
const GrDriverBugWorkarounds& workarounds() const { return fDriverBugWorkarounds; }
protected:
/** Subclasses must call this at the end of their constructors in order to apply caps
overrides requested by the client. Note that overrides will only reduce the caps never

View File

@ -1353,6 +1353,7 @@ bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc,
fGLContext->caps()->markConfigAsValidColorAttachment(desc.fConfig);
}
this->didBindFramebuffer();
return true;
FAILED:
@ -2475,6 +2476,7 @@ void GrGLGpu::flushRenderTargetNoColorWrites(GrGLRenderTarget* target, bool disa
if (fHWBoundRenderTargetUniqueID != rtID) {
fStats.incRenderTargetBinds();
GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID()));
this->didBindFramebuffer();
#ifdef SK_DEBUG
// don't do this check in Chromium -- this is causing
// lots of repeated command buffer flushes when the compositor is
@ -3379,6 +3381,7 @@ void GrGLGpu::bindSurfaceFBOForPixelOps(GrSurface* surface, GrGLenum fboTarget,
GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBOID()));
*viewport = rt->getViewport();
}
this->didBindFramebuffer();
}
void GrGLGpu::unbindTextureFBOForPixelOps(GrGLenum fboTarget, GrSurface* surface) {
@ -3394,6 +3397,19 @@ void GrGLGpu::unbindTextureFBOForPixelOps(GrGLenum fboTarget, GrSurface* surface
}
}
void GrGLGpu::didBindFramebuffer() {
if (!this->caps()->workarounds().restore_scissor_on_fbo_change) {
return;
}
// The driver forgets the correct scissor when modifying the FBO binding.
fHWScissorSettings.fRect.pushToGLScissor(this->glInterface());
// crbug.com/222018 - Also on QualComm, the flush here avoids flicker,
// it's unclear how this bug works.
GL_CALL(Flush());
}
bool GrGLGpu::onCopySurface(GrSurface* dst, GrSurfaceOrigin dstOrigin,
GrSurface* src, GrSurfaceOrigin srcOrigin,
const SkIRect& srcRect, const SkIPoint& dstPoint,

View File

@ -179,6 +179,8 @@ public:
void insertEventMarker(const char*);
void didBindFramebuffer();
private:
GrGLGpu(std::unique_ptr<GrGLContext>, GrContext*);

View File

@ -143,6 +143,8 @@ bool GrGLRenderTarget::completeStencilAttachment() {
GR_GL_RENDERBUFFER, 0));
}
gpu->didBindFramebuffer();
#ifdef SK_DEBUG
if (kChromium_GrGLDriver != gpu->glContext().driver()) {
// This check can cause problems in Chromium if the context has been asynchronously

View File

@ -3,3 +3,4 @@ disable_discard_framebuffer
disallow_large_instanced_draw
max_msaa_sample_count_4
max_texture_size_limit_4096
restore_scissor_on_fbo_change