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 "GrBackendSurface.h"
10#include "GrContext.h"
11#include "GLWindowContext.h"
12
13#include "gl/GrGLDefines.h"
14#include "gl/GrGLUtil.h"
15
16#include "SkCanvas.h"
17#include "SkImage_Base.h"
18#include "SkMathPriv.h"
19#include "SkSurface.h"
20
21namespace sk_app {
22
23GLWindowContext::GLWindowContext(const DisplayParams& params)
24    : WindowContext(params)
25    , fBackendContext(nullptr)
26    , fSurface(nullptr) {
27    fDisplayParams.fMSAASampleCount = fDisplayParams.fMSAASampleCount ?
28                                      GrNextPow2(fDisplayParams.fMSAASampleCount) :
29                                      0;
30}
31
32void GLWindowContext::initializeContext() {
33    this->onInitializeContext();
34    SkASSERT(nullptr == fContext);
35
36    fBackendContext.reset(GrGLCreateNativeInterface());
37    fContext = GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)fBackendContext.get(),
38                                 fDisplayParams.fGrContextOptions);
39    if (!fContext && fDisplayParams.fMSAASampleCount) {
40        fDisplayParams.fMSAASampleCount /= 2;
41        this->initializeContext();
42        return;
43    }
44
45    if (fContext) {
46        // We may not have real sRGB support (ANGLE, in particular), so check for
47        // that, and fall back to L32:
48        fPixelConfig = fContext->caps()->srgbSupport() && fDisplayParams.fColorSpace
49                       ? kSRGBA_8888_GrPixelConfig : kRGBA_8888_GrPixelConfig;
50    } else {
51        fPixelConfig = kUnknown_GrPixelConfig;
52    }
53}
54
55void GLWindowContext::destroyContext() {
56    fSurface.reset(nullptr);
57
58    if (fContext) {
59        // in case we have outstanding refs to this guy (lua?)
60        fContext->abandonContext();
61        fContext->unref();
62        fContext = nullptr;
63    }
64
65    fBackendContext.reset(nullptr);
66
67    this->onDestroyContext();
68}
69
70sk_sp<SkSurface> GLWindowContext::getBackbufferSurface() {
71    if (nullptr == fSurface) {
72        if (fContext) {
73            GrGLFramebufferInfo fbInfo;
74            GrGLint buffer;
75            GR_GL_CALL(fBackendContext.get(), GetIntegerv(GR_GL_FRAMEBUFFER_BINDING,
76                                                          &buffer));
77            fbInfo.fFBOID = buffer;
78
79            GrBackendRenderTarget backendRT(fWidth,
80                                            fHeight,
81                                            fSampleCount,
82                                            fStencilBits,
83                                            fPixelConfig,
84                                            fbInfo);
85
86            fSurface = SkSurface::MakeFromBackendRenderTarget(fContext, backendRT,
87                                                              kBottomLeft_GrSurfaceOrigin,
88                                                              fDisplayParams.fColorSpace,
89                                                              &fSurfaceProps);
90        }
91    }
92
93    return fSurface;
94}
95
96void GLWindowContext::swapBuffers() {
97    this->onSwapBuffers();
98}
99
100void GLWindowContext::resize(int  w, int h) {
101    this->destroyContext();
102    this->initializeContext();
103}
104
105void GLWindowContext::setDisplayParams(const DisplayParams& params) {
106    this->destroyContext();
107    fDisplayParams = params;
108    this->initializeContext();
109}
110
111}   //namespace sk_app
112