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 void setProtectedContent(bool hasProtectedContent); 48 49 private: 50 friend class Renderbuffer; 51 52 void update(GLsizei width, 53 GLsizei height, 54 const Format &format, 55 GLsizei samples, 56 MultisamplingMode multisamplingMode, 57 InitState initState); 58 59 GLsizei mWidth; 60 GLsizei mHeight; 61 Format mFormat; 62 GLsizei mSamples; 63 MultisamplingMode mMultisamplingMode; 64 bool mHasProtectedContent; 65 66 // For robust resource init. 67 InitState mInitState; 68 }; 69 70 class Renderbuffer final : public RefCountObject<RenderbufferID>, 71 public egl::ImageSibling, 72 public LabeledObject 73 { 74 public: 75 Renderbuffer(rx::GLImplFactory *implFactory, RenderbufferID id); 76 ~Renderbuffer() override; 77 78 void onDestroy(const Context *context) override; 79 80 void setLabel(const Context *context, const std::string &label) override; 81 const std::string &getLabel() const override; 82 83 angle::Result setStorage(const Context *context, 84 GLenum internalformat, 85 GLsizei width, 86 GLsizei height); 87 angle::Result setStorageMultisample(const Context *context, 88 GLsizei samplesIn, 89 GLenum internalformat, 90 GLsizei width, 91 GLsizei height, 92 MultisamplingMode mode); 93 angle::Result setStorageEGLImageTarget(const Context *context, egl::Image *imageTarget); 94 95 angle::Result copyRenderbufferSubData(Context *context, 96 const gl::Renderbuffer *srcBuffer, 97 GLint srcLevel, 98 GLint srcX, 99 GLint srcY, 100 GLint srcZ, 101 GLint dstLevel, 102 GLint dstX, 103 GLint dstY, 104 GLint dstZ, 105 GLsizei srcWidth, 106 GLsizei srcHeight, 107 GLsizei srcDepth); 108 109 angle::Result copyTextureSubData(Context *context, 110 const gl::Texture *srcTexture, 111 GLint srcLevel, 112 GLint srcX, 113 GLint srcY, 114 GLint srcZ, 115 GLint dstLevel, 116 GLint dstX, 117 GLint dstY, 118 GLint dstZ, 119 GLsizei srcWidth, 120 GLsizei srcHeight, 121 GLsizei srcDepth); 122 123 rx::RenderbufferImpl *getImplementation() const; 124 125 GLsizei getWidth() const; 126 GLsizei getHeight() const; 127 const Format &getFormat() const; 128 GLsizei getSamples() const; 129 MultisamplingMode getMultisamplingMode() const; 130 GLuint getRedSize() const; 131 GLuint getGreenSize() const; 132 GLuint getBlueSize() const; 133 GLuint getAlphaSize() const; 134 GLuint getDepthSize() const; 135 GLuint getStencilSize() const; 136 const RenderbufferState &getState() const; 137 138 GLint getMemorySize() const; 139 140 // FramebufferAttachmentObject Impl 141 Extents getAttachmentSize(const ImageIndex &imageIndex) const override; 142 Format getAttachmentFormat(GLenum binding, const ImageIndex &imageIndex) const override; 143 GLsizei getAttachmentSamples(const ImageIndex &imageIndex) const override; 144 bool isRenderable(const Context *context, 145 GLenum binding, 146 const ImageIndex &imageIndex) const override; 147 148 void onAttach(const Context *context, rx::Serial framebufferSerial) override; 149 void onDetach(const Context *context, rx::Serial framebufferSerial) override; 150 GLuint getId() const override; 151 152 InitState initState(const ImageIndex &imageIndex) const override; 153 void setInitState(const ImageIndex &imageIndex, InitState initState) override; 154 155 GLenum getImplementationColorReadFormat(const Context *context) const; 156 GLenum getImplementationColorReadType(const Context *context) const; 157 158 // We pass the pack buffer and state explicitly so they can be overridden during capture. 159 angle::Result getRenderbufferImage(const Context *context, 160 const PixelPackState &packState, 161 Buffer *packBuffer, 162 GLenum format, 163 GLenum type, 164 void *pixels) const; 165 166 private: 167 // ObserverInterface implementation. 168 void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override; 169 170 rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override; 171 172 RenderbufferState mState; 173 std::unique_ptr<rx::RenderbufferImpl> mImplementation; 174 175 std::string mLabel; 176 angle::ObserverBinding mImplObserverBinding; 177 }; 178 179 } // namespace gl 180 181 #endif // LIBANGLE_RENDERBUFFER_H_ 182