blob: cd9350a394e8774bf6ed3629846114066c678cd2 [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 // The call may come multiple times, for example after setSampleCount(). The QGLContext will be
36 // different, but we do not have a mechanism to catch the destroying of QGLContext, so that
kkinnunen9e33d1d2015-02-10 22:27:48 -080037 // proper resource cleanup could be made.
38 if (fCurContext) {
39 fCurContext->abandonContext();
40 }
kkinnunen4be02382014-12-22 06:06:41 -080041 fGpuDevice.reset(NULL);
42 fCanvas.reset(NULL);
kkinnunen9e33d1d2015-02-10 22:27:48 -080043
44 fCurContext.reset(GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf.get()));
kkinnunen4be02382014-12-22 06:06:41 -080045}
46
47void SkGLWidget::createRenderTarget() {
48 if (!fCurContext) {
49 return;
50 }
51
52 glDisable(GL_SCISSOR_TEST);
commit-bot@chromium.orgfae599b2014-03-10 16:04:47 +000053 glStencilMask(0xffffffff);
54 glClearStencil(0);
55 glClear(GL_STENCIL_BUFFER_BIT);
kkinnunen4be02382014-12-22 06:06:41 -080056 fCurContext->resetContext();
commit-bot@chromium.orgfae599b2014-03-10 16:04:47 +000057
kkinnunen4be02382014-12-22 06:06:41 -080058 fGpuDevice.reset(NULL);
59 fCanvas.reset(NULL);
60
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000061 GrBackendRenderTargetDesc desc = this->getDesc(this->width(), this->height());
robertphillips@google.com6577cd32013-02-08 21:22:09 +000062 desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
robertphillips4e11c0b2015-05-04 10:42:05 -070063 SkAutoTUnref<GrRenderTarget> curRenderTarget(
64 fCurContext->textureProvider()->wrapBackendRenderTarget(desc));
Brian Salomona2d94782015-01-16 14:01:44 -050065 SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType);
66 fGpuDevice.reset(SkGpuDevice::Create(curRenderTarget, &props));
kkinnunen4be02382014-12-22 06:06:41 -080067 fCanvas.reset(new SkCanvas(fGpuDevice));
chudy@google.comea5488b2012-07-26 19:38:22 +000068}
69
70void SkGLWidget::resizeGL(int w, int h) {
kkinnunen4be02382014-12-22 06:06:41 -080071 SkASSERT(w == this->width() && h == this->height());
72 this->createRenderTarget();
chudy@google.comea5488b2012-07-26 19:38:22 +000073}
74
75void SkGLWidget::paintGL() {
bungeman@google.com0b4d6b22013-07-01 13:54:10 +000076 if (!this->isHidden() && fCanvas) {
kkinnunen9e33d1d2015-02-10 22:27:48 -080077 fCurContext->resetContext();
kkinnunen4be02382014-12-22 06:06:41 -080078 fDebugger->draw(fCanvas.get());
chudy@google.com607357f2012-08-07 16:12:23 +000079 // TODO(chudy): Implement an optional flush button in Gui.
80 fCanvas->flush();
81 emit drawComplete();
82 }
chudy@google.comea5488b2012-07-26 19:38:22 +000083}
84
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000085GrBackendRenderTargetDesc SkGLWidget::getDesc(int w, int h) {
86 GrBackendRenderTargetDesc desc;
reed@google.come1ca7052013-12-17 19:22:07 +000087 desc.fWidth = SkScalarRoundToInt(this->width());
88 desc.fHeight = SkScalarRoundToInt(this->height());
bsalomon@google.comfec0bc32013-02-07 14:43:04 +000089 desc.fConfig = kSkia8888_GrPixelConfig;
chudy@google.comea5488b2012-07-26 19:38:22 +000090 GR_GL_GetIntegerv(fCurIntf, GR_GL_SAMPLES, &desc.fSampleCnt);
91 GR_GL_GetIntegerv(fCurIntf, GR_GL_STENCIL_BITS, &desc.fStencilBits);
92 GrGLint buffer;
93 GR_GL_GetIntegerv(fCurIntf, GR_GL_FRAMEBUFFER_BINDING, &buffer);
94 desc.fRenderTargetHandle = buffer;
95
96 return desc;
97}
robertphillips@google.come8fe4bc2013-02-13 13:26:13 +000098
99#endif