diff options
Diffstat (limited to 'gfx/angle/checkout/src/libANGLE/Renderbuffer.h')
-rw-r--r-- | gfx/angle/checkout/src/libANGLE/Renderbuffer.h | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/libANGLE/Renderbuffer.h b/gfx/angle/checkout/src/libANGLE/Renderbuffer.h new file mode 100644 index 0000000000..a00b03d277 --- /dev/null +++ b/gfx/angle/checkout/src/libANGLE/Renderbuffer.h @@ -0,0 +1,179 @@ +// +// Copyright 2002 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.h: Defines the renderer-agnostic container class gl::Renderbuffer. +// Implements GL renderbuffer objects and related functionality. +// [OpenGL ES 2.0.24] section 4.4.3 page 108. + +#ifndef LIBANGLE_RENDERBUFFER_H_ +#define LIBANGLE_RENDERBUFFER_H_ + +#include "angle_gl.h" +#include "common/angleutils.h" +#include "libANGLE/Debug.h" +#include "libANGLE/Error.h" +#include "libANGLE/FramebufferAttachment.h" +#include "libANGLE/Image.h" +#include "libANGLE/formatutils.h" +#include "libANGLE/renderer/RenderbufferImpl.h" + +namespace rx +{ +class GLImplFactory; +} // namespace rx + +namespace gl +{ +// A GL renderbuffer object is usually used as a depth or stencil buffer attachment +// for a framebuffer object. The renderbuffer itself is a distinct GL object, see +// FramebufferAttachment and Framebuffer for how they are applied to an FBO via an +// attachment point. + +class RenderbufferState final : angle::NonCopyable +{ + public: + RenderbufferState(); + ~RenderbufferState(); + + GLsizei getWidth() const; + GLsizei getHeight() const; + const Format &getFormat() const; + GLsizei getSamples() const; + MultisamplingMode getMultisamplingMode() const; + InitState getInitState() const; + + private: + friend class Renderbuffer; + + void update(GLsizei width, + GLsizei height, + const Format &format, + GLsizei samples, + MultisamplingMode multisamplingMode, + InitState initState); + + GLsizei mWidth; + GLsizei mHeight; + Format mFormat; + GLsizei mSamples; + MultisamplingMode mMultisamplingMode; + + // For robust resource init. + InitState mInitState; +}; + +class Renderbuffer final : public RefCountObject<RenderbufferID>, + public egl::ImageSibling, + public LabeledObject +{ + public: + Renderbuffer(rx::GLImplFactory *implFactory, RenderbufferID id); + ~Renderbuffer() override; + + void onDestroy(const Context *context) override; + + void setLabel(const Context *context, const std::string &label) override; + const std::string &getLabel() const override; + + angle::Result setStorage(const Context *context, + GLenum internalformat, + GLsizei width, + GLsizei height); + angle::Result setStorageMultisample(const Context *context, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height, + MultisamplingMode mode); + angle::Result setStorageEGLImageTarget(const Context *context, egl::Image *imageTarget); + + angle::Result copyRenderbufferSubData(Context *context, + const gl::Renderbuffer *srcBuffer, + GLint srcLevel, + GLint srcX, + GLint srcY, + GLint srcZ, + GLint dstLevel, + GLint dstX, + GLint dstY, + GLint dstZ, + GLsizei srcWidth, + GLsizei srcHeight, + GLsizei srcDepth); + + angle::Result copyTextureSubData(Context *context, + const gl::Texture *srcTexture, + GLint srcLevel, + GLint srcX, + GLint srcY, + GLint srcZ, + GLint dstLevel, + GLint dstX, + GLint dstY, + GLint dstZ, + GLsizei srcWidth, + GLsizei srcHeight, + GLsizei srcDepth); + + rx::RenderbufferImpl *getImplementation() const; + + GLsizei getWidth() const; + GLsizei getHeight() const; + const Format &getFormat() const; + GLsizei getSamples() const; + MultisamplingMode getMultisamplingMode() const; + GLuint getRedSize() const; + GLuint getGreenSize() const; + GLuint getBlueSize() const; + GLuint getAlphaSize() const; + GLuint getDepthSize() const; + GLuint getStencilSize() const; + const RenderbufferState &getState() const; + + GLint getMemorySize() const; + + // FramebufferAttachmentObject Impl + Extents getAttachmentSize(const ImageIndex &imageIndex) const override; + Format getAttachmentFormat(GLenum binding, const ImageIndex &imageIndex) const override; + GLsizei getAttachmentSamples(const ImageIndex &imageIndex) const override; + bool isRenderable(const Context *context, + GLenum binding, + const ImageIndex &imageIndex) const override; + + void onAttach(const Context *context, rx::Serial framebufferSerial) override; + void onDetach(const Context *context, rx::Serial framebufferSerial) override; + GLuint getId() const override; + + InitState initState(const ImageIndex &imageIndex) const override; + void setInitState(const ImageIndex &imageIndex, InitState initState) override; + + GLenum getImplementationColorReadFormat(const Context *context) const; + GLenum getImplementationColorReadType(const Context *context) const; + + // We pass the pack buffer and state explicitly so they can be overridden during capture. + angle::Result getRenderbufferImage(const Context *context, + const PixelPackState &packState, + Buffer *packBuffer, + GLenum format, + GLenum type, + void *pixels) const; + + private: + // ObserverInterface implementation. + void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override; + + rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override; + + RenderbufferState mState; + std::unique_ptr<rx::RenderbufferImpl> mImplementation; + + std::string mLabel; + angle::ObserverBinding mImplObserverBinding; +}; + +} // namespace gl + +#endif // LIBANGLE_RENDERBUFFER_H_ |