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
12 #if SK_SUPPORT_GPU
13
SkGLWidget(SkDebugger * debugger)14 SkGLWidget::SkGLWidget(SkDebugger* debugger) : QGLWidget() {
15 fDebugger = debugger;
16 fCurIntf = NULL;
17 fCurContext = NULL;
18 fGpuDevice = NULL;
19 fCanvas = NULL;
20 }
21
~SkGLWidget()22 SkGLWidget::~SkGLWidget() {
23 SkSafeUnref(fCurIntf);
24 SkSafeUnref(fCurContext);
25 SkSafeUnref(fGpuDevice);
26 SkSafeUnref(fCanvas);
27 }
28
setSampleCount(int sampleCount)29 void SkGLWidget::setSampleCount(int sampleCount)
30 {
31 QGLFormat currentFormat = format();
32 currentFormat.setSampleBuffers(sampleCount > 0);
33 currentFormat.setSamples(sampleCount);
34 setFormat(currentFormat);
35 }
36
initializeGL()37 void SkGLWidget::initializeGL() {
38 fCurIntf = GrGLCreateNativeInterface();
39 if (!fCurIntf) {
40 return;
41 }
42 glStencilMask(0xffffffff);
43 glClearStencil(0);
44 glClear(GL_STENCIL_BUFFER_BIT);
45
46 fCurContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext) fCurIntf);
47 GrBackendRenderTargetDesc desc = this->getDesc(this->width(), this->height());
48 desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
49 GrRenderTarget* curRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
50 fGpuDevice = new SkGpuDevice(fCurContext, curRenderTarget);
51 fCanvas = new SkCanvas(fGpuDevice);
52 curRenderTarget->unref();
53 }
54
resizeGL(int w,int h)55 void SkGLWidget::resizeGL(int w, int h) {
56 if (fCurContext) {
57 glDisable(GL_SCISSOR_TEST);
58 glStencilMask(0xffffffff);
59 glClearStencil(0);
60 glClear(GL_STENCIL_BUFFER_BIT);
61 fCurContext->resetContext();
62
63 GrBackendRenderTargetDesc desc = this->getDesc(w, h);
64 desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
65 GrRenderTarget* curRenderTarget = fCurContext->wrapBackendRenderTarget(desc);
66 SkSafeUnref(fGpuDevice);
67 SkSafeUnref(fCanvas);
68 fGpuDevice = new SkGpuDevice(fCurContext, curRenderTarget);
69 fCanvas = new SkCanvas(fGpuDevice);
70 }
71 fDebugger->resize(w, h);
72 draw();
73 }
74
paintGL()75 void SkGLWidget::paintGL() {
76 if (!this->isHidden() && fCanvas) {
77 fDebugger->draw(fCanvas);
78 // TODO(chudy): Implement an optional flush button in Gui.
79 fCanvas->flush();
80 emit drawComplete();
81 }
82 }
83
getDesc(int w,int h)84 GrBackendRenderTargetDesc SkGLWidget::getDesc(int w, int h) {
85 GrBackendRenderTargetDesc desc;
86 desc.fWidth = SkScalarRoundToInt(this->width());
87 desc.fHeight = SkScalarRoundToInt(this->height());
88 desc.fConfig = kSkia8888_GrPixelConfig;
89 GR_GL_GetIntegerv(fCurIntf, GR_GL_SAMPLES, &desc.fSampleCnt);
90 GR_GL_GetIntegerv(fCurIntf, GR_GL_STENCIL_BITS, &desc.fStencilBits);
91 GrGLint buffer;
92 GR_GL_GetIntegerv(fCurIntf, GR_GL_FRAMEBUFFER_BINDING, &buffer);
93 desc.fRenderTargetHandle = buffer;
94
95 return desc;
96 }
97
98 #endif
99