1 // 2 // Copyright (c) 2014 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 // FramebufferAttachment.h: Defines the wrapper class gl::FramebufferAttachment, as well as the 8 // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. 9 10 #ifndef LIBGLESV2_FRAMEBUFFERATTACHMENT_H_ 11 #define LIBGLESV2_FRAMEBUFFERATTACHMENT_H_ 12 13 #include <GLES3/gl3.h> 14 #include <GLES2/gl2.h> 15 16 #include "common/angleutils.h" 17 #include "common/RefCountObject.h" 18 19 namespace rx 20 { 21 class Renderer; 22 class RenderTarget; 23 class TextureStorage; 24 } 25 26 namespace gl 27 { 28 class Texture2D; 29 class TextureCubeMap; 30 class Texture3D; 31 class Texture2DArray; 32 class FramebufferAttachment; 33 class FramebufferAttachmentInterface; 34 class RenderbufferStorage; 35 36 // FramebufferAttachment implements the GL renderbuffer object. 37 // It's only a proxy for a FramebufferAttachmentInterface instance; the internal object 38 // can change whenever glRenderbufferStorage is called. 39 class FramebufferAttachment : public RefCountObject 40 { 41 public: 42 FramebufferAttachment(rx::Renderer *renderer, GLuint id, FramebufferAttachmentInterface *storage); 43 44 virtual ~FramebufferAttachment(); 45 46 // These functions from RefCountObject are overloaded here because 47 // Textures need to maintain their own count of references to them via 48 // Renderbuffers/RenderbufferTextures. These functions invoke those 49 // reference counting functions on the FramebufferAttachmentInterface. 50 void addRef() const; 51 void release() const; 52 53 rx::RenderTarget *getRenderTarget(); 54 rx::RenderTarget *getDepthStencil(); 55 rx::TextureStorage *getTextureStorage(); 56 57 GLsizei getWidth() const; 58 GLsizei getHeight() const; 59 GLenum getInternalFormat() const; 60 GLenum getActualFormat() const; 61 GLuint getRedSize() const; 62 GLuint getGreenSize() const; 63 GLuint getBlueSize() const; 64 GLuint getAlphaSize() const; 65 GLuint getDepthSize() const; 66 GLuint getStencilSize() const; 67 GLenum getComponentType() const; 68 GLenum getColorEncoding() const; 69 GLsizei getSamples() const; 70 71 unsigned int getSerial() const; 72 73 bool isTexture() const; 74 unsigned int getTextureSerial() const; 75 76 void setStorage(RenderbufferStorage *newStorage); 77 78 private: 79 DISALLOW_COPY_AND_ASSIGN(FramebufferAttachment); 80 81 rx::Renderer const *mRenderer; 82 FramebufferAttachmentInterface *mInstance; 83 }; 84 85 class FramebufferAttachmentInterface 86 { 87 public: 88 FramebufferAttachmentInterface(); 89 ~FramebufferAttachmentInterface()90 virtual ~FramebufferAttachmentInterface() {}; 91 92 virtual void addProxyRef(const FramebufferAttachment *proxy); 93 virtual void releaseProxy(const FramebufferAttachment *proxy); 94 95 virtual rx::RenderTarget *getRenderTarget() = 0; 96 virtual rx::RenderTarget *getDepthStencil() = 0; 97 virtual rx::TextureStorage *getTextureStorage() = 0; 98 99 virtual GLsizei getWidth() const = 0; 100 virtual GLsizei getHeight() const = 0; 101 virtual GLenum getInternalFormat() const = 0; 102 virtual GLenum getActualFormat() const = 0; 103 virtual GLsizei getSamples() const = 0; 104 105 virtual unsigned int getSerial() const = 0; 106 107 virtual bool isTexture() const = 0; 108 virtual unsigned int getTextureSerial() const = 0; 109 110 private: 111 DISALLOW_COPY_AND_ASSIGN(FramebufferAttachmentInterface); 112 }; 113 114 class Texture2DAttachment : public FramebufferAttachmentInterface 115 { 116 public: 117 Texture2DAttachment(Texture2D *texture, GLint level); 118 119 virtual ~Texture2DAttachment(); 120 121 void addProxyRef(const FramebufferAttachment *proxy); 122 void releaseProxy(const FramebufferAttachment *proxy); 123 124 rx::RenderTarget *getRenderTarget(); 125 rx::RenderTarget *getDepthStencil(); 126 rx::TextureStorage *getTextureStorage(); 127 128 virtual GLsizei getWidth() const; 129 virtual GLsizei getHeight() const; 130 virtual GLenum getInternalFormat() const; 131 virtual GLenum getActualFormat() const; 132 virtual GLsizei getSamples() const; 133 134 virtual unsigned int getSerial() const; 135 136 virtual bool isTexture() const; 137 virtual unsigned int getTextureSerial() const; 138 139 private: 140 DISALLOW_COPY_AND_ASSIGN(Texture2DAttachment); 141 142 BindingPointer <Texture2D> mTexture2D; 143 const GLint mLevel; 144 }; 145 146 class TextureCubeMapAttachment : public FramebufferAttachmentInterface 147 { 148 public: 149 TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level); 150 151 virtual ~TextureCubeMapAttachment(); 152 153 void addProxyRef(const FramebufferAttachment *proxy); 154 void releaseProxy(const FramebufferAttachment *proxy); 155 156 rx::RenderTarget *getRenderTarget(); 157 rx::RenderTarget *getDepthStencil(); 158 rx::TextureStorage *getTextureStorage(); 159 160 virtual GLsizei getWidth() const; 161 virtual GLsizei getHeight() const; 162 virtual GLenum getInternalFormat() const; 163 virtual GLenum getActualFormat() const; 164 virtual GLsizei getSamples() const; 165 166 virtual unsigned int getSerial() const; 167 168 virtual bool isTexture() const; 169 virtual unsigned int getTextureSerial() const; 170 171 private: 172 DISALLOW_COPY_AND_ASSIGN(TextureCubeMapAttachment); 173 174 BindingPointer <TextureCubeMap> mTextureCubeMap; 175 const GLint mLevel; 176 const GLenum mFaceTarget; 177 }; 178 179 class Texture3DAttachment : public FramebufferAttachmentInterface 180 { 181 public: 182 Texture3DAttachment(Texture3D *texture, GLint level, GLint layer); 183 184 virtual ~Texture3DAttachment(); 185 186 void addProxyRef(const FramebufferAttachment *proxy); 187 void releaseProxy(const FramebufferAttachment *proxy); 188 189 rx::RenderTarget *getRenderTarget(); 190 rx::RenderTarget *getDepthStencil(); 191 rx::TextureStorage *getTextureStorage(); 192 193 virtual GLsizei getWidth() const; 194 virtual GLsizei getHeight() const; 195 virtual GLenum getInternalFormat() const; 196 virtual GLenum getActualFormat() const; 197 virtual GLsizei getSamples() const; 198 199 virtual unsigned int getSerial() const; 200 201 virtual bool isTexture() const; 202 virtual unsigned int getTextureSerial() const; 203 204 private: 205 DISALLOW_COPY_AND_ASSIGN(Texture3DAttachment); 206 207 BindingPointer<Texture3D> mTexture3D; 208 const GLint mLevel; 209 const GLint mLayer; 210 }; 211 212 class Texture2DArrayAttachment : public FramebufferAttachmentInterface 213 { 214 public: 215 Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer); 216 217 virtual ~Texture2DArrayAttachment(); 218 219 void addProxyRef(const FramebufferAttachment *proxy); 220 void releaseProxy(const FramebufferAttachment *proxy); 221 222 rx::RenderTarget *getRenderTarget(); 223 rx::RenderTarget *getDepthStencil(); 224 rx::TextureStorage *getTextureStorage(); 225 226 virtual GLsizei getWidth() const; 227 virtual GLsizei getHeight() const; 228 virtual GLenum getInternalFormat() const; 229 virtual GLenum getActualFormat() const; 230 virtual GLsizei getSamples() const; 231 232 virtual unsigned int getSerial() const; 233 234 virtual bool isTexture() const; 235 virtual unsigned int getTextureSerial() const; 236 237 private: 238 DISALLOW_COPY_AND_ASSIGN(Texture2DArrayAttachment); 239 240 BindingPointer<Texture2DArray> mTexture2DArray; 241 const GLint mLevel; 242 const GLint mLayer; 243 }; 244 245 } 246 247 #endif // LIBGLESV2_FRAMEBUFFERATTACHMENT_H_ 248