1 // 2 // Copyright 2002 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // Renderbuffer.h: Defines the renderer-agnostic container class gl::Renderbuffer. 8 // Implements GL renderbuffer objects and related functionality. 9 // [OpenGL ES 2.0.24] section 4.4.3 page 108. 10 11 #ifndef LIBANGLE_RENDERBUFFER_H_ 12 #define LIBANGLE_RENDERBUFFER_H_ 13 14 #include "angle_gl.h" 15 #include "common/angleutils.h" 16 #include "libANGLE/Debug.h" 17 #include "libANGLE/Error.h" 18 #include "libANGLE/FramebufferAttachment.h" 19 #include "libANGLE/Image.h" 20 #include "libANGLE/formatutils.h" 21 #include "libANGLE/renderer/RenderbufferImpl.h" 22 23 namespace rx 24 { 25 class GLImplFactory; 26 } // namespace rx 27 28 namespace gl 29 { 30 // A GL renderbuffer object is usually used as a depth or stencil buffer attachment 31 // for a framebuffer object. The renderbuffer itself is a distinct GL object, see 32 // FramebufferAttachment and Framebuffer for how they are applied to an FBO via an 33 // attachment point. 34 35 class RenderbufferState final : angle::NonCopyable 36 { 37 public: 38 RenderbufferState(); 39 ~RenderbufferState(); 40 41 GLsizei getWidth() const; 42 GLsizei getHeight() const; 43 const Format &getFormat() const; 44 GLsizei getSamples() const; 45 MultisamplingMode getMultisamplingMode() const; 46 InitState getInitState() const; 47 48 private: 49 friend class Renderbuffer; 50 51 void update(GLsizei width, 52 GLsizei height, 53 const Format &format, 54 GLsizei samples, 55 MultisamplingMode multisamplingMode, 56 InitState initState); 57 58 GLsizei mWidth; 59 GLsizei mHeight; 60 Format mFormat; 61 GLsizei mSamples; 62 MultisamplingMode mMultisamplingMode; 63 64 // For robust resource init. 65 InitState mInitState; 66 }; 67 68 class Renderbuffer final : public RefCountObject<RenderbufferID>, 69 public egl::ImageSibling, 70 public LabeledObject 71 { 72 public: 73 Renderbuffer(rx::GLImplFactory *implFactory, RenderbufferID id); 74 ~Renderbuffer() override; 75 76 void onDestroy(const Context *context) override; 77 78 void setLabel(const Context *context, const std::string &label) override; 79 const std::string &getLabel() const override; 80 81 angle::Result setStorage(const Context *context, 82 GLenum internalformat, 83 GLsizei width, 84 GLsizei height); 85 angle::Result setStorageMultisample(const Context *context, 86 GLsizei samplesIn, 87 GLenum internalformat, 88 GLsizei width, 89 GLsizei height, 90 MultisamplingMode mode); 91 angle::Result setStorageEGLImageTarget(const Context *context, egl::Image *imageTarget); 92 93 angle::Result copyRenderbufferSubData(Context *context, 94 const gl::Renderbuffer *srcBuffer, 95 GLint srcLevel, 96 GLint srcX, 97 GLint srcY, 98 GLint srcZ, 99 GLint dstLevel, 100 GLint dstX, 101 GLint dstY, 102 GLint dstZ, 103 GLsizei srcWidth, 104 GLsizei srcHeight, 105 GLsizei srcDepth); 106 107 angle::Result copyTextureSubData(Context *context, 108 const gl::Texture *srcTexture, 109 GLint srcLevel, 110 GLint srcX, 111 GLint srcY, 112 GLint srcZ, 113 GLint dstLevel, 114 GLint dstX, 115 GLint dstY, 116 GLint dstZ, 117 GLsizei srcWidth, 118 GLsizei srcHeight, 119 GLsizei srcDepth); 120 121 rx::RenderbufferImpl *getImplementation() const; 122 123 GLsizei getWidth() const; 124 GLsizei getHeight() const; 125 const Format &getFormat() const; 126 GLsizei getSamples() const; 127 MultisamplingMode getMultisamplingMode() const; 128 GLuint getRedSize() const; 129 GLuint getGreenSize() const; 130 GLuint getBlueSize() const; 131 GLuint getAlphaSize() const; 132 GLuint getDepthSize() const; 133 GLuint getStencilSize() const; 134 const RenderbufferState &getState() const; 135 136 GLint getMemorySize() const; 137 138 // FramebufferAttachmentObject Impl 139 Extents getAttachmentSize(const ImageIndex &imageIndex) const override; 140 Format getAttachmentFormat(GLenum binding, const ImageIndex &imageIndex) const override; 141 GLsizei getAttachmentSamples(const ImageIndex &imageIndex) const override; 142 bool isRenderable(const Context *context, 143 GLenum binding, 144 const ImageIndex &imageIndex) const override; 145 146 void onAttach(const Context *context, rx::Serial framebufferSerial) override; 147 void onDetach(const Context *context, rx::Serial framebufferSerial) override; 148 GLuint getId() const override; 149 150 InitState initState(const ImageIndex &imageIndex) const override; 151 void setInitState(const ImageIndex &imageIndex, InitState initState) override; 152 153 GLenum getImplementationColorReadFormat(const Context *context) const; 154 GLenum getImplementationColorReadType(const Context *context) const; 155 156 // We pass the pack buffer and state explicitly so they can be overridden during capture. 157 angle::Result getRenderbufferImage(const Context *context, 158 const PixelPackState &packState, 159 Buffer *packBuffer, 160 GLenum format, 161 GLenum type, 162 void *pixels) const; 163 164 private: 165 // ObserverInterface implementation. 166 void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override; 167 168 rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override; 169 170 RenderbufferState mState; 171 std::unique_ptr<rx::RenderbufferImpl> mImplementation; 172 173 std::string mLabel; 174 angle::ObserverBinding mImplObserverBinding; 175 }; 176 177 } // namespace gl 178 179 #endif // LIBANGLE_RENDERBUFFER_H_ 180