| 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();
|
|
|