Home | History | Annotate | Download | only in libGLESv2
      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