• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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