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