gfx/layers/opengl/CompositingRenderTargetOGL.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2  * This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "CompositingRenderTargetOGL.h"
     7 #include "GLContext.h"
     8 #include "GLReadTexImageHelper.h"
     9 #include "mozilla/gfx/2D.h"
    11 using namespace mozilla;
    12 using namespace mozilla::gfx;
    13 using namespace mozilla::gl;
    14 using namespace mozilla::layers;
    16 CompositingRenderTargetOGL::~CompositingRenderTargetOGL()
    17 {
    18   mGL->fDeleteTextures(1, &mTextureHandle);
    19   mGL->fDeleteFramebuffers(1, &mFBO);
    20 }
    22 void
    23 CompositingRenderTargetOGL::BindTexture(GLenum aTextureUnit, GLenum aTextureTarget)
    24 {
    25   MOZ_ASSERT(mInitParams.mStatus == InitParams::INITIALIZED);
    26   MOZ_ASSERT(mTextureHandle != 0);
    27   mGL->fActiveTexture(aTextureUnit);
    28   mGL->fBindTexture(aTextureTarget, mTextureHandle);
    29 }
    31 void
    32 CompositingRenderTargetOGL::BindRenderTarget()
    33 {
    34   if (mInitParams.mStatus != InitParams::INITIALIZED) {
    35     InitializeImpl();
    36   } else {
    37     MOZ_ASSERT(mInitParams.mStatus == InitParams::INITIALIZED);
    38     mGL->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, mFBO);
    39     GLenum result = mGL->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER);
    40     if (result != LOCAL_GL_FRAMEBUFFER_COMPLETE) {
    41       // The main framebuffer (0) of non-offscreen contexts
    42       // might be backed by a EGLSurface that needs to be renewed.
    43       if (mFBO == 0 && !mGL->IsOffscreen()) {
    44         mGL->RenewSurface();
    45         result = mGL->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER);
    46       }
    47       if (result != LOCAL_GL_FRAMEBUFFER_COMPLETE) {
    48         nsAutoCString msg;
    49         msg.AppendPrintf("Framebuffer not complete -- CheckFramebufferStatus returned 0x%x, "
    50                          "GLContext=%p, IsOffscreen()=%d, mFBO=%d, aFBOTextureTarget=0x%x, "
    51                          "aRect.width=%d, aRect.height=%d",
    52                          result, mGL, mGL->IsOffscreen(), mFBO, mInitParams.mFBOTextureTarget,
    53                          mInitParams.mSize.width, mInitParams.mSize.height);
    54         NS_WARNING(msg.get());
    55       }
    56     }
    58     mCompositor->PrepareViewport(mInitParams.mSize, mTransform);
    59   }
    60 }
    62 #ifdef MOZ_DUMP_PAINTING
    63 TemporaryRef<DataSourceSurface>
    64 CompositingRenderTargetOGL::Dump(Compositor* aCompositor)
    65 {
    66   MOZ_ASSERT(mInitParams.mStatus == InitParams::INITIALIZED);
    67   CompositorOGL* compositorOGL = static_cast<CompositorOGL*>(aCompositor);
    68   return ReadBackSurface(mGL, mTextureHandle, true, compositorOGL->GetFBOFormat());
    69 }
    70 #endif
    72 void
    73 CompositingRenderTargetOGL::InitializeImpl()
    74 {
    75   MOZ_ASSERT(mInitParams.mStatus == InitParams::READY);
    77   mGL->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, mFBO);
    78   mGL->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER,
    79                               LOCAL_GL_COLOR_ATTACHMENT0,
    80                               mInitParams.mFBOTextureTarget,
    81                               mTextureHandle,
    82                               0);
    84   // Making this call to fCheckFramebufferStatus prevents a crash on
    85   // PowerVR. See bug 695246.
    86   GLenum result = mGL->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER);
    87   if (result != LOCAL_GL_FRAMEBUFFER_COMPLETE) {
    88     nsAutoCString msg;
    89     msg.AppendPrintf("Framebuffer not complete -- error 0x%x, aFBOTextureTarget 0x%x, mFBO %d, mTextureHandle %d, aRect.width %d, aRect.height %d",
    90                       result, mInitParams.mFBOTextureTarget, mFBO, mTextureHandle, mInitParams.mSize.width, mInitParams.mSize.height);
    91     NS_ERROR(msg.get());
    92   }
    94   mCompositor->PrepareViewport(mInitParams.mSize, mTransform);
    95   mGL->fScissor(0, 0, mInitParams.mSize.width, mInitParams.mSize.height);
    96   if (mInitParams.mInit == INIT_MODE_CLEAR) {
    97     mGL->fClearColor(0.0, 0.0, 0.0, 0.0);
    98     mGL->fClear(LOCAL_GL_COLOR_BUFFER_BIT);
    99   }
   101   mInitParams.mStatus = InitParams::INITIALIZED;
   102 }

mercurial