Edit

kc3-lang/angle/src/libANGLE/Renderbuffer.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2017-09-20 13:20:30
    Hash : ea84f6ff
    Message : Pass Context to Framebuffer11 dirty callback. This allows us to call StateManager11::invalidateRenderTarget from the Framebuffer11::signal function, which will then trigger state refresh on the next draw call. This requires passing Context through a few more Renderbuffer methods, and reorganizing the RenderTarget signalling so that it doesn't signal dirty in the destructor. Instead they are signaled as they are destroyed in the containing classes. BUG=angleproject:2151 Change-Id: I4cf575e4a01b48275ff78d75bc55b2d1fced591d Reviewed-on: https://chromium-review.googlesource.com/673139 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Frank Henigman <fjhenigman@chromium.org>

  • src/libANGLE/Renderbuffer.cpp
  • //
    // Copyright (c) 2002-2012 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.
    //
    
    // Renderbuffer.cpp: Implements the renderer-agnostic gl::Renderbuffer class,
    // GL renderbuffer objects and related functionality.
    // [OpenGL ES 2.0.24] section 4.4.3 page 108.
    
    #include "libANGLE/Renderbuffer.h"
    
    #include "common/utilities.h"
    #include "libANGLE/FramebufferAttachment.h"
    #include "libANGLE/Image.h"
    #include "libANGLE/Texture.h"
    #include "libANGLE/formatutils.h"
    #include "libANGLE/renderer/d3d/RenderTargetD3D.h"
    
    namespace gl
    {
    Renderbuffer::Renderbuffer(rx::RenderbufferImpl *impl, GLuint id)
        : egl::ImageSibling(id),
          mRenderbuffer(impl),
          mLabel(),
          mWidth(0),
          mHeight(0),
          mFormat(GL_RGBA4),
          mSamples(0)
    {
    }
    
    Error Renderbuffer::onDestroy(const Context *context)
    {
        ANGLE_TRY(orphanImages(context));
    
        if (mRenderbuffer)
        {
            ANGLE_TRY(mRenderbuffer->onDestroy(context));
        }
    
        return NoError();
    }
    
    Renderbuffer::~Renderbuffer()
    {
        SafeDelete(mRenderbuffer);
    }
    
    void Renderbuffer::setLabel(const std::string &label)
    {
        mLabel = label;
    }
    
    const std::string &Renderbuffer::getLabel() const
    {
        return mLabel;
    }
    
    Error Renderbuffer::setStorage(const Context *context,
                                   GLenum internalformat,
                                   size_t width,
                                   size_t height)
    {
        ANGLE_TRY(orphanImages(context));
    
        ANGLE_TRY(mRenderbuffer->setStorage(context, internalformat, width, height));
    
        mWidth          = static_cast<GLsizei>(width);
        mHeight         = static_cast<GLsizei>(height);
        mFormat         = Format(internalformat);
        mSamples = 0;
    
        mDirtyChannel.signal();
    
        return NoError();
    }
    
    Error Renderbuffer::setStorageMultisample(const Context *context,
                                              size_t samples,
                                              GLenum internalformat,
                                              size_t width,
                                              size_t height)
    {
        ANGLE_TRY(orphanImages(context));
    
        ANGLE_TRY(
            mRenderbuffer->setStorageMultisample(context, samples, internalformat, width, height));
    
        mWidth          = static_cast<GLsizei>(width);
        mHeight         = static_cast<GLsizei>(height);
        mFormat         = Format(internalformat);
        mSamples        = static_cast<GLsizei>(samples);
    
        mDirtyChannel.signal();
    
        return NoError();
    }
    
    Error Renderbuffer::setStorageEGLImageTarget(const Context *context, egl::Image *image)
    {
        ANGLE_TRY(orphanImages(context));
    
        ANGLE_TRY(mRenderbuffer->setStorageEGLImageTarget(context, image));
    
        setTargetImage(context, image);
    
        mWidth          = static_cast<GLsizei>(image->getWidth());
        mHeight         = static_cast<GLsizei>(image->getHeight());
        mFormat         = Format(image->getFormat());
        mSamples        = 0;
    
        mDirtyChannel.signal();
    
        return NoError();
    }
    
    rx::RenderbufferImpl *Renderbuffer::getImplementation() const
    {
        ASSERT(mRenderbuffer);
        return mRenderbuffer;
    }
    
    GLsizei Renderbuffer::getWidth() const
    {
        return mWidth;
    }
    
    GLsizei Renderbuffer::getHeight() const
    {
        return mHeight;
    }
    
    const Format &Renderbuffer::getFormat() const
    {
        return mFormat;
    }
    
    GLsizei Renderbuffer::getSamples() const
    {
        return mSamples;
    }
    
    GLuint Renderbuffer::getRedSize() const
    {
        return mFormat.info->redBits;
    }
    
    GLuint Renderbuffer::getGreenSize() const
    {
        return mFormat.info->greenBits;
    }
    
    GLuint Renderbuffer::getBlueSize() const
    {
        return mFormat.info->blueBits;
    }
    
    GLuint Renderbuffer::getAlphaSize() const
    {
        return mFormat.info->alphaBits;
    }
    
    GLuint Renderbuffer::getDepthSize() const
    {
        return mFormat.info->depthBits;
    }
    
    GLuint Renderbuffer::getStencilSize() const
    {
        return mFormat.info->stencilBits;
    }
    
    void Renderbuffer::onAttach(const Context *context)
    {
        addRef();
    }
    
    void Renderbuffer::onDetach(const Context *context)
    {
        release(context);
    }
    
    GLuint Renderbuffer::getId() const
    {
        return id();
    }
    
    Extents Renderbuffer::getAttachmentSize(const gl::ImageIndex & /*imageIndex*/) const
    {
        return Extents(mWidth, mHeight, 1);
    }
    }  // namespace gl