blob: 7b2a9186a9460316faf38a7345cd7b119a7650e7 [file] [log] [blame]
chudy@google.comea5488b2012-07-26 19:38:22 +00001
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.come8fe4bc2013-02-13 13:26:13 +000012#if SK_SUPPORT_GPU
13
chudy@google.com607357f2012-08-07 16:12:23 +000014SkGLWidget::SkGLWidget(SkDebugger* debugger) : QGLWidget() {
chudy@google.com607357f2012-08-07 16:12:23 +000015 fDebugger = debugger;
chudy@google.comea5488b2012-07-26 19:38:22 +000016}
17
18SkGLWidget::~SkGLWidget() {
chudy@google.comea5488b2012-07-26 19:38:22 +000019}
20
kkinnunen4be02382014-12-22 06:06:41 -080021void SkGLWidget::setSampleCount(int sampleCount) {
commit-bot@chromium.orgfde1e7c2013-08-02 13:59:50 +000022 QGLFormat currentFormat = format();
23 currentFormat.setSampleBuffers(sampleCount > 0);
24 currentFormat.setSamples(sampleCount);
25 setFormat(currentFormat);
26}
27
chudy@google.comea5488b2012-07-26 19:38:22 +000028void SkGLWidget::initializeGL() {
kkinnunen4be02382014-12-22 06:06:41 -080029 if (!fCurIntf) {
30 fCurIntf.reset(GrGLCreateNativeInterface());
31 }
bungeman@google.com0b4d6b22013-07-01 13:54:10 +000032 if (!fCurIntf) {
33 return;
34 }
kkinnunen4be02382014-12-22 06:06:41 -080035 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
50void SkGLWidget::createRenderTarget() {
51 if (!fCurContext) {
52 return;
53 }
54
55 glDisable(GL_SCISSOR_TEST);
commit-bot@chromium.orgfae599b2014-03-10 16:04:47 +000056 glStencilMask(0xffffffff);
57 glClearStencil(0);
58 glClear(GL_STENCIL_BUFFER_BIT);
kkinnunen4be02382014-12-22 06:06:41 -080059 fCurContext->resetContext();
commit-bot@chromium.orgfae599b2014-03-10 16:04:47 +000060
kkinnunen4be02382014-12-22 06:06:41 -080061 fGpuDevice.reset(NULL);
62 fCanvas.reset(NULL);
63
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000064 GrBackendRenderTargetDesc desc = this->getDesc(this->width(), this->height());
robertphillips@google.com6577cd32013-02-08 21:22:09 +000065 desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
kkinnunen4be02382014-12-22 06:06:41 -080066 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.comea5488b2012-07-26 19:38:22 +000070}
71
72void SkGLWidget::resizeGL(int w, int h) {
kkinnunen4be02382014-12-22 06:06:41 -080073 SkASSERT(w == this->width() && h == this->height());
74 this->createRenderTarget();
robertphillipsa8d7f0b2014-08-29 08:03:56 -070075 fDebugger->setWindowSize(w, h);
chudy@google.com607357f2012-08-07 16:12:23 +000076 draw();
chudy@google.comea5488b2012-07-26 19:38:22 +000077}
78
79void SkGLWidget::paintGL() {
bungeman@google.com0b4d6b22013-07-01 13:54:10 +000080 if (!this->isHidden() && fCanvas) {
kkinnunen4be02382014-12-22 06:06:41 -080081 fDebugger->draw(fCanvas.get());
chudy@google.com607357f2012-08-07 16:12:23 +000082 // TODO(chudy): Implement an optional flush button in Gui.
83 fCanvas->flush();
84 emit drawComplete();
85 }
chudy@google.comea5488b2012-07-26 19:38:22 +000086}
87
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000088GrBackendRenderTargetDesc SkGLWidget::getDesc(int w, int h) {
89 GrBackendRenderTargetDesc desc;
reed@google.come1ca7052013-12-17 19:22:07 +000090 desc.fWidth = SkScalarRoundToInt(this->width());
91 desc.fHeight = SkScalarRoundToInt(this->height());
bsalomon@google.comfec0bc32013-02-07 14:43:04 +000092 desc.fConfig = kSkia8888_GrPixelConfig;
chudy@google.comea5488b2012-07-26 19:38:22 +000093 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.come8fe4bc2013-02-13 13:26:13 +0000101
102#endif