Edit

kc3-lang/angle/src/libANGLE/renderer/gl/RenderbufferGL.cpp

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2015-05-27 16:12:30
    Hash : fd216c41
    Message : Support BGRA texture by remapping the internal format to RGBA. The format is still passed as BGRA to the driver so that the data can be properly unpacked. BUG=angleproject:884 Change-Id: I767626c818ce1a3c5a4739f07aa623bf8a9ae377 Reviewed-on: https://chromium-review.googlesource.com/273162 Reviewed-by: Brandon Jones <bajones@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Tested-by: Geoff Lang <geofflang@chromium.org>

  • src/libANGLE/renderer/gl/RenderbufferGL.cpp
  • //
    // Copyright 2015 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // RenderbufferGL.cpp: Implements the class methods for RenderbufferGL.
    
    #include "libANGLE/renderer/gl/RenderbufferGL.h"
    
    #include "common/debug.h"
    #include "libANGLE/Caps.h"
    #include "libANGLE/angletypes.h"
    #include "libANGLE/renderer/gl/FunctionsGL.h"
    #include "libANGLE/renderer/gl/StateManagerGL.h"
    #include "libANGLE/renderer/gl/formatutilsgl.h"
    #include "libANGLE/renderer/gl/renderergl_utils.h"
    
    namespace rx
    {
    
    RenderbufferGL::RenderbufferGL(const FunctionsGL *functions, StateManagerGL *stateManager, const gl::TextureCapsMap &textureCaps)
        : RenderbufferImpl(),
          mFunctions(functions),
          mStateManager(stateManager),
          mTextureCaps(textureCaps),
          mRenderbufferID(0)
    {
        mFunctions->genRenderbuffers(1, &mRenderbufferID);
        mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
    }
    
    RenderbufferGL::~RenderbufferGL()
    {
        mStateManager->deleteRenderbuffer(mRenderbufferID);
        mRenderbufferID = 0;
    }
    
    gl::Error RenderbufferGL::setStorage(GLenum internalformat, size_t width, size_t height)
    {
        mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
    
        const nativegl::InternalFormat &nativeInternalFormatInfo = nativegl::GetInternalFormatInfo(internalformat, mFunctions->standard);
        mFunctions->renderbufferStorage(GL_RENDERBUFFER, nativeInternalFormatInfo.internalFormat, width, height);
    
        return gl::Error(GL_NO_ERROR);
    }
    
    gl::Error RenderbufferGL::setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height)
    {
        mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
    
        const nativegl::InternalFormat &nativeInternalFormatInfo = nativegl::GetInternalFormatInfo(internalformat, mFunctions->standard);
        mFunctions->renderbufferStorageMultisample(GL_RENDERBUFFER, samples, nativeInternalFormatInfo.internalFormat, width, height);
    
        const gl::TextureCaps &formatCaps = mTextureCaps.get(internalformat);
        if (samples > formatCaps.getMaxSamples())
        {
            // Before version 4.2, it is unknown if the specific internal format can support the requested number
            // of samples.  It is expected that GL_OUT_OF_MEMORY is returned if the renderbuffer cannot be created.
            GLenum error = GL_NO_ERROR;
            do
            {
                error = mFunctions->getError();
                if (error == GL_OUT_OF_MEMORY)
                {
                    return gl::Error(GL_OUT_OF_MEMORY);
                }
    
                ASSERT(error == GL_NO_ERROR);
            } while (error != GL_NO_ERROR);
        }
    
        return gl::Error(GL_NO_ERROR);
    }
    
    GLuint RenderbufferGL::getRenderbufferID() const
    {
        return mRenderbufferID;
    }
    
    }