Edit

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

Branch :

  • Show log

    Commit

  • Author : Cooper Partin
    Date : 2015-08-12 10:56:50
    Hash : 4d61f7ed
    Message : Reland Fixed compiler warning C4267 'conversion from 'size_t' to 'type', possible loss of data' Additional warnings found with more testing and added C4267 warning disable only for angle_libpng BUG=angleproject:1120 Change-Id: Ic403dcff5a8018056fa51a8c408e64207f3362eb Reviewed-on: https://chromium-review.googlesource.com/293028 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@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,
                                   const WorkaroundsGL &workarounds,
                                   StateManagerGL *stateManager,
                                   const gl::TextureCapsMap &textureCaps)
        : RenderbufferImpl(),
          mFunctions(functions),
          mWorkarounds(workarounds),
          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);
    
        nativegl::RenderbufferFormat renderbufferFormat =
            nativegl::GetRenderbufferFormat(mFunctions, mWorkarounds, internalformat);
        mFunctions->renderbufferStorage(GL_RENDERBUFFER, renderbufferFormat.internalFormat,
                                        static_cast<GLsizei>(width), static_cast<GLsizei>(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);
    
        nativegl::RenderbufferFormat renderbufferFormat =
            nativegl::GetRenderbufferFormat(mFunctions, mWorkarounds, internalformat);
        mFunctions->renderbufferStorageMultisample(
            GL_RENDERBUFFER, static_cast<GLsizei>(samples), renderbufferFormat.internalFormat,
            static_cast<GLsizei>(width), static_cast<GLsizei>(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);
    }
    
    gl::Error RenderbufferGL::setStorageEGLImageTarget(egl::Image *image)
    {
        UNIMPLEMENTED();
        return gl::Error(GL_INVALID_OPERATION);
    }
    
    GLuint RenderbufferGL::getRenderbufferID() const
    {
        return mRenderbufferID;
    }
    
    }