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:
parent
9fba557ad5
commit
3ed3399a93
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -179,6 +179,8 @@ public:
|
||||
|
||||
void insertEventMarker(const char*);
|
||||
|
||||
void didBindFramebuffer();
|
||||
|
||||
private:
|
||||
GrGLGpu(std::unique_ptr<GrGLContext>, GrContext*);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user