Home | History | Annotate | Download | only in libGLESv2
      1 //
      2 // Copyright (c) 2002-2010 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 wrapper class gl::Renderbuffer, as well as the
      8 // class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer,
      9 // DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
     10 // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
     11 
     12 #ifndef LIBGLESV2_RENDERBUFFER_H_
     13 #define LIBGLESV2_RENDERBUFFER_H_
     14 
     15 #define GL_APICALL
     16 #include <GLES2/gl2.h>
     17 
     18 #include "common/angleutils.h"
     19 #include "common/RefCountObject.h"
     20 
     21 namespace rx
     22 {
     23 class Renderer;
     24 class SwapChain;
     25 class RenderTarget;
     26 }
     27 
     28 namespace gl
     29 {
     30 class Texture2D;
     31 class TextureCubeMap;
     32 class Renderbuffer;
     33 class Colorbuffer;
     34 class DepthStencilbuffer;
     35 
     36 class RenderbufferInterface
     37 {
     38   public:
     39     RenderbufferInterface();
     40 
     41     virtual ~RenderbufferInterface() {};
     42 
     43     virtual void addProxyRef(const Renderbuffer *proxy);
     44     virtual void releaseProxy(const Renderbuffer *proxy);
     45 
     46     virtual rx::RenderTarget *getRenderTarget() = 0;
     47     virtual rx::RenderTarget *getDepthStencil() = 0;
     48 
     49     virtual GLsizei getWidth() const = 0;
     50     virtual GLsizei getHeight() const = 0;
     51     virtual GLenum getInternalFormat() const = 0;
     52     virtual GLenum getActualFormat() const = 0;
     53     virtual GLsizei getSamples() const = 0;
     54 
     55     GLuint getRedSize() const;
     56     GLuint getGreenSize() const;
     57     GLuint getBlueSize() const;
     58     GLuint getAlphaSize() const;
     59     GLuint getDepthSize() const;
     60     GLuint getStencilSize() const;
     61 
     62     virtual unsigned int getSerial() const = 0;
     63     virtual unsigned int getTextureSerial() const = 0;
     64 
     65   private:
     66     DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
     67 };
     68 
     69 class RenderbufferTexture2D : public RenderbufferInterface
     70 {
     71   public:
     72     RenderbufferTexture2D(Texture2D *texture, GLenum target);
     73 
     74     virtual ~RenderbufferTexture2D();
     75 
     76     void addProxyRef(const Renderbuffer *proxy);
     77     void releaseProxy(const Renderbuffer *proxy);
     78 
     79     rx::RenderTarget *getRenderTarget();
     80     rx::RenderTarget *getDepthStencil();
     81 
     82     virtual GLsizei getWidth() const;
     83     virtual GLsizei getHeight() const;
     84     virtual GLenum getInternalFormat() const;
     85     virtual GLenum getActualFormat() const;
     86     virtual GLsizei getSamples() const;
     87 
     88     virtual unsigned int getSerial() const;
     89     virtual unsigned int getTextureSerial() const;
     90 
     91   private:
     92     DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
     93 
     94     BindingPointer <Texture2D> mTexture2D;
     95     GLenum mTarget;
     96 };
     97 
     98 class RenderbufferTextureCubeMap : public RenderbufferInterface
     99 {
    100   public:
    101     RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target);
    102 
    103     virtual ~RenderbufferTextureCubeMap();
    104 
    105     void addProxyRef(const Renderbuffer *proxy);
    106     void releaseProxy(const Renderbuffer *proxy);
    107 
    108     rx::RenderTarget *getRenderTarget();
    109     rx::RenderTarget *getDepthStencil();
    110 
    111     virtual GLsizei getWidth() const;
    112     virtual GLsizei getHeight() const;
    113     virtual GLenum getInternalFormat() const;
    114     virtual GLenum getActualFormat() const;
    115     virtual GLsizei getSamples() const;
    116 
    117     virtual unsigned int getSerial() const;
    118     virtual unsigned int getTextureSerial() const;
    119 
    120   private:
    121     DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
    122 
    123     BindingPointer <TextureCubeMap> mTextureCubeMap;
    124     GLenum mTarget;
    125 };
    126 
    127 // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
    128 // is called. The specific concrete type depends on whether the internal format is
    129 // colour depth, stencil or packed depth/stencil.
    130 class RenderbufferStorage : public RenderbufferInterface
    131 {
    132   public:
    133     RenderbufferStorage();
    134 
    135     virtual ~RenderbufferStorage() = 0;
    136 
    137     virtual rx::RenderTarget *getRenderTarget();
    138     virtual rx::RenderTarget *getDepthStencil();
    139 
    140     virtual GLsizei getWidth() const;
    141     virtual GLsizei getHeight() const;
    142     virtual GLenum getInternalFormat() const;
    143     virtual GLenum getActualFormat() const;
    144     virtual GLsizei getSamples() const;
    145 
    146     virtual unsigned int getSerial() const;
    147     virtual unsigned int getTextureSerial() const { return 0; }
    148 
    149     static unsigned int issueSerial();
    150     static unsigned int issueCubeSerials();
    151 
    152   protected:
    153     GLsizei mWidth;
    154     GLsizei mHeight;
    155     GLenum mInternalFormat;
    156     GLenum mActualFormat;
    157     GLsizei mSamples;
    158 
    159   private:
    160     DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
    161 
    162     const unsigned int mSerial;
    163 
    164     static unsigned int mCurrentSerial;
    165 };
    166 
    167 // Renderbuffer implements the GL renderbuffer object.
    168 // It's only a proxy for a RenderbufferInterface instance; the internal object
    169 // can change whenever glRenderbufferStorage is called.
    170 class Renderbuffer : public RefCountObject
    171 {
    172   public:
    173     Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage);
    174 
    175     virtual ~Renderbuffer();
    176 
    177     // These functions from RefCountObject are overloaded here because
    178     // Textures need to maintain their own count of references to them via
    179     // Renderbuffers/RenderbufferTextures. These functions invoke those
    180     // reference counting functions on the RenderbufferInterface.
    181     void addRef() const;
    182     void release() const;
    183 
    184     rx::RenderTarget *getRenderTarget();
    185     rx::RenderTarget *getDepthStencil();
    186 
    187     GLsizei getWidth() const;
    188     GLsizei getHeight() const;
    189     GLenum getInternalFormat() const;
    190     GLenum getActualFormat() const;
    191     GLuint getRedSize() const;
    192     GLuint getGreenSize() const;
    193     GLuint getBlueSize() const;
    194     GLuint getAlphaSize() const;
    195     GLuint getDepthSize() const;
    196     GLuint getStencilSize() const;
    197     GLsizei getSamples() const;
    198 
    199     unsigned int getSerial() const;
    200     unsigned int getTextureSerial() const;
    201 
    202     void setStorage(RenderbufferStorage *newStorage);
    203 
    204   private:
    205     DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
    206 
    207     RenderbufferInterface *mInstance;
    208 };
    209 
    210 class Colorbuffer : public RenderbufferStorage
    211 {
    212   public:
    213     Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
    214     Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
    215 
    216     virtual ~Colorbuffer();
    217 
    218     virtual rx::RenderTarget *getRenderTarget();
    219 
    220   private:
    221     DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
    222 
    223     rx::RenderTarget *mRenderTarget;
    224 };
    225 
    226 class DepthStencilbuffer : public RenderbufferStorage
    227 {
    228   public:
    229     DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
    230     DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
    231 
    232     ~DepthStencilbuffer();
    233 
    234     virtual rx::RenderTarget *getDepthStencil();
    235 
    236   protected:
    237     rx::RenderTarget  *mDepthStencil;
    238 
    239   private:
    240     DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
    241 };
    242 
    243 class Depthbuffer : public DepthStencilbuffer
    244 {
    245   public:
    246     Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
    247 
    248     virtual ~Depthbuffer();
    249 
    250   private:
    251     DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
    252 };
    253 
    254 class Stencilbuffer : public DepthStencilbuffer
    255 {
    256   public:
    257     Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
    258 
    259     virtual ~Stencilbuffer();
    260 
    261   private:
    262     DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
    263 };
    264 }
    265 
    266 #endif   // LIBGLESV2_RENDERBUFFER_H_
    267