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

Unified Diff: debugger/QT/SkGLWidget.cpp

Issue 817243002: Avoid leaking render targets in debugger (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years 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
« no previous file with comments | « debugger/QT/SkGLWidget.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: debugger/QT/SkGLWidget.cpp
diff --git a/debugger/QT/SkGLWidget.cpp b/debugger/QT/SkGLWidget.cpp
index bd24d4e3cbcc85617b6974d1fd6444fb077e2dd5..7b2a9186a9460316faf38a7345cd7b119a7650e7 100644
--- a/debugger/QT/SkGLWidget.cpp
+++ b/debugger/QT/SkGLWidget.cpp
@@ -13,21 +13,12 @@
SkGLWidget::SkGLWidget(SkDebugger* debugger) : QGLWidget() {
fDebugger = debugger;
- fCurIntf = NULL;
- fCurContext = NULL;
- fGpuDevice = NULL;
- fCanvas = NULL;
}
SkGLWidget::~SkGLWidget() {
- SkSafeUnref(fCurIntf);
- SkSafeUnref(fCurContext);
- SkSafeUnref(fGpuDevice);
- SkSafeUnref(fCanvas);
}
-void SkGLWidget::setSampleCount(int sampleCount)
-{
+void SkGLWidget::setSampleCount(int sampleCount) {
QGLFormat currentFormat = format();
currentFormat.setSampleBuffers(sampleCount > 0);
currentFormat.setSamples(sampleCount);
@@ -35,48 +26,59 @@ void SkGLWidget::setSampleCount(int sampleCount)
}
void SkGLWidget::initializeGL() {
- fCurIntf = GrGLCreateNativeInterface();
+ if (!fCurIntf) {
+ fCurIntf.reset(GrGLCreateNativeInterface());
+ }
if (!fCurIntf) {
return;
}
+ if (!fCurContext) {
+ fCurContext.reset(GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf.get()));
+ }
+ if (!fCurContext) {
+ return;
+ }
+
+ // The call may come multiple times, for example after setSampleCount(). The QGLContext will be
+ // different, but we do not have a mechanism to catch the destroying of QGLContext, so that
+ // proper resource cleanup could be made. Instead, we assume that the underlying GL context
+ // never actually changes. If it would, we could not destroy the resources.
+ fGpuDevice.reset(NULL);
+ fCanvas.reset(NULL);
+}
+
+void SkGLWidget::createRenderTarget() {
+ if (!fCurContext) {
+ return;
+ }
+
+ glDisable(GL_SCISSOR_TEST);
glStencilMask(0xffffffff);
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
+ fCurContext->resetContext();
+
+ fGpuDevice.reset(NULL);
+ fCanvas.reset(NULL);
- fCurContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf);
GrBackendRenderTargetDesc desc = this->getDesc(this->width(), this->height());
desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
- GrRenderTarget* curRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
- fGpuDevice = SkGpuDevice::Create(curRenderTarget,
- SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType));
- fCanvas = new SkCanvas(fGpuDevice);
- curRenderTarget->unref();
+ SkAutoTUnref<GrRenderTarget> curRenderTarget(fCurContext->wrapBackendRenderTarget(desc));
+ fGpuDevice.reset(SkGpuDevice::Create(curRenderTarget.get(),
+ SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType)));
+ fCanvas.reset(new SkCanvas(fGpuDevice));
}
void SkGLWidget::resizeGL(int w, int h) {
- if (fCurContext) {
- glDisable(GL_SCISSOR_TEST);
- glStencilMask(0xffffffff);
- glClearStencil(0);
- glClear(GL_STENCIL_BUFFER_BIT);
- fCurContext->resetContext();
-
- GrBackendRenderTargetDesc desc = this->getDesc(w, h);
- desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
- GrRenderTarget* curRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
- SkSafeUnref(fGpuDevice);
- SkSafeUnref(fCanvas);
- fGpuDevice = SkGpuDevice::Create(curRenderTarget,
- SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType));
- fCanvas = new SkCanvas(fGpuDevice);
- }
+ SkASSERT(w == this->width() && h == this->height());
+ this->createRenderTarget();
fDebugger->setWindowSize(w, h);
draw();
}
void SkGLWidget::paintGL() {
if (!this->isHidden() && fCanvas) {
- fDebugger->draw(fCanvas);
+ fDebugger->draw(fCanvas.get());
// TODO(chudy): Implement an optional flush button in Gui.
fCanvas->flush();
emit drawComplete();
« no previous file with comments | « debugger/QT/SkGLWidget.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698