1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc.
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrBackendSurface.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrContext.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GLWindowContext.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gl/GrGLDefines.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gl/GrGLUtil.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage_Base.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkMathPriv.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurface.h"
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace sk_app {
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGLWindowContext::GLWindowContext(const DisplayParams& params)
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    : WindowContext(params)
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    , fBackendContext(nullptr)
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    , fSurface(nullptr) {
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fDisplayParams.fMSAASampleCount = GrNextPow2(fDisplayParams.fMSAASampleCount);
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GLWindowContext::initializeContext() {
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkASSERT(!fContext);
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fBackendContext = this->onInitializeContext();
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fContext = GrContext::MakeGL(fBackendContext, fDisplayParams.fGrContextOptions);
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!fContext && fDisplayParams.fMSAASampleCount > 1) {
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fDisplayParams.fMSAASampleCount /= 2;
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->initializeContext();
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return;
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GLWindowContext::destroyContext() {
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fSurface.reset(nullptr);
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (fContext) {
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // in case we have outstanding refs to this guy (lua?)
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fContext->abandonContext();
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fContext.reset();
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fBackendContext.reset(nullptr);
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->onDestroyContext();
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkSurface> GLWindowContext::getBackbufferSurface() {
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (nullptr == fSurface) {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fContext) {
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            GrGLFramebufferInfo fbInfo;
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            GrGLint buffer;
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            GR_GL_CALL(fBackendContext.get(), GetIntegerv(GR_GL_FRAMEBUFFER_BINDING,
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                          &buffer));
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fbInfo.fFBOID = buffer;
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fbInfo.fFormat = fContext->caps()->srgbSupport() && fDisplayParams.fColorSpace
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                             ? GR_GL_SRGB8_ALPHA8 : GR_GL_RGBA8;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            GrBackendRenderTarget backendRT(fWidth,
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            fHeight,
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            fSampleCount,
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            fStencilBits,
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            fbInfo);
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fSurface = SkSurface::MakeFromBackendRenderTarget(fContext.get(), backendRT,
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                              kBottomLeft_GrSurfaceOrigin,
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                              kRGBA_8888_SkColorType,
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                              fDisplayParams.fColorSpace,
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                              &fSurfaceProps);
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return fSurface;
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GLWindowContext::swapBuffers() {
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->onSwapBuffers();
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GLWindowContext::resize(int  w, int h) {
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->destroyContext();
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->initializeContext();
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GLWindowContext::setDisplayParams(const DisplayParams& params) {
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->destroyContext();
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fDisplayParams = params;
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->initializeContext();
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}   //namespace sk_app
100