gfx/skia/trunk/src/gpu/gl/SkGLContextHelper.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     2 /*
     3  * Copyright 2013 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 #include "gl/SkGLContextHelper.h"
     9 #include "GrGLUtil.h"
    11 SkGLContextHelper::SkGLContextHelper()
    12     : fFBO(0)
    13     , fColorBufferID(0)
    14     , fDepthStencilBufferID(0)
    15     , fGL(NULL) {
    16 }
    18 SkGLContextHelper::~SkGLContextHelper() {
    20     if (fGL) {
    21         // TODO: determine why DeleteFramebuffers is generating a GL error in tests
    22         SK_GL_NOERRCHECK(*this, DeleteFramebuffers(1, &fFBO));
    23         SK_GL_NOERRCHECK(*this, DeleteRenderbuffers(1, &fColorBufferID));
    24         SK_GL_NOERRCHECK(*this, DeleteRenderbuffers(1, &fDepthStencilBufferID));
    25     }
    27     SkSafeUnref(fGL);
    28 }
    30 bool SkGLContextHelper::init(int width, int height) {
    31     if (fGL) {
    32         fGL->unref();
    33         this->destroyGLContext();
    34     }
    36     fGL = this->createGLContext();
    37     if (fGL) {
    38         const GrGLubyte* temp;
    40         if (!fGL->validate()) {
    41             fGL = NULL;
    42             this->destroyGLContext();
    43             return false;
    44         }
    46         SK_GL_RET(*this, temp, GetString(GR_GL_VERSION));
    47         const char* versionStr = reinterpret_cast<const char*>(temp);
    48         GrGLVersion version = GrGLGetVersionFromString(versionStr);
    50         // clear any existing GL erorrs
    51         GrGLenum error;
    52         do {
    53             SK_GL_RET(*this, error, GetError());
    54         } while (GR_GL_NO_ERROR != error);
    56         SK_GL(*this, GenFramebuffers(1, &fFBO));
    57         SK_GL(*this, BindFramebuffer(GR_GL_FRAMEBUFFER, fFBO));
    58         SK_GL(*this, GenRenderbuffers(1, &fColorBufferID));
    59         SK_GL(*this, BindRenderbuffer(GR_GL_RENDERBUFFER, fColorBufferID));
    60         if (kGLES_GrGLStandard == this->gl()->fStandard) {
    61             SK_GL(*this, RenderbufferStorage(GR_GL_RENDERBUFFER,
    62                                              GR_GL_RGBA8,
    63                                              width, height));
    64         } else {
    65             SK_GL(*this, RenderbufferStorage(GR_GL_RENDERBUFFER,
    66                                              GR_GL_RGBA,
    67                                              width, height));
    68         }
    69         SK_GL(*this, FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
    70                                              GR_GL_COLOR_ATTACHMENT0,
    71                                              GR_GL_RENDERBUFFER,
    72                                              fColorBufferID));
    73         SK_GL(*this, GenRenderbuffers(1, &fDepthStencilBufferID));
    74         SK_GL(*this, BindRenderbuffer(GR_GL_RENDERBUFFER, fDepthStencilBufferID));
    76         // Some drivers that support packed depth stencil will only succeed
    77         // in binding a packed format an FBO. However, we can't rely on packed
    78         // depth stencil being available.
    79         bool supportsPackedDepthStencil;
    80         if (kGLES_GrGLStandard == this->gl()->fStandard) {
    81             supportsPackedDepthStencil = version >= GR_GL_VER(3,0) ||
    82                                          this->hasExtension("GL_OES_packed_depth_stencil");
    83         } else {
    84             supportsPackedDepthStencil = version >= GR_GL_VER(3,0) ||
    85                                          this->hasExtension("GL_EXT_packed_depth_stencil") ||
    86                                          this->hasExtension("GL_ARB_framebuffer_object");
    87         }
    89         if (supportsPackedDepthStencil) {
    90             // ES2 requires sized internal formats for RenderbufferStorage
    91             // On Desktop we let the driver decide.
    92             GrGLenum format = kGLES_GrGLStandard == this->gl()->fStandard ?
    93                                     GR_GL_DEPTH24_STENCIL8 :
    94                                     GR_GL_DEPTH_STENCIL;
    95             SK_GL(*this, RenderbufferStorage(GR_GL_RENDERBUFFER,
    96                                              format,
    97                                              width, height));
    98             SK_GL(*this, FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
    99                                                  GR_GL_DEPTH_ATTACHMENT,
   100                                                  GR_GL_RENDERBUFFER,
   101                                                  fDepthStencilBufferID));
   102         } else {
   103             GrGLenum format = kGLES_GrGLStandard == this->gl()->fStandard ? GR_GL_STENCIL_INDEX8 :
   104                                                                           GR_GL_STENCIL_INDEX;
   105             SK_GL(*this, RenderbufferStorage(GR_GL_RENDERBUFFER,
   106                                              format,
   107                                              width, height));
   108         }
   109         SK_GL(*this, FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
   110                                              GR_GL_STENCIL_ATTACHMENT,
   111                                              GR_GL_RENDERBUFFER,
   112                                              fDepthStencilBufferID));
   113         SK_GL(*this, Viewport(0, 0, width, height));
   114         SK_GL(*this, ClearStencil(0));
   115         SK_GL(*this, Clear(GR_GL_STENCIL_BUFFER_BIT));
   117         SK_GL_RET(*this, error, GetError());
   118         GrGLenum status;
   119         SK_GL_RET(*this, status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
   121         if (GR_GL_FRAMEBUFFER_COMPLETE != status ||
   122             GR_GL_NO_ERROR != error) {
   123             fFBO = 0;
   124             fColorBufferID = 0;
   125             fDepthStencilBufferID = 0;
   126             fGL->unref();
   127             fGL = NULL;
   128             this->destroyGLContext();
   129             return false;
   130         } else {
   131             return true;
   132         }
   133     }
   134     return false;
   135 }

mercurial