1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Renderbuffer.h: Defines the wrapper class Renderbuffer, as well as the 16 // class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer, 17 // DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer 18 // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. 19 20 #ifndef LIBGLESV2_RENDERBUFFER_H_ 21 #define LIBGLESV2_RENDERBUFFER_H_ 22 23 #include "common/Object.hpp" 24 #include "common/Image.hpp" 25 26 #include <GLES2/gl2.h> 27 28 namespace es2 29 { 30 class Texture2D; 31 class Texture3D; 32 class TextureCubeMap; 33 class Renderbuffer; 34 class Colorbuffer; 35 class DepthStencilbuffer; 36 37 class RenderbufferInterface 38 { 39 public: 40 RenderbufferInterface(); 41 42 virtual ~RenderbufferInterface() {}; 43 44 virtual void addProxyRef(const Renderbuffer *proxy); 45 virtual void releaseProxy(const Renderbuffer *proxy); 46 47 virtual egl::Image *getRenderTarget() = 0; 48 virtual egl::Image *createSharedImage() = 0; 49 virtual bool isShared() const = 0; 50 51 virtual GLsizei getWidth() const = 0; 52 virtual GLsizei getHeight() const = 0; 53 virtual GLsizei getDepth() const { return 1; } 54 virtual GLint getLayer() const { return 0; } 55 virtual GLint getLevel() const { return 0; } 56 virtual GLenum getFormat() const = 0; 57 virtual sw::Format getInternalFormat() const = 0; 58 virtual GLsizei getSamples() const = 0; 59 60 virtual void setLayer(GLint) {} 61 virtual void setLevel(GLint) {} 62 63 GLuint getRedSize() const; 64 GLuint getGreenSize() const; 65 GLuint getBlueSize() const; 66 GLuint getAlphaSize() const; 67 GLuint getDepthSize() const; 68 GLuint getStencilSize() const; 69 }; 70 71 class RenderbufferTexture2D : public RenderbufferInterface 72 { 73 public: 74 RenderbufferTexture2D(Texture2D *texture, GLint level); 75 76 virtual ~RenderbufferTexture2D(); 77 78 virtual void addProxyRef(const Renderbuffer *proxy); 79 virtual void releaseProxy(const Renderbuffer *proxy); 80 81 virtual egl::Image *getRenderTarget(); 82 virtual egl::Image *createSharedImage(); 83 virtual bool isShared() const; 84 85 virtual GLsizei getWidth() const; 86 virtual GLsizei getHeight() const; 87 virtual GLint getLevel() const { return mLevel; } 88 virtual GLenum getFormat() const; 89 virtual sw::Format getInternalFormat() const; 90 virtual GLsizei getSamples() const; 91 92 virtual void setLevel(GLint level) { mLevel = level; } 93 94 private: 95 gl::BindingPointer<Texture2D> mTexture2D; 96 GLint mLevel; 97 }; 98 99 class RenderbufferTexture3D : public RenderbufferInterface 100 { 101 public: 102 RenderbufferTexture3D(Texture3D *texture, GLint level, GLint layer); 103 104 virtual ~RenderbufferTexture3D(); 105 106 virtual void addProxyRef(const Renderbuffer *proxy); 107 virtual void releaseProxy(const Renderbuffer *proxy); 108 109 virtual egl::Image *getRenderTarget(); 110 virtual egl::Image *createSharedImage(); 111 virtual bool isShared() const; 112 113 virtual GLsizei getWidth() const; 114 virtual GLsizei getHeight() const; 115 virtual GLsizei getDepth() const; 116 virtual GLint getLayer() const { return mLayer; } 117 virtual GLint getLevel() const { return mLevel; } 118 virtual GLenum getFormat() const; 119 virtual sw::Format getInternalFormat() const; 120 virtual GLsizei getSamples() const; 121 122 virtual void setLayer(GLint layer) { mLayer = layer; } 123 virtual void setLevel(GLint level) { mLevel = level; } 124 125 private: 126 gl::BindingPointer<Texture3D> mTexture3D; 127 GLint mLevel; 128 GLint mLayer; 129 }; 130 131 class RenderbufferTextureCubeMap : public RenderbufferInterface 132 { 133 public: 134 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target, GLint level); 135 136 virtual ~RenderbufferTextureCubeMap(); 137 138 virtual void addProxyRef(const Renderbuffer *proxy); 139 virtual void releaseProxy(const Renderbuffer *proxy); 140 141 virtual egl::Image *getRenderTarget(); 142 virtual egl::Image *createSharedImage(); 143 virtual bool isShared() const; 144 145 virtual GLsizei getWidth() const; 146 virtual GLsizei getHeight() const; 147 virtual GLint getLevel() const { return mLevel; } 148 virtual GLenum getFormat() const; 149 virtual sw::Format getInternalFormat() const; 150 virtual GLsizei getSamples() const; 151 152 virtual void setLevel(GLint level) { mLevel = level; } 153 154 private: 155 gl::BindingPointer<TextureCubeMap> mTextureCubeMap; 156 GLenum mTarget; 157 GLint mLevel; 158 }; 159 160 // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage 161 // is called. The specific concrete type depends on whether the internal format is 162 // colour depth, stencil or packed depth/stencil. 163 class RenderbufferStorage : public RenderbufferInterface 164 { 165 public: 166 RenderbufferStorage(); 167 168 virtual ~RenderbufferStorage() = 0; 169 170 virtual egl::Image *getRenderTarget() = 0; 171 virtual egl::Image *createSharedImage() = 0; 172 virtual bool isShared() const = 0; 173 174 virtual GLsizei getWidth() const; 175 virtual GLsizei getHeight() const; 176 virtual GLenum getFormat() const; 177 virtual sw::Format getInternalFormat() const; 178 virtual GLsizei getSamples() const; 179 180 protected: 181 GLsizei mWidth; 182 GLsizei mHeight; 183 GLenum format; 184 sw::Format internalFormat; 185 GLsizei mSamples; 186 }; 187 188 // Renderbuffer implements the GL renderbuffer object. 189 // It's only a proxy for a RenderbufferInterface instance; the internal object 190 // can change whenever glRenderbufferStorage is called. 191 class Renderbuffer : public gl::NamedObject 192 { 193 public: 194 Renderbuffer(GLuint name, RenderbufferInterface *storage); 195 196 virtual ~Renderbuffer(); 197 198 // These functions from Object are overloaded here because 199 // Textures need to maintain their own count of references to them via 200 // Renderbuffers/RenderbufferTextures. These functions invoke those 201 // reference counting functions on the RenderbufferInterface. 202 virtual void addRef(); 203 virtual void release(); 204 205 egl::Image *getRenderTarget(); 206 virtual egl::Image *createSharedImage(); 207 virtual bool isShared() const; 208 209 GLsizei getWidth() const; 210 GLsizei getHeight() const; 211 GLsizei getDepth() const; 212 GLint getLayer() const; 213 GLint getLevel() const; 214 GLenum getFormat() const; 215 sw::Format getInternalFormat() const; 216 GLuint getRedSize() const; 217 GLuint getGreenSize() const; 218 GLuint getBlueSize() const; 219 GLuint getAlphaSize() const; 220 GLuint getDepthSize() const; 221 GLuint getStencilSize() const; 222 GLsizei getSamples() const; 223 224 void setLayer(GLint layer); 225 void setLevel(GLint level); 226 void setStorage(RenderbufferStorage *newStorage); 227 228 private: 229 RenderbufferInterface *mInstance; 230 }; 231 232 class Colorbuffer : public RenderbufferStorage 233 { 234 public: 235 explicit Colorbuffer(egl::Image *renderTarget); 236 Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples); 237 238 virtual ~Colorbuffer(); 239 240 virtual egl::Image *getRenderTarget(); 241 virtual egl::Image *createSharedImage(); 242 virtual bool isShared() const; 243 244 private: 245 egl::Image *mRenderTarget; 246 }; 247 248 class DepthStencilbuffer : public RenderbufferStorage 249 { 250 public: 251 explicit DepthStencilbuffer(egl::Image *depthStencil); 252 DepthStencilbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples); 253 254 ~DepthStencilbuffer(); 255 256 virtual egl::Image *getRenderTarget(); 257 virtual egl::Image *createSharedImage(); 258 virtual bool isShared() const; 259 260 protected: 261 egl::Image *mDepthStencil; 262 }; 263 264 class Depthbuffer : public DepthStencilbuffer 265 { 266 public: 267 explicit Depthbuffer(egl::Image *depthStencil); 268 Depthbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples); 269 270 virtual ~Depthbuffer(); 271 }; 272 273 class Stencilbuffer : public DepthStencilbuffer 274 { 275 public: 276 explicit Stencilbuffer(egl::Image *depthStencil); 277 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples); 278 279 virtual ~Stencilbuffer(); 280 }; 281 } 282 283 #endif // LIBGLESV2_RENDERBUFFER_H_ 284