/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GLWindowContext.h" #include "GrBackendSurface.h" #include "GrCaps.h" #include "GrContext.h" #include "GrContextPriv.h" #include "SkCanvas.h" #include "SkImage_Base.h" #include "SkMathPriv.h" #include "SkSurface.h" #include "gl/GrGLDefines.h" #include "gl/GrGLUtil.h" namespace sk_app { GLWindowContext::GLWindowContext(const DisplayParams& params) : WindowContext(params) , fBackendContext(nullptr) , fSurface(nullptr) { fDisplayParams.fMSAASampleCount = GrNextPow2(fDisplayParams.fMSAASampleCount); } void GLWindowContext::initializeContext() { SkASSERT(!fContext); fBackendContext = this->onInitializeContext(); fContext = GrContext::MakeGL(fBackendContext, fDisplayParams.fGrContextOptions); if (!fContext && fDisplayParams.fMSAASampleCount > 1) { fDisplayParams.fMSAASampleCount /= 2; this->initializeContext(); return; } } void GLWindowContext::destroyContext() { fSurface.reset(nullptr); if (fContext) { // in case we have outstanding refs to this guy (lua?) fContext->abandonContext(); fContext.reset(); } fBackendContext.reset(nullptr); this->onDestroyContext(); } sk_sp GLWindowContext::getBackbufferSurface() { if (nullptr == fSurface) { if (fContext) { GrGLFramebufferInfo fbInfo; GrGLint buffer; GR_GL_CALL(fBackendContext.get(), GetIntegerv(GR_GL_FRAMEBUFFER_BINDING, &buffer)); fbInfo.fFBOID = buffer; fbInfo.fFormat = fContext->contextPriv().caps()->srgbSupport() && fDisplayParams.fColorSpace ? GR_GL_SRGB8_ALPHA8 : GR_GL_RGBA8; GrBackendRenderTarget backendRT(fWidth, fHeight, fSampleCount, fStencilBits, fbInfo); fSurface = SkSurface::MakeFromBackendRenderTarget(fContext.get(), backendRT, kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, fDisplayParams.fColorSpace, &fDisplayParams.fSurfaceProps); } } return fSurface; } void GLWindowContext::swapBuffers() { this->onSwapBuffers(); } void GLWindowContext::resize(int w, int h) { this->destroyContext(); this->initializeContext(); } void GLWindowContext::setDisplayParams(const DisplayParams& params) { this->destroyContext(); fDisplayParams = params; this->initializeContext(); } } //namespace sk_app