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