diff options
Diffstat (limited to 'gfx/angle/src/libANGLE/Renderbuffer.cpp')
-rwxr-xr-x | gfx/angle/src/libANGLE/Renderbuffer.cpp | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/gfx/angle/src/libANGLE/Renderbuffer.cpp b/gfx/angle/src/libANGLE/Renderbuffer.cpp new file mode 100755 index 000000000..7b30a46be --- /dev/null +++ b/gfx/angle/src/libANGLE/Renderbuffer.cpp @@ -0,0 +1,173 @@ +// +// 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) +{ +} + +Renderbuffer::~Renderbuffer() +{ + SafeDelete(mRenderbuffer); +} + +void Renderbuffer::setLabel(const std::string &label) +{ + mLabel = label; +} + +const std::string &Renderbuffer::getLabel() const +{ + return mLabel; +} + +Error Renderbuffer::setStorage(GLenum internalformat, size_t width, size_t height) +{ + orphanImages(); + + ANGLE_TRY(mRenderbuffer->setStorage(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(size_t samples, GLenum internalformat, size_t width, size_t height) +{ + orphanImages(); + + ANGLE_TRY(mRenderbuffer->setStorageMultisample(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(egl::Image *image) +{ + orphanImages(); + + ANGLE_TRY(mRenderbuffer->setStorageEGLImageTarget(image)); + + setTargetImage(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() +{ + addRef(); +} + +void Renderbuffer::onDetach() +{ + release(); +} + +GLuint Renderbuffer::getId() const +{ + return id(); +} + +Extents Renderbuffer::getAttachmentSize(const FramebufferAttachment::Target & /*target*/) const +{ + return Extents(mWidth, mHeight, 1); +} +} // namespace gl |