chudy@google.com | ea5488b | 2012-07-26 19:38:22 +0000 | [diff] [blame] | 1 | |
| 2 | /* |
| 3 | * Copyright 2012 Google Inc. |
| 4 | * |
| 5 | * Use of this source code is governed by a BSD-style license that can be |
| 6 | * found in the LICENSE file. |
| 7 | */ |
| 8 | |
| 9 | |
| 10 | #include "SkGLWidget.h" |
| 11 | |
robertphillips@google.com | e8fe4bc | 2013-02-13 13:26:13 +0000 | [diff] [blame] | 12 | #if SK_SUPPORT_GPU |
| 13 | |
chudy@google.com | 607357f | 2012-08-07 16:12:23 +0000 | [diff] [blame] | 14 | SkGLWidget::SkGLWidget(SkDebugger* debugger) : QGLWidget() { |
chudy@google.com | 607357f | 2012-08-07 16:12:23 +0000 | [diff] [blame] | 15 | fDebugger = debugger; |
chudy@google.com | ea5488b | 2012-07-26 19:38:22 +0000 | [diff] [blame] | 16 | } |
| 17 | |
| 18 | SkGLWidget::~SkGLWidget() { |
chudy@google.com | ea5488b | 2012-07-26 19:38:22 +0000 | [diff] [blame] | 19 | } |
| 20 | |
kkinnunen | 4be0238 | 2014-12-22 06:06:41 -0800 | [diff] [blame^] | 21 | void SkGLWidget::setSampleCount(int sampleCount) { |
commit-bot@chromium.org | fde1e7c | 2013-08-02 13:59:50 +0000 | [diff] [blame] | 22 | QGLFormat currentFormat = format(); |
| 23 | currentFormat.setSampleBuffers(sampleCount > 0); |
| 24 | currentFormat.setSamples(sampleCount); |
| 25 | setFormat(currentFormat); |
| 26 | } |
| 27 | |
chudy@google.com | ea5488b | 2012-07-26 19:38:22 +0000 | [diff] [blame] | 28 | void SkGLWidget::initializeGL() { |
kkinnunen | 4be0238 | 2014-12-22 06:06:41 -0800 | [diff] [blame^] | 29 | if (!fCurIntf) { |
| 30 | fCurIntf.reset(GrGLCreateNativeInterface()); |
| 31 | } |
bungeman@google.com | 0b4d6b2 | 2013-07-01 13:54:10 +0000 | [diff] [blame] | 32 | if (!fCurIntf) { |
| 33 | return; |
| 34 | } |
kkinnunen | 4be0238 | 2014-12-22 06:06:41 -0800 | [diff] [blame^] | 35 | if (!fCurContext) { |
| 36 | fCurContext.reset(GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf.get())); |
| 37 | } |
| 38 | if (!fCurContext) { |
| 39 | return; |
| 40 | } |
| 41 | |
| 42 | // The call may come multiple times, for example after setSampleCount(). The QGLContext will be |
| 43 | // different, but we do not have a mechanism to catch the destroying of QGLContext, so that |
| 44 | // proper resource cleanup could be made. Instead, we assume that the underlying GL context |
| 45 | // never actually changes. If it would, we could not destroy the resources. |
| 46 | fGpuDevice.reset(NULL); |
| 47 | fCanvas.reset(NULL); |
| 48 | } |
| 49 | |
| 50 | void SkGLWidget::createRenderTarget() { |
| 51 | if (!fCurContext) { |
| 52 | return; |
| 53 | } |
| 54 | |
| 55 | glDisable(GL_SCISSOR_TEST); |
commit-bot@chromium.org | fae599b | 2014-03-10 16:04:47 +0000 | [diff] [blame] | 56 | glStencilMask(0xffffffff); |
| 57 | glClearStencil(0); |
| 58 | glClear(GL_STENCIL_BUFFER_BIT); |
kkinnunen | 4be0238 | 2014-12-22 06:06:41 -0800 | [diff] [blame^] | 59 | fCurContext->resetContext(); |
commit-bot@chromium.org | fae599b | 2014-03-10 16:04:47 +0000 | [diff] [blame] | 60 | |
kkinnunen | 4be0238 | 2014-12-22 06:06:41 -0800 | [diff] [blame^] | 61 | fGpuDevice.reset(NULL); |
| 62 | fCanvas.reset(NULL); |
| 63 | |
bsalomon@google.com | 16e3dde | 2012-10-25 18:43:28 +0000 | [diff] [blame] | 64 | GrBackendRenderTargetDesc desc = this->getDesc(this->width(), this->height()); |
robertphillips@google.com | 6577cd3 | 2013-02-08 21:22:09 +0000 | [diff] [blame] | 65 | desc.fOrigin = kBottomLeft_GrSurfaceOrigin; |
kkinnunen | 4be0238 | 2014-12-22 06:06:41 -0800 | [diff] [blame^] | 66 | SkAutoTUnref<GrRenderTarget> curRenderTarget(fCurContext->wrapBackendRenderTarget(desc)); |
| 67 | fGpuDevice.reset(SkGpuDevice::Create(curRenderTarget.get(), |
| 68 | SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType))); |
| 69 | fCanvas.reset(new SkCanvas(fGpuDevice)); |
chudy@google.com | ea5488b | 2012-07-26 19:38:22 +0000 | [diff] [blame] | 70 | } |
| 71 | |
| 72 | void SkGLWidget::resizeGL(int w, int h) { |
kkinnunen | 4be0238 | 2014-12-22 06:06:41 -0800 | [diff] [blame^] | 73 | SkASSERT(w == this->width() && h == this->height()); |
| 74 | this->createRenderTarget(); |
robertphillips | a8d7f0b | 2014-08-29 08:03:56 -0700 | [diff] [blame] | 75 | fDebugger->setWindowSize(w, h); |
chudy@google.com | 607357f | 2012-08-07 16:12:23 +0000 | [diff] [blame] | 76 | draw(); |
chudy@google.com | ea5488b | 2012-07-26 19:38:22 +0000 | [diff] [blame] | 77 | } |
| 78 | |
| 79 | void SkGLWidget::paintGL() { |
bungeman@google.com | 0b4d6b2 | 2013-07-01 13:54:10 +0000 | [diff] [blame] | 80 | if (!this->isHidden() && fCanvas) { |
kkinnunen | 4be0238 | 2014-12-22 06:06:41 -0800 | [diff] [blame^] | 81 | fDebugger->draw(fCanvas.get()); |
chudy@google.com | 607357f | 2012-08-07 16:12:23 +0000 | [diff] [blame] | 82 | // TODO(chudy): Implement an optional flush button in Gui. |
| 83 | fCanvas->flush(); |
| 84 | emit drawComplete(); |
| 85 | } |
chudy@google.com | ea5488b | 2012-07-26 19:38:22 +0000 | [diff] [blame] | 86 | } |
| 87 | |
bsalomon@google.com | 16e3dde | 2012-10-25 18:43:28 +0000 | [diff] [blame] | 88 | GrBackendRenderTargetDesc SkGLWidget::getDesc(int w, int h) { |
| 89 | GrBackendRenderTargetDesc desc; |
reed@google.com | e1ca705 | 2013-12-17 19:22:07 +0000 | [diff] [blame] | 90 | desc.fWidth = SkScalarRoundToInt(this->width()); |
| 91 | desc.fHeight = SkScalarRoundToInt(this->height()); |
bsalomon@google.com | fec0bc3 | 2013-02-07 14:43:04 +0000 | [diff] [blame] | 92 | desc.fConfig = kSkia8888_GrPixelConfig; |
chudy@google.com | ea5488b | 2012-07-26 19:38:22 +0000 | [diff] [blame] | 93 | GR_GL_GetIntegerv(fCurIntf, GR_GL_SAMPLES, &desc.fSampleCnt); |
| 94 | GR_GL_GetIntegerv(fCurIntf, GR_GL_STENCIL_BITS, &desc.fStencilBits); |
| 95 | GrGLint buffer; |
| 96 | GR_GL_GetIntegerv(fCurIntf, GR_GL_FRAMEBUFFER_BINDING, &buffer); |
| 97 | desc.fRenderTargetHandle = buffer; |
| 98 | |
| 99 | return desc; |
| 100 | } |
robertphillips@google.com | e8fe4bc | 2013-02-13 13:26:13 +0000 | [diff] [blame] | 101 | |
| 102 | #endif |