Index: src/gpu/gl/GrGLGpu.cpp |
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp |
index 34223f1cc85add1ebfb388d8292976093a13f60f..c8c12a388d3fcf1aa730188e8210e4e0d55027f3 100644 |
--- a/src/gpu/gl/GrGLGpu.cpp |
+++ b/src/gpu/gl/GrGLGpu.cpp |
@@ -386,9 +386,51 @@ void GrGLGpu::createPLSSetupProgram() { |
GR_GL_STATIC_DRAW)); |
} |
-void GrGLGpu::contextAbandoned() { |
- INHERITED::contextAbandoned(); |
- fProgramCache->abandon(); |
+void GrGLGpu::disconnect(DisconnectType type) { |
+ INHERITED::disconnect(type); |
+ if (DisconnectType::kCleanup == type) { |
+ if (fHWProgramID) { |
+ GL_CALL(UseProgram(0)); |
+ } |
+ if (fTempSrcFBOID) { |
+ GL_CALL(DeleteFramebuffers(1, &fTempSrcFBOID)); |
+ } |
+ if (fTempDstFBOID) { |
+ GL_CALL(DeleteFramebuffers(1, &fTempDstFBOID)); |
+ } |
+ if (fStencilClearFBOID) { |
+ GL_CALL(DeleteFramebuffers(1, &fStencilClearFBOID)); |
+ } |
+ if (fCopyProgramArrayBuffer) { |
+ GL_CALL(DeleteBuffers(1, &fCopyProgramArrayBuffer)); |
+ } |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(fCopyPrograms); ++i) { |
+ if (fCopyPrograms[i].fProgram) { |
+ GL_CALL(DeleteProgram(fCopyPrograms[i].fProgram)); |
+ } |
+ } |
+ if (fWireRectProgram.fProgram) { |
+ GL_CALL(DeleteProgram(fWireRectProgram.fProgram)); |
+ } |
+ if (fWireRectArrayBuffer) { |
+ GL_CALL(DeleteBuffers(1, &fWireRectArrayBuffer)); |
+ } |
+ |
+ if (fPLSSetupProgram.fProgram) { |
+ GL_CALL(DeleteProgram(fPLSSetupProgram.fProgram)); |
+ } |
+ if (fPLSSetupProgram.fArrayBuffer) { |
+ GL_CALL(DeleteBuffers(1, &fPLSSetupProgram.fArrayBuffer)); |
+ } |
+ } else { |
+ if (fProgramCache) { |
+ fProgramCache->abandon(); |
+ } |
+ } |
+ |
+ delete fProgramCache; |
+ fProgramCache = nullptr; |
+ |
fHWProgramID = 0; |
fTempSrcFBOID = 0; |
fTempDstFBOID = 0; |
@@ -399,8 +441,10 @@ void GrGLGpu::contextAbandoned() { |
} |
fWireRectProgram.fProgram = 0; |
fWireRectArrayBuffer = 0; |
+ fPLSSetupProgram.fProgram = 0; |
+ fPLSSetupProgram.fArrayBuffer = 0; |
if (this->glCaps().shaderCaps()->pathRenderingSupport()) { |
- this->glPathRendering()->abandonGpuResources(); |
+ this->glPathRendering()->disconnect(type); |
} |
} |