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