Home | History | Annotate | Download | only in sk_app
      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 
     21 namespace sk_app {
     22 
     23 GLWindowContext::GLWindowContext(const DisplayParams& params)
     24     : WindowContext(params)
     25     , fBackendContext(nullptr)
     26     , fSurface(nullptr) {
     27     fDisplayParams.fMSAASampleCount = GrNextPow2(fDisplayParams.fMSAASampleCount);
     28 }
     29 
     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 
     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 
     56 sk_sp<SkSurface> GLWindowContext::getBackbufferSurface() {
     57     if (nullptr == fSurface) {
     58         if (fContext) {
     59             GrGLFramebufferInfo fbInfo;
     60             GrGLint buffer;
     61             GR_GL_CALL(fBackendContext.get(), GetIntegerv(GR_GL_FRAMEBUFFER_BINDING,
     62                                                           &buffer));
     63             fbInfo.fFBOID = buffer;
     64             fbInfo.fFormat = fContext->caps()->srgbSupport() && fDisplayParams.fColorSpace
     65                              ? GR_GL_SRGB8_ALPHA8 : GR_GL_RGBA8;
     66 
     67             GrBackendRenderTarget backendRT(fWidth,
     68                                             fHeight,
     69                                             fSampleCount,
     70                                             fStencilBits,
     71                                             fbInfo);
     72 
     73             fSurface = SkSurface::MakeFromBackendRenderTarget(fContext.get(), backendRT,
     74                                                               kBottomLeft_GrSurfaceOrigin,
     75                                                               kRGBA_8888_SkColorType,
     76                                                               fDisplayParams.fColorSpace,
     77                                                               &fSurfaceProps);
     78         }
     79     }
     80 
     81     return fSurface;
     82 }
     83 
     84 void GLWindowContext::swapBuffers() {
     85     this->onSwapBuffers();
     86 }
     87 
     88 void GLWindowContext::resize(int  w, int h) {
     89     this->destroyContext();
     90     this->initializeContext();
     91 }
     92 
     93 void GLWindowContext::setDisplayParams(const DisplayParams& params) {
     94     this->destroyContext();
     95     fDisplayParams = params;
     96     this->initializeContext();
     97 }
     98 
     99 }   //namespace sk_app
    100