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 31 class Texture2D; 32 class Texture3D; 33 class TextureCubeMap; 34 class Texture2DRect; 35 class Renderbuffer; 36 class Colorbuffer; 37 class DepthStencilbuffer; 38 39 class RenderbufferInterface 40 { 41 public: 42 RenderbufferInterface(); 43 ~RenderbufferInterface()44 virtual ~RenderbufferInterface() {} 45 46 virtual void addProxyRef(const Renderbuffer *proxy); 47 virtual void releaseProxy(const Renderbuffer *proxy); 48 49 virtual egl::Image *getRenderTarget() = 0; 50 virtual egl::Image *createSharedImage() = 0; 51 virtual bool isShared() const = 0; 52 53 virtual GLsizei getWidth() const = 0; 54 virtual GLsizei getHeight() const = 0; getDepth()55 virtual GLsizei getDepth() const { return 1; } getLevel()56 virtual GLint getLevel() const { return 0; } 57 virtual GLint getFormat() const = 0; 58 virtual GLsizei getSamples() const = 0; 59 setLevel(GLint)60 virtual void setLevel(GLint) {} 61 62 GLuint getRedSize() const; 63 GLuint getGreenSize() const; 64 GLuint getBlueSize() const; 65 GLuint getAlphaSize() const; 66 GLuint getDepthSize() const; 67 GLuint getStencilSize() const; 68 }; 69 70 class RenderbufferTexture2D : public RenderbufferInterface 71 { 72 public: 73 RenderbufferTexture2D(Texture2D *texture, GLint level); 74 75 ~RenderbufferTexture2D() override; 76 77 void addProxyRef(const Renderbuffer *proxy) override; 78 void releaseProxy(const Renderbuffer *proxy) override; 79 80 egl::Image *getRenderTarget() override; 81 egl::Image *createSharedImage() override; 82 bool isShared() const override; 83 84 GLsizei getWidth() const override; 85 GLsizei getHeight() const override; getLevel()86 GLint getLevel() const override { return mLevel; } 87 GLint getFormat() const override; 88 GLsizei getSamples() const override; 89 setLevel(GLint level)90 void setLevel(GLint level) override { mLevel = level; } 91 92 private: 93 gl::BindingPointer<Texture2D> mTexture2D; 94 GLint mLevel; 95 }; 96 97 class RenderbufferTexture2DRect : public RenderbufferInterface 98 { 99 public: 100 RenderbufferTexture2DRect(Texture2DRect *texture); 101 102 ~RenderbufferTexture2DRect() override; 103 104 void addProxyRef(const Renderbuffer *proxy) override; 105 void releaseProxy(const Renderbuffer *proxy) override; 106 107 egl::Image *getRenderTarget() override; 108 egl::Image *createSharedImage() override; 109 bool isShared() const override; 110 111 GLsizei getWidth() const override; 112 GLsizei getHeight() const override; 113 GLint getFormat() const override; 114 GLsizei getSamples() const override; 115 116 private: 117 gl::BindingPointer<Texture2DRect> mTexture2DRect; 118 }; 119 120 class RenderbufferTexture3D : public RenderbufferInterface 121 { 122 public: 123 RenderbufferTexture3D(Texture3D *texture, GLint level); 124 125 ~RenderbufferTexture3D() override; 126 127 void addProxyRef(const Renderbuffer *proxy) override; 128 void releaseProxy(const Renderbuffer *proxy) override; 129 130 egl::Image *getRenderTarget() override; 131 egl::Image *createSharedImage() override; 132 bool isShared() const override; 133 134 GLsizei getWidth() const override; 135 GLsizei getHeight() const override; 136 GLsizei getDepth() const override; getLevel()137 GLint getLevel() const override { return mLevel; } 138 GLint getFormat() const override; 139 GLsizei getSamples() const override; 140 setLevel(GLint level)141 void setLevel(GLint level) override { mLevel = level; } 142 143 private: 144 gl::BindingPointer<Texture3D> mTexture3D; 145 GLint mLevel; 146 }; 147 148 class RenderbufferTextureCubeMap : public RenderbufferInterface 149 { 150 public: 151 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target, GLint level); 152 153 ~RenderbufferTextureCubeMap() override; 154 155 void addProxyRef(const Renderbuffer *proxy) override; 156 void releaseProxy(const Renderbuffer *proxy) override; 157 158 egl::Image *getRenderTarget() override; 159 egl::Image *createSharedImage() override; 160 bool isShared() const override; 161 162 GLsizei getWidth() const override; 163 GLsizei getHeight() const override; getLevel()164 GLint getLevel() const override { return mLevel; } 165 GLint getFormat() const override; 166 GLsizei getSamples() const override; 167 setLevel(GLint level)168 void setLevel(GLint level) override { mLevel = level; } 169 170 private: 171 gl::BindingPointer<TextureCubeMap> mTextureCubeMap; 172 GLenum mTarget; 173 GLint mLevel; 174 }; 175 176 // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage 177 // is called. The specific concrete type depends on whether the internal format is 178 // colour depth, stencil or packed depth/stencil. 179 class RenderbufferStorage : public RenderbufferInterface 180 { 181 public: 182 RenderbufferStorage(); 183 184 ~RenderbufferStorage() override = 0; 185 186 egl::Image *getRenderTarget() override = 0; 187 egl::Image *createSharedImage() override = 0; 188 bool isShared() const override = 0; 189 190 GLsizei getWidth() const override; 191 GLsizei getHeight() const override; 192 GLint getFormat() const override; 193 GLsizei getSamples() const override; 194 195 protected: 196 GLsizei mWidth; 197 GLsizei mHeight; 198 GLenum format; 199 GLsizei mSamples; 200 }; 201 202 // Renderbuffer implements the GL renderbuffer object. 203 // It's only a proxy for a RenderbufferInterface instance; the internal object 204 // can change whenever glRenderbufferStorage is called. 205 class Renderbuffer : public gl::NamedObject 206 { 207 public: 208 Renderbuffer(GLuint name, RenderbufferInterface *storage); 209 210 ~Renderbuffer() override; 211 212 // These functions from Object are overloaded here because 213 // Textures need to maintain their own count of references to them via 214 // Renderbuffers/RenderbufferTextures. These functions invoke those 215 // reference counting functions on the RenderbufferInterface. 216 void addRef() override; 217 void release() override; 218 219 egl::Image *getRenderTarget(); 220 virtual egl::Image *createSharedImage(); 221 virtual bool isShared() const; 222 223 GLsizei getWidth() const; 224 GLsizei getHeight() const; 225 GLsizei getDepth() const; 226 GLint getLevel() const; 227 GLint getFormat() const; 228 GLuint getRedSize() const; 229 GLuint getGreenSize() const; 230 GLuint getBlueSize() const; 231 GLuint getAlphaSize() const; 232 GLuint getDepthSize() const; 233 GLuint getStencilSize() const; 234 GLsizei getSamples() const; 235 236 void setLevel(GLint level); 237 void setStorage(RenderbufferStorage *newStorage); 238 239 private: 240 RenderbufferInterface *mInstance; 241 }; 242 243 class Colorbuffer : public RenderbufferStorage 244 { 245 public: 246 explicit Colorbuffer(egl::Image *renderTarget); 247 Colorbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); 248 249 ~Colorbuffer() override; 250 251 egl::Image *getRenderTarget() override; 252 egl::Image *createSharedImage() override; 253 bool isShared() const override; 254 255 private: 256 egl::Image *mRenderTarget; 257 }; 258 259 class DepthStencilbuffer : public RenderbufferStorage 260 { 261 public: 262 explicit DepthStencilbuffer(egl::Image *depthStencil); 263 DepthStencilbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); 264 265 ~DepthStencilbuffer(); 266 267 egl::Image *getRenderTarget() override; 268 egl::Image *createSharedImage() override; 269 bool isShared() const override; 270 271 protected: 272 egl::Image *mDepthStencil; 273 }; 274 275 class Depthbuffer : public DepthStencilbuffer 276 { 277 public: 278 explicit Depthbuffer(egl::Image *depthStencil); 279 Depthbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); 280 281 ~Depthbuffer() override; 282 }; 283 284 class Stencilbuffer : public DepthStencilbuffer 285 { 286 public: 287 explicit Stencilbuffer(egl::Image *depthStencil); 288 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples); 289 290 ~Stencilbuffer() override; 291 }; 292 } 293 294 #endif // LIBGLESV2_RENDERBUFFER_H_ 295