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 unsigned int RenderbufferTexture2D::getTextureSerial() const
    133 {
    134     return mTexture2D->getTextureSerial();
    135 }
    136 
    137 ///// RenderbufferTextureCubeMap Implementation ////////
    138 
    139 RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target) : mTarget(target)
    140 {
    141     mTextureCubeMap.set(texture);
    142 }
    143 
    144 RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
    145 {
    146     mTextureCubeMap.set(NULL);
    147 }
    148 
    149 // Textures need to maintain their own reference count for references via
    150 // Renderbuffers acting as proxies. Here, we notify the texture of a reference.
    151 void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
    152 {
    153     mTextureCubeMap->addProxyRef(proxy);
    154 }
    155 
    156 void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
    157 {
    158     mTextureCubeMap->releaseProxy(proxy);
    159 }
    160 
    161 rx::RenderTarget *RenderbufferTextureCubeMap::getRenderTarget()
    162 {
    163     return mTextureCubeMap->getRenderTarget(mTarget);
    164 }
    165 
    166 rx::RenderTarget *RenderbufferTextureCubeMap::getDepthStencil()
    167 {
    168     return NULL;
    169 }
    170 
    171 GLsizei RenderbufferTextureCubeMap::getWidth() const
    172 {
    173     return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
    174 }
    175 
    176 GLsizei RenderbufferTextureCubeMap::getHeight() const
    177 {
    178     return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
    179 }
    180 
    181 GLenum RenderbufferTextureCubeMap::getInternalFormat() const
    182 {
    183     return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
    184 }
    185 
    186 GLenum RenderbufferTextureCubeMap::getActualFormat() const
    187 {
    188     return mTextureCubeMap->getActualFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
    189 }
    190 
    191 GLsizei RenderbufferTextureCubeMap::getSamples() const
    192 {
    193     return 0;
    194 }
    195 
    196 unsigned int RenderbufferTextureCubeMap::getSerial() const
    197 {
    198     return mTextureCubeMap->getRenderTargetSerial(mTarget);
    199 }
    200 
    201 unsigned int RenderbufferTextureCubeMap::getTextureSerial() const
    202 {
    203     return mTextureCubeMap->getTextureSerial();
    204 }
    205 
    206 ////// Renderbuffer Implementation //////
    207 
    208 Renderbuffer::Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
    209 {
    210     ASSERT(instance != NULL);
    211     mInstance = instance;
    212 }
    213 
    214 Renderbuffer::~Renderbuffer()
    215 {
    216     delete mInstance;
    217 }
    218 
    219 // The RenderbufferInterface contained in this Renderbuffer may need to maintain
    220 // its own reference count, so we pass it on here.
    221 void Renderbuffer::addRef() const
    222 {
    223     mInstance->addProxyRef(this);
    224 
    225     RefCountObject::addRef();
    226 }
    227 
    228 void Renderbuffer::release() const
    229 {
    230     mInstance->releaseProxy(this);
    231 
    232     RefCountObject::release();
    233 }
    234 
    235 rx::RenderTarget *Renderbuffer::getRenderTarget()
    236 {
    237     return mInstance->getRenderTarget();
    238 }
    239 
    240 rx::RenderTarget *Renderbuffer::getDepthStencil()
    241 {
    242     return mInstance->getDepthStencil();
    243 }
    244 
    245 GLsizei Renderbuffer::getWidth() const
    246 {
    247     return mInstance->getWidth();
    248 }
    249 
    250 GLsizei Renderbuffer::getHeight() const
    251 {
    252     return mInstance->getHeight();
    253 }
    254 
    255 GLenum Renderbuffer::getInternalFormat() const
    256 {
    257     return mInstance->getInternalFormat();
    258 }
    259 
    260 GLenum Renderbuffer::getActualFormat() const
    261 {
    262     return mInstance->getActualFormat();
    263 }
    264 
    265 GLuint Renderbuffer::getRedSize() const
    266 {
    267     return mInstance->getRedSize();
    268 }
    269 
    270 GLuint Renderbuffer::getGreenSize() const
    271 {
    272     return mInstance->getGreenSize();
    273 }
    274 
    275 GLuint Renderbuffer::getBlueSize() const
    276 {
    277     return mInstance->getBlueSize();
    278 }
    279 
    280 GLuint Renderbuffer::getAlphaSize() const
    281 {
    282     return mInstance->getAlphaSize();
    283 }
    284 
    285 GLuint Renderbuffer::getDepthSize() const
    286 {
    287     return mInstance->getDepthSize();
    288 }
    289 
    290 GLuint Renderbuffer::getStencilSize() const
    291 {
    292     return mInstance->getStencilSize();
    293 }
    294 
    295 GLsizei Renderbuffer::getSamples() const
    296 {
    297     return mInstance->getSamples();
    298 }
    299 
    300 unsigned int Renderbuffer::getSerial() const
    301 {
    302     return mInstance->getSerial();
    303 }
    304 
    305 unsigned int Renderbuffer::getTextureSerial() const
    306 {
    307     return mInstance->getTextureSerial();
    308 }
    309 
    310 void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
    311 {
    312     ASSERT(newStorage != NULL);
    313 
    314     delete mInstance;
    315     mInstance = newStorage;
    316 }
    317 
    318 RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial())
    319 {
    320     mWidth = 0;
    321     mHeight = 0;
    322     mInternalFormat = GL_RGBA4;
    323     mActualFormat = GL_RGBA8_OES;
    324     mSamples = 0;
    325 }
    326 
    327 RenderbufferStorage::~RenderbufferStorage()
    328 {
    329 }
    330 
    331 rx::RenderTarget *RenderbufferStorage::getRenderTarget()
    332 {
    333     return NULL;
    334 }
    335 
    336 rx::RenderTarget *RenderbufferStorage::getDepthStencil()
    337 {
    338     return NULL;
    339 }
    340 
    341 GLsizei RenderbufferStorage::getWidth() const
    342 {
    343     return mWidth;
    344 }
    345 
    346 GLsizei RenderbufferStorage::getHeight() const
    347 {
    348     return mHeight;
    349 }
    350 
    351 GLenum RenderbufferStorage::getInternalFormat() const
    352 {
    353     return mInternalFormat;
    354 }
    355 
    356 GLenum RenderbufferStorage::getActualFormat() const
    357 {
    358     return mActualFormat;
    359 }
    360 
    361 GLsizei RenderbufferStorage::getSamples() const
    362 {
    363     return mSamples;
    364 }
    365 
    366 unsigned int RenderbufferStorage::getSerial() const
    367 {
    368     return mSerial;
    369 }
    370 
    371 unsigned int RenderbufferStorage::issueSerial()
    372 {
    373     return mCurrentSerial++;
    374 }
    375 
    376 unsigned int RenderbufferStorage::issueCubeSerials()
    377 {
    378     unsigned int firstSerial = mCurrentSerial;
    379     mCurrentSerial += 6;
    380     return firstSerial;
    381 }
    382 
    383 Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
    384 {
    385     mRenderTarget = renderer->createRenderTarget(swapChain, false);
    386 
    387     if (mRenderTarget)
    388     {
    389         mWidth = mRenderTarget->getWidth();
    390         mHeight = mRenderTarget->getHeight();
    391         mInternalFormat = mRenderTarget->getInternalFormat();
    392         mActualFormat = mRenderTarget->getActualFormat();
    393         mSamples = mRenderTarget->getSamples();
    394     }
    395 }
    396 
    397 Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
    398 {
    399     mRenderTarget = renderer->createRenderTarget(width, height, format, samples, false);
    400 
    401     if (mRenderTarget)
    402     {
    403         mWidth = width;
    404         mHeight = height;
    405         mInternalFormat = format;
    406         mActualFormat = mRenderTarget->getActualFormat();
    407         mSamples = mRenderTarget->getSamples();
    408     }
    409 }
    410 
    411 Colorbuffer::~Colorbuffer()
    412 {
    413     if (mRenderTarget)
    414     {
    415         delete mRenderTarget;
    416     }
    417 }
    418 
    419 rx::RenderTarget *Colorbuffer::getRenderTarget()
    420 {
    421     if (mRenderTarget)
    422     {
    423         return mRenderTarget;
    424     }
    425 
    426     return NULL;
    427 }
    428 
    429 DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
    430 {
    431     mDepthStencil = renderer->createRenderTarget(swapChain, true);
    432     if (mDepthStencil)
    433     {
    434         mWidth = mDepthStencil->getWidth();
    435         mHeight = mDepthStencil->getHeight();
    436         mInternalFormat = mDepthStencil->getInternalFormat();
    437         mSamples = mDepthStencil->getSamples();
    438         mActualFormat = mDepthStencil->getActualFormat();
    439     }
    440 }
    441 
    442 DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
    443 {
    444 
    445     mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples, true);
    446 
    447     mWidth = mDepthStencil->getWidth();
    448     mHeight = mDepthStencil->getHeight();
    449     mInternalFormat = GL_DEPTH24_STENCIL8_OES;
    450     mActualFormat = mDepthStencil->getActualFormat();
    451     mSamples = mDepthStencil->getSamples();
    452 }
    453 
    454 DepthStencilbuffer::~DepthStencilbuffer()
    455 {
    456     if (mDepthStencil)
    457     {
    458         delete mDepthStencil;
    459     }
    460 }
    461 
    462 rx::RenderTarget *DepthStencilbuffer::getDepthStencil()
    463 {
    464     if (mDepthStencil)
    465     {
    466         return mDepthStencil;
    467     }
    468 
    469     return NULL;
    470 }
    471 
    472 Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
    473 {
    474     if (mDepthStencil)
    475     {
    476         mInternalFormat = GL_DEPTH_COMPONENT16;   // If the renderbuffer parameters are queried, the calling function
    477                                                   // will expect one of the valid renderbuffer formats for use in
    478                                                   // glRenderbufferStorage
    479     }
    480 }
    481 
    482 Depthbuffer::~Depthbuffer()
    483 {
    484 }
    485 
    486 Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
    487 {
    488     if (mDepthStencil)
    489     {
    490         mInternalFormat = GL_STENCIL_INDEX8;   // If the renderbuffer parameters are queried, the calling function
    491                                                // will expect one of the valid renderbuffer formats for use in
    492                                                // glRenderbufferStorage
    493     }
    494 }
    495 
    496 Stencilbuffer::~Stencilbuffer()
    497 {
    498 }
    499 
    500 }
    501