Home | History | Annotate | Download | only in libGLESv2
      1 #include "precompiled.h"
      2 //
      3 // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
      4 // Use of this source code is governed by a BSD-style license that can be
      5 // found in the LICENSE file.
      6 //
      7 
      8 // Renderbuffer.cpp: the gl::Renderbuffer class and its derived classes
      9 // Colorbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
     10 // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
     11 
     12 #include "libGLESv2/Renderbuffer.h"
     13 #include "libGLESv2/renderer/RenderTarget.h"
     14 
     15 #include "libGLESv2/Texture.h"
     16 #include "libGLESv2/renderer/Renderer.h"
     17 #include "libGLESv2/utilities.h"
     18 
     19 namespace gl
     20 {
     21 unsigned int RenderbufferStorage::mCurrentSerial = 1;
     22 
     23 RenderbufferInterface::RenderbufferInterface()
     24 {
     25 }
     26 
     27 // The default case for classes inherited from RenderbufferInterface is not to
     28 // need to do anything upon the reference count to the parent Renderbuffer incrementing
     29 // or decrementing.
     30 void RenderbufferInterface::addProxyRef(const Renderbuffer *proxy)
     31 {
     32 }
     33 
     34 void RenderbufferInterface::releaseProxy(const Renderbuffer *proxy)
     35 {
     36 }
     37 
     38 GLuint RenderbufferInterface::getRedSize() const
     39 {
     40     return gl::GetRedSize(getActualFormat());
     41 }
     42 
     43 GLuint RenderbufferInterface::getGreenSize() const
     44 {
     45     return gl::GetGreenSize(getActualFormat());
     46 }
     47 
     48 GLuint RenderbufferInterface::getBlueSize() const
     49 {
     50     return gl::GetBlueSize(getActualFormat());
     51 }
     52 
     53 GLuint RenderbufferInterface::getAlphaSize() const
     54 {
     55     return gl::GetAlphaSize(getActualFormat());
     56 }
     57 
     58 GLuint RenderbufferInterface::getDepthSize() const
     59 {
     60     return gl::GetDepthSize(getActualFormat());
     61 }
     62 
     63 GLuint RenderbufferInterface::getStencilSize() const
     64 {
     65     return gl::GetStencilSize(getActualFormat());
     66 }
     67 
     68 ///// RenderbufferTexture2D Implementation ////////
     69 
     70 RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLenum target) : mTarget(target)
     71 {
     72     mTexture2D.set(texture);
     73 }
     74 
     75 RenderbufferTexture2D::~RenderbufferTexture2D()
     76 {
     77     mTexture2D.set(NULL);
     78 }
     79 
     80 // Textures need to maintain their own reference count for references via
     81 // Renderbuffers acting as proxies. Here, we notify the texture of a reference.
     82 void RenderbufferTexture2D::addProxyRef(const Renderbuffer *proxy)
     83 {
     84     mTexture2D->addProxyRef(proxy);
     85 }
     86 
     87 void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
     88 {
     89     mTexture2D->releaseProxy(proxy);
     90 }
     91 
     92 rx::RenderTarget *RenderbufferTexture2D::getRenderTarget()
     93 {
     94     return mTexture2D->getRenderTarget(mTarget);
     95 }
     96 
     97 rx::RenderTarget *RenderbufferTexture2D::getDepthStencil()
     98 {
     99     return mTexture2D->getDepthStencil(mTarget);
    100 }
    101 
    102 GLsizei RenderbufferTexture2D::getWidth() const
    103 {
    104     return mTexture2D->getWidth(0);
    105 }
    106 
    107 GLsizei RenderbufferTexture2D::getHeight() const
    108 {
    109     return mTexture2D->getHeight(0);
    110 }
    111 
    112 GLenum RenderbufferTexture2D::getInternalFormat() const
    113 {
    114     return mTexture2D->getInternalFormat(0);
    115 }
    116 
    117 GLenum RenderbufferTexture2D::getActualFormat() const
    118 {
    119     return mTexture2D->getActualFormat(0);
    120 }
    121 
    122 GLsizei RenderbufferTexture2D::getSamples() const
    123 {
    124     return 0;
    125 }
    126 
    127 unsigned int RenderbufferTexture2D::getSerial() const
    128 {
    129     return mTexture2D->getRenderTargetSerial(mTarget);
    130 }
    131 
    132 ///// RenderbufferTextureCubeMap Implementation ////////
    133 
    134 RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target) : mTarget(target)
    135 {
    136     mTextureCubeMap.set(texture);
    137 }
    138 
    139 RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
    140 {
    141     mTextureCubeMap.set(NULL);
    142 }
    143 
    144 // Textures need to maintain their own reference count for references via
    145 // Renderbuffers acting as proxies. Here, we notify the texture of a reference.
    146 void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
    147 {
    148     mTextureCubeMap->addProxyRef(proxy);
    149 }
    150 
    151 void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
    152 {
    153     mTextureCubeMap->releaseProxy(proxy);
    154 }
    155 
    156 rx::RenderTarget *RenderbufferTextureCubeMap::getRenderTarget()
    157 {
    158     return mTextureCubeMap->getRenderTarget(mTarget);
    159 }
    160 
    161 rx::RenderTarget *RenderbufferTextureCubeMap::getDepthStencil()
    162 {
    163     return NULL;
    164 }
    165 
    166 GLsizei RenderbufferTextureCubeMap::getWidth() const
    167 {
    168     return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
    169 }
    170 
    171 GLsizei RenderbufferTextureCubeMap::getHeight() const
    172 {
    173     return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
    174 }
    175 
    176 GLenum RenderbufferTextureCubeMap::getInternalFormat() const
    177 {
    178     return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
    179 }
    180 
    181 GLenum RenderbufferTextureCubeMap::getActualFormat() const
    182 {
    183     return mTextureCubeMap->getActualFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
    184 }
    185 
    186 GLsizei RenderbufferTextureCubeMap::getSamples() const
    187 {
    188     return 0;
    189 }
    190 
    191 unsigned int RenderbufferTextureCubeMap::getSerial() const
    192 {
    193     return mTextureCubeMap->getRenderTargetSerial(mTarget);
    194 }
    195 
    196 ////// Renderbuffer Implementation //////
    197 
    198 Renderbuffer::Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
    199 {
    200     ASSERT(instance != NULL);
    201     mInstance = instance;
    202 }
    203 
    204 Renderbuffer::~Renderbuffer()
    205 {
    206     delete mInstance;
    207 }
    208 
    209 // The RenderbufferInterface contained in this Renderbuffer may need to maintain
    210 // its own reference count, so we pass it on here.
    211 void Renderbuffer::addRef() const
    212 {
    213     mInstance->addProxyRef(this);
    214 
    215     RefCountObject::addRef();
    216 }
    217 
    218 void Renderbuffer::release() const
    219 {
    220     mInstance->releaseProxy(this);
    221 
    222     RefCountObject::release();
    223 }
    224 
    225 rx::RenderTarget *Renderbuffer::getRenderTarget()
    226 {
    227     return mInstance->getRenderTarget();
    228 }
    229 
    230 rx::RenderTarget *Renderbuffer::getDepthStencil()
    231 {
    232     return mInstance->getDepthStencil();
    233 }
    234 
    235 GLsizei Renderbuffer::getWidth() const
    236 {
    237     return mInstance->getWidth();
    238 }
    239 
    240 GLsizei Renderbuffer::getHeight() const
    241 {
    242     return mInstance->getHeight();
    243 }
    244 
    245 GLenum Renderbuffer::getInternalFormat() const
    246 {
    247     return mInstance->getInternalFormat();
    248 }
    249 
    250 GLenum Renderbuffer::getActualFormat() const
    251 {
    252     return mInstance->getActualFormat();
    253 }
    254 
    255 GLuint Renderbuffer::getRedSize() const
    256 {
    257     return mInstance->getRedSize();
    258 }
    259 
    260 GLuint Renderbuffer::getGreenSize() const
    261 {
    262     return mInstance->getGreenSize();
    263 }
    264 
    265 GLuint Renderbuffer::getBlueSize() const
    266 {
    267     return mInstance->getBlueSize();
    268 }
    269 
    270 GLuint Renderbuffer::getAlphaSize() const
    271 {
    272     return mInstance->getAlphaSize();
    273 }
    274 
    275 GLuint Renderbuffer::getDepthSize() const
    276 {
    277     return mInstance->getDepthSize();
    278 }
    279 
    280 GLuint Renderbuffer::getStencilSize() const
    281 {
    282     return mInstance->getStencilSize();
    283 }
    284 
    285 GLsizei Renderbuffer::getSamples() const
    286 {
    287     return mInstance->getSamples();
    288 }
    289 
    290 unsigned int Renderbuffer::getSerial() const
    291 {
    292     return mInstance->getSerial();
    293 }
    294 
    295 void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
    296 {
    297     ASSERT(newStorage != NULL);
    298 
    299     delete mInstance;
    300     mInstance = newStorage;
    301 }
    302 
    303 RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial())
    304 {
    305     mWidth = 0;
    306     mHeight = 0;
    307     mInternalFormat = GL_RGBA4;
    308     mActualFormat = GL_RGBA8_OES;
    309     mSamples = 0;
    310 }
    311 
    312 RenderbufferStorage::~RenderbufferStorage()
    313 {
    314 }
    315 
    316 rx::RenderTarget *RenderbufferStorage::getRenderTarget()
    317 {
    318     return NULL;
    319 }
    320 
    321 rx::RenderTarget *RenderbufferStorage::getDepthStencil()
    322 {
    323     return NULL;
    324 }
    325 
    326 GLsizei RenderbufferStorage::getWidth() const
    327 {
    328     return mWidth;
    329 }
    330 
    331 GLsizei RenderbufferStorage::getHeight() const
    332 {
    333     return mHeight;
    334 }
    335 
    336 GLenum RenderbufferStorage::getInternalFormat() const
    337 {
    338     return mInternalFormat;
    339 }
    340 
    341 GLenum RenderbufferStorage::getActualFormat() const
    342 {
    343     return mActualFormat;
    344 }
    345 
    346 GLsizei RenderbufferStorage::getSamples() const
    347 {
    348     return mSamples;
    349 }
    350 
    351 unsigned int RenderbufferStorage::getSerial() const
    352 {
    353     return mSerial;
    354 }
    355 
    356 unsigned int RenderbufferStorage::issueSerial()
    357 {
    358     return mCurrentSerial++;
    359 }
    360 
    361 unsigned int RenderbufferStorage::issueCubeSerials()
    362 {
    363     unsigned int firstSerial = mCurrentSerial;
    364     mCurrentSerial += 6;
    365     return firstSerial;
    366 }
    367 
    368 Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
    369 {
    370     mRenderTarget = renderer->createRenderTarget(swapChain, false);
    371 
    372     if (mRenderTarget)
    373     {
    374         mWidth = mRenderTarget->getWidth();
    375         mHeight = mRenderTarget->getHeight();
    376         mInternalFormat = mRenderTarget->getInternalFormat();
    377         mActualFormat = mRenderTarget->getActualFormat();
    378         mSamples = mRenderTarget->getSamples();
    379     }
    380 }
    381 
    382 Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
    383 {
    384     mRenderTarget = renderer->createRenderTarget(width, height, format, samples, false);
    385 
    386     if (mRenderTarget)
    387     {
    388         mWidth = width;
    389         mHeight = height;
    390         mInternalFormat = format;
    391         mActualFormat = mRenderTarget->getActualFormat();
    392         mSamples = mRenderTarget->getSamples();
    393     }
    394 }
    395 
    396 Colorbuffer::~Colorbuffer()
    397 {
    398     if (mRenderTarget)
    399     {
    400         delete mRenderTarget;
    401     }
    402 }
    403 
    404 rx::RenderTarget *Colorbuffer::getRenderTarget()
    405 {
    406     if (mRenderTarget)
    407     {
    408         return mRenderTarget;
    409     }
    410 
    411     return NULL;
    412 }
    413 
    414 DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
    415 {
    416     mDepthStencil = renderer->createRenderTarget(swapChain, true);
    417     if (mDepthStencil)
    418     {
    419         mWidth = mDepthStencil->getWidth();
    420         mHeight = mDepthStencil->getHeight();
    421         mInternalFormat = mDepthStencil->getInternalFormat();
    422         mSamples = mDepthStencil->getSamples();
    423         mActualFormat = mDepthStencil->getActualFormat();
    424     }
    425 }
    426 
    427 DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
    428 {
    429 
    430     mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples, true);
    431 
    432     mWidth = mDepthStencil->getWidth();
    433     mHeight = mDepthStencil->getHeight();
    434     mInternalFormat = GL_DEPTH24_STENCIL8_OES;
    435     mActualFormat = mDepthStencil->getActualFormat();
    436     mSamples = mDepthStencil->getSamples();
    437 }
    438 
    439 DepthStencilbuffer::~DepthStencilbuffer()
    440 {
    441     if (mDepthStencil)
    442     {
    443         delete mDepthStencil;
    444     }
    445 }
    446 
    447 rx::RenderTarget *DepthStencilbuffer::getDepthStencil()
    448 {
    449     if (mDepthStencil)
    450     {
    451         return mDepthStencil;
    452     }
    453 
    454     return NULL;
    455 }
    456 
    457 Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
    458 {
    459     if (mDepthStencil)
    460     {
    461         mInternalFormat = GL_DEPTH_COMPONENT16;   // If the renderbuffer parameters are queried, the calling function
    462                                                   // will expect one of the valid renderbuffer formats for use in
    463                                                   // glRenderbufferStorage
    464     }
    465 }
    466 
    467 Depthbuffer::~Depthbuffer()
    468 {
    469 }
    470 
    471 Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
    472 {
    473     if (mDepthStencil)
    474     {
    475         mInternalFormat = GL_STENCIL_INDEX8;   // If the renderbuffer parameters are queried, the calling function
    476                                                // will expect one of the valid renderbuffer formats for use in
    477                                                // glRenderbufferStorage
    478     }
    479 }
    480 
    481 Stencilbuffer::~Stencilbuffer()
    482 {
    483 }
    484 
    485 }
    486