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 }
17
~SkGLWidget()18 SkGLWidget::~SkGLWidget() {
19 }
20
setSampleCount(int sampleCount)21 void SkGLWidget::setSampleCount(int sampleCount) {
22 QGLFormat currentFormat = format();
23 currentFormat.setSampleBuffers(sampleCount > 1);
24 currentFormat.setSamples(sampleCount);
25 setFormat(currentFormat);
26 }
27
initializeGL()28 void SkGLWidget::initializeGL() {
29 if (!fCurIntf) {
30 fCurIntf = GrGLMakeNativeInterface();
31 }
32 if (!fCurIntf) {
33 return;
34 }
35 // 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
37 // proper resource cleanup could be made.
38 if (fCurContext) {
39 fCurContext->abandonContext();
40 }
41
42 fGpuSurface = nullptr;
43 fCanvas = nullptr;
44
45 fCurContext = GrContext::MakeGL(fCurIntf.get());
46 }
47
createRenderTarget()48 void SkGLWidget::createRenderTarget() {
49 if (!fCurContext) {
50 return;
51 }
52
53 glDisable(GL_SCISSOR_TEST);
54 glStencilMask(0xffffffff);
55 glClearStencil(0);
56 glClear(GL_STENCIL_BUFFER_BIT);
57 fCurContext->resetContext();
58 GrBackendRenderTarget backendRenderTarget = this->getBackendRenderTarget();
59 SkColorType colorType;
60 if (kRGBA_8888_GrPixelConfig == kSkia8888_GrPixelConfig) {
61 colorType = kRGBA_8888_SkColorType;
62 } else {
63 colorType = kBGRA_8888_SkColorType;
64 }
65 fGpuSurface = SkSurface::MakeFromBackendRenderTarget(fCurContext.get(), backendRenderTarget,
66 kBottomLeft_GrSurfaceOrigin, colorType,
67 nullptr, nullptr);
68 fCanvas = fGpuSurface->getCanvas();
69 }
70
resizeGL(int w,int h)71 void SkGLWidget::resizeGL(int w, int h) {
72 SkASSERT(w == this->width() && h == this->height());
73 this->createRenderTarget();
74 }
75
paintGL()76 void SkGLWidget::paintGL() {
77 if (!this->isHidden() && fCanvas) {
78 fCurContext->resetContext();
79 fDebugger->draw(fCanvas);
80 // TODO(chudy): Implement an optional flush button in Gui.
81 fCanvas->flush();
82 Q_EMIT drawComplete();
83 }
84 }
85
getBackendRenderTarget()86 GrBackendRenderTarget SkGLWidget::getBackendRenderTarget() {
87 GrGLFramebufferInfo info;
88 int stencilBits;
89 int sampleCnt;
90 GR_GL_GetIntegerv(fCurIntf.get(), GR_GL_FRAMEBUFFER_BINDING, &info.fFBOID);
91 GR_GL_GetIntegerv(fCurIntf.get(), GR_GL_SAMPLES, &sampleCnt);
92 sampleCnt = SkTMax(sampleCnt, 1);
93 GR_GL_GetIntegerv(fCurIntf.get(), GR_GL_STENCIL_BITS, &stencilBits);
94 // We are on desktop so we assume the internal config is RGBA
95 info.fFormat = GR_GL_RGBA8;
96 return GrBackendRenderTarget(SkScalarRoundToInt(this->width()),
97 SkScalarRoundToInt(this->height()),
98 sampleCnt,
99 stencilBits,
100 info);
101 }
102
103 #endif
104