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 
     64   private:
     65     DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
     66 };
     67 
     68 class RenderbufferTexture2D : public RenderbufferInterface
     69 {
     70   public:
     71     RenderbufferTexture2D(Texture2D *texture, GLenum target);
     72 
     73     virtual ~RenderbufferTexture2D();
     74 
     75     void addProxyRef(const Renderbuffer *proxy);
     76     void releaseProxy(const Renderbuffer *proxy);
     77 
     78     rx::RenderTarget *getRenderTarget();
     79     rx::RenderTarget *getDepthStencil();
     80 
     81     virtual GLsizei getWidth() const;
     82     virtual GLsizei getHeight() const;
     83     virtual GLenum getInternalFormat() const;
     84     virtual GLenum getActualFormat() const;
     85     virtual GLsizei getSamples() const;
     86 
     87     virtual unsigned int getSerial() const;
     88 
     89   private:
     90     DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
     91 
     92     BindingPointer <Texture2D> mTexture2D;
     93     GLenum mTarget;
     94 };
     95 
     96 class RenderbufferTextureCubeMap : public RenderbufferInterface
     97 {
     98   public:
     99     RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target);
    100 
    101     virtual ~RenderbufferTextureCubeMap();
    102 
    103     void addProxyRef(const Renderbuffer *proxy);
    104     void releaseProxy(const Renderbuffer *proxy);
    105 
    106     rx::RenderTarget *getRenderTarget();
    107     rx::RenderTarget *getDepthStencil();
    108 
    109     virtual GLsizei getWidth() const;
    110     virtual GLsizei getHeight() const;
    111     virtual GLenum getInternalFormat() const;
    112     virtual GLenum getActualFormat() const;
    113     virtual GLsizei getSamples() const;
    114 
    115     virtual unsigned int getSerial() const;
    116 
    117   private:
    118     DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
    119 
    120     BindingPointer <TextureCubeMap> mTextureCubeMap;
    121     GLenum mTarget;
    122 };
    123 
    124 // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
    125 // is called. The specific concrete type depends on whether the internal format is
    126 // colour depth, stencil or packed depth/stencil.
    127 class RenderbufferStorage : public RenderbufferInterface
    128 {
    129   public:
    130     RenderbufferStorage();
    131 
    132     virtual ~RenderbufferStorage() = 0;
    133 
    134     virtual rx::RenderTarget *getRenderTarget();
    135     virtual rx::RenderTarget *getDepthStencil();
    136 
    137     virtual GLsizei getWidth() const;
    138     virtual GLsizei getHeight() const;
    139     virtual GLenum getInternalFormat() const;
    140     virtual GLenum getActualFormat() const;
    141     virtual GLsizei getSamples() const;
    142 
    143     virtual unsigned int getSerial() const;
    144 
    145     static unsigned int issueSerial();
    146     static unsigned int issueCubeSerials();
    147 
    148   protected:
    149     GLsizei mWidth;
    150     GLsizei mHeight;
    151     GLenum mInternalFormat;
    152     GLenum mActualFormat;
    153     GLsizei mSamples;
    154 
    155   private:
    156     DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
    157 
    158     const unsigned int mSerial;
    159 
    160     static unsigned int mCurrentSerial;
    161 };
    162 
    163 // Renderbuffer implements the GL renderbuffer object.
    164 // It's only a proxy for a RenderbufferInterface instance; the internal object
    165 // can change whenever glRenderbufferStorage is called.
    166 class Renderbuffer : public RefCountObject
    167 {
    168   public:
    169     Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage);
    170 
    171     virtual ~Renderbuffer();
    172 
    173     // These functions from RefCountObject are overloaded here because
    174     // Textures need to maintain their own count of references to them via
    175     // Renderbuffers/RenderbufferTextures. These functions invoke those
    176     // reference counting functions on the RenderbufferInterface.
    177     void addRef() const;
    178     void release() const;
    179 
    180     rx::RenderTarget *getRenderTarget();
    181     rx::RenderTarget *getDepthStencil();
    182 
    183     GLsizei getWidth() const;
    184     GLsizei getHeight() const;
    185     GLenum getInternalFormat() const;
    186     GLenum getActualFormat() const;
    187     GLuint getRedSize() const;
    188     GLuint getGreenSize() const;
    189     GLuint getBlueSize() const;
    190     GLuint getAlphaSize() const;
    191     GLuint getDepthSize() const;
    192     GLuint getStencilSize() const;
    193     GLsizei getSamples() const;
    194 
    195     unsigned int getSerial() const;
    196 
    197     void setStorage(RenderbufferStorage *newStorage);
    198 
    199   private:
    200     DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
    201 
    202     RenderbufferInterface *mInstance;
    203 };
    204 
    205 class Colorbuffer : public RenderbufferStorage
    206 {
    207   public:
    208     Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
    209     Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
    210 
    211     virtual ~Colorbuffer();
    212 
    213     virtual rx::RenderTarget *getRenderTarget();
    214 
    215   private:
    216     DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
    217 
    218     rx::RenderTarget *mRenderTarget;
    219 };
    220 
    221 class DepthStencilbuffer : public RenderbufferStorage
    222 {
    223   public:
    224     DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
    225     DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
    226 
    227     ~DepthStencilbuffer();
    228 
    229     virtual rx::RenderTarget *getDepthStencil();
    230 
    231   protected:
    232     rx::RenderTarget  *mDepthStencil;
    233 
    234   private:
    235     DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
    236 };
    237 
    238 class Depthbuffer : public DepthStencilbuffer
    239 {
    240   public:
    241     Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
    242 
    243     virtual ~Depthbuffer();
    244 
    245   private:
    246     DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
    247 };
    248 
    249 class Stencilbuffer : public DepthStencilbuffer
    250 {
    251   public:
    252     Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
    253 
    254     virtual ~Stencilbuffer();
    255 
    256   private:
    257     DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
    258 };
    259 }
    260 
    261 #endif   // LIBGLESV2_RENDERBUFFER_H_
    262