• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2015 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 #include "include/core/SkCanvas.h"
10 #include "include/core/SkSurface.h"
11 #include "include/gpu/GrBackendSurface.h"
12 #include "include/gpu/GrContext.h"
13 #include "src/core/SkMathPriv.h"
14 #include "src/gpu/GrCaps.h"
15 #include "src/gpu/GrContextPriv.h"
16 #include "src/gpu/gl/GrGLDefines.h"
17 #include "src/gpu/gl/GrGLUtil.h"
18 #include "src/image/SkImage_Base.h"
19 #include "tools/sk_app/GLWindowContext.h"
20 
21 namespace sk_app {
22 
GLWindowContext(const DisplayParams & params)23 GLWindowContext::GLWindowContext(const DisplayParams& params)
24     : WindowContext(params)
25     , fBackendContext(nullptr)
26     , fSurface(nullptr) {
27     fDisplayParams.fMSAASampleCount = GrNextPow2(fDisplayParams.fMSAASampleCount);
28 }
29 
initializeContext()30 void GLWindowContext::initializeContext() {
31     SkASSERT(!fContext);
32 
33     fBackendContext = this->onInitializeContext();
34     fContext = GrContext::MakeGL(fBackendContext, fDisplayParams.fGrContextOptions);
35     if (!fContext && fDisplayParams.fMSAASampleCount > 1) {
36         fDisplayParams.fMSAASampleCount /= 2;
37         this->initializeContext();
38         return;
39     }
40 }
41 
destroyContext()42 void GLWindowContext::destroyContext() {
43     fSurface.reset(nullptr);
44 
45     if (fContext) {
46         // in case we have outstanding refs to this guy (lua?)
47         fContext->abandonContext();
48         fContext.reset();
49     }
50 
51     fBackendContext.reset(nullptr);
52 
53     this->onDestroyContext();
54 }
55 
getBackbufferSurface()56 sk_sp<SkSurface> GLWindowContext::getBackbufferSurface() {
57     if (nullptr == fSurface) {
58         if (fContext) {
59             GrGLint buffer;
60             GR_GL_CALL(fBackendContext.get(), GetIntegerv(GR_GL_FRAMEBUFFER_BINDING, &buffer));
61 
62             GrGLFramebufferInfo fbInfo;
63             fbInfo.fFBOID = buffer;
64             fbInfo.fFormat = GR_GL_RGBA8;
65 
66             GrBackendRenderTarget backendRT(fWidth,
67                                             fHeight,
68                                             fSampleCount,
69                                             fStencilBits,
70                                             fbInfo);
71 
72             fSurface = SkSurface::MakeFromBackendRenderTarget(fContext.get(), backendRT,
73                                                               kBottomLeft_GrSurfaceOrigin,
74                                                               kRGBA_8888_SkColorType,
75                                                               fDisplayParams.fColorSpace,
76                                                               &fDisplayParams.fSurfaceProps);
77         }
78     }
79 
80     return fSurface;
81 }
82 
swapBuffers()83 void GLWindowContext::swapBuffers() {
84     this->onSwapBuffers();
85 }
86 
resize(int w,int h)87 void GLWindowContext::resize(int w, int h) {
88     this->destroyContext();
89     this->initializeContext();
90 }
91 
setDisplayParams(const DisplayParams & params)92 void GLWindowContext::setDisplayParams(const DisplayParams& params) {
93     fDisplayParams = params;
94     this->destroyContext();
95     this->initializeContext();
96 }
97 
98 }   //namespace sk_app
99