1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/angle/src/libGLESv2/Renderbuffer.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,485 @@ 1.4 +#include "precompiled.h" 1.5 +// 1.6 +// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. 1.7 +// Use of this source code is governed by a BSD-style license that can be 1.8 +// found in the LICENSE file. 1.9 +// 1.10 + 1.11 +// Renderbuffer.cpp: the gl::Renderbuffer class and its derived classes 1.12 +// Colorbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer 1.13 +// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. 1.14 + 1.15 +#include "libGLESv2/Renderbuffer.h" 1.16 +#include "libGLESv2/renderer/RenderTarget.h" 1.17 + 1.18 +#include "libGLESv2/Texture.h" 1.19 +#include "libGLESv2/renderer/Renderer.h" 1.20 +#include "libGLESv2/utilities.h" 1.21 + 1.22 +namespace gl 1.23 +{ 1.24 +unsigned int RenderbufferStorage::mCurrentSerial = 1; 1.25 + 1.26 +RenderbufferInterface::RenderbufferInterface() 1.27 +{ 1.28 +} 1.29 + 1.30 +// The default case for classes inherited from RenderbufferInterface is not to 1.31 +// need to do anything upon the reference count to the parent Renderbuffer incrementing 1.32 +// or decrementing. 1.33 +void RenderbufferInterface::addProxyRef(const Renderbuffer *proxy) 1.34 +{ 1.35 +} 1.36 + 1.37 +void RenderbufferInterface::releaseProxy(const Renderbuffer *proxy) 1.38 +{ 1.39 +} 1.40 + 1.41 +GLuint RenderbufferInterface::getRedSize() const 1.42 +{ 1.43 + return gl::GetRedSize(getActualFormat()); 1.44 +} 1.45 + 1.46 +GLuint RenderbufferInterface::getGreenSize() const 1.47 +{ 1.48 + return gl::GetGreenSize(getActualFormat()); 1.49 +} 1.50 + 1.51 +GLuint RenderbufferInterface::getBlueSize() const 1.52 +{ 1.53 + return gl::GetBlueSize(getActualFormat()); 1.54 +} 1.55 + 1.56 +GLuint RenderbufferInterface::getAlphaSize() const 1.57 +{ 1.58 + return gl::GetAlphaSize(getActualFormat()); 1.59 +} 1.60 + 1.61 +GLuint RenderbufferInterface::getDepthSize() const 1.62 +{ 1.63 + return gl::GetDepthSize(getActualFormat()); 1.64 +} 1.65 + 1.66 +GLuint RenderbufferInterface::getStencilSize() const 1.67 +{ 1.68 + return gl::GetStencilSize(getActualFormat()); 1.69 +} 1.70 + 1.71 +///// RenderbufferTexture2D Implementation //////// 1.72 + 1.73 +RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLenum target) : mTarget(target) 1.74 +{ 1.75 + mTexture2D.set(texture); 1.76 +} 1.77 + 1.78 +RenderbufferTexture2D::~RenderbufferTexture2D() 1.79 +{ 1.80 + mTexture2D.set(NULL); 1.81 +} 1.82 + 1.83 +// Textures need to maintain their own reference count for references via 1.84 +// Renderbuffers acting as proxies. Here, we notify the texture of a reference. 1.85 +void RenderbufferTexture2D::addProxyRef(const Renderbuffer *proxy) 1.86 +{ 1.87 + mTexture2D->addProxyRef(proxy); 1.88 +} 1.89 + 1.90 +void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy) 1.91 +{ 1.92 + mTexture2D->releaseProxy(proxy); 1.93 +} 1.94 + 1.95 +rx::RenderTarget *RenderbufferTexture2D::getRenderTarget() 1.96 +{ 1.97 + return mTexture2D->getRenderTarget(mTarget); 1.98 +} 1.99 + 1.100 +rx::RenderTarget *RenderbufferTexture2D::getDepthStencil() 1.101 +{ 1.102 + return mTexture2D->getDepthStencil(mTarget); 1.103 +} 1.104 + 1.105 +GLsizei RenderbufferTexture2D::getWidth() const 1.106 +{ 1.107 + return mTexture2D->getWidth(0); 1.108 +} 1.109 + 1.110 +GLsizei RenderbufferTexture2D::getHeight() const 1.111 +{ 1.112 + return mTexture2D->getHeight(0); 1.113 +} 1.114 + 1.115 +GLenum RenderbufferTexture2D::getInternalFormat() const 1.116 +{ 1.117 + return mTexture2D->getInternalFormat(0); 1.118 +} 1.119 + 1.120 +GLenum RenderbufferTexture2D::getActualFormat() const 1.121 +{ 1.122 + return mTexture2D->getActualFormat(0); 1.123 +} 1.124 + 1.125 +GLsizei RenderbufferTexture2D::getSamples() const 1.126 +{ 1.127 + return 0; 1.128 +} 1.129 + 1.130 +unsigned int RenderbufferTexture2D::getSerial() const 1.131 +{ 1.132 + return mTexture2D->getRenderTargetSerial(mTarget); 1.133 +} 1.134 + 1.135 +///// RenderbufferTextureCubeMap Implementation //////// 1.136 + 1.137 +RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target) : mTarget(target) 1.138 +{ 1.139 + mTextureCubeMap.set(texture); 1.140 +} 1.141 + 1.142 +RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap() 1.143 +{ 1.144 + mTextureCubeMap.set(NULL); 1.145 +} 1.146 + 1.147 +// Textures need to maintain their own reference count for references via 1.148 +// Renderbuffers acting as proxies. Here, we notify the texture of a reference. 1.149 +void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy) 1.150 +{ 1.151 + mTextureCubeMap->addProxyRef(proxy); 1.152 +} 1.153 + 1.154 +void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy) 1.155 +{ 1.156 + mTextureCubeMap->releaseProxy(proxy); 1.157 +} 1.158 + 1.159 +rx::RenderTarget *RenderbufferTextureCubeMap::getRenderTarget() 1.160 +{ 1.161 + return mTextureCubeMap->getRenderTarget(mTarget); 1.162 +} 1.163 + 1.164 +rx::RenderTarget *RenderbufferTextureCubeMap::getDepthStencil() 1.165 +{ 1.166 + return NULL; 1.167 +} 1.168 + 1.169 +GLsizei RenderbufferTextureCubeMap::getWidth() const 1.170 +{ 1.171 + return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0); 1.172 +} 1.173 + 1.174 +GLsizei RenderbufferTextureCubeMap::getHeight() const 1.175 +{ 1.176 + return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0); 1.177 +} 1.178 + 1.179 +GLenum RenderbufferTextureCubeMap::getInternalFormat() const 1.180 +{ 1.181 + return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0); 1.182 +} 1.183 + 1.184 +GLenum RenderbufferTextureCubeMap::getActualFormat() const 1.185 +{ 1.186 + return mTextureCubeMap->getActualFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0); 1.187 +} 1.188 + 1.189 +GLsizei RenderbufferTextureCubeMap::getSamples() const 1.190 +{ 1.191 + return 0; 1.192 +} 1.193 + 1.194 +unsigned int RenderbufferTextureCubeMap::getSerial() const 1.195 +{ 1.196 + return mTextureCubeMap->getRenderTargetSerial(mTarget); 1.197 +} 1.198 + 1.199 +////// Renderbuffer Implementation ////// 1.200 + 1.201 +Renderbuffer::Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *instance) : RefCountObject(id) 1.202 +{ 1.203 + ASSERT(instance != NULL); 1.204 + mInstance = instance; 1.205 +} 1.206 + 1.207 +Renderbuffer::~Renderbuffer() 1.208 +{ 1.209 + delete mInstance; 1.210 +} 1.211 + 1.212 +// The RenderbufferInterface contained in this Renderbuffer may need to maintain 1.213 +// its own reference count, so we pass it on here. 1.214 +void Renderbuffer::addRef() const 1.215 +{ 1.216 + mInstance->addProxyRef(this); 1.217 + 1.218 + RefCountObject::addRef(); 1.219 +} 1.220 + 1.221 +void Renderbuffer::release() const 1.222 +{ 1.223 + mInstance->releaseProxy(this); 1.224 + 1.225 + RefCountObject::release(); 1.226 +} 1.227 + 1.228 +rx::RenderTarget *Renderbuffer::getRenderTarget() 1.229 +{ 1.230 + return mInstance->getRenderTarget(); 1.231 +} 1.232 + 1.233 +rx::RenderTarget *Renderbuffer::getDepthStencil() 1.234 +{ 1.235 + return mInstance->getDepthStencil(); 1.236 +} 1.237 + 1.238 +GLsizei Renderbuffer::getWidth() const 1.239 +{ 1.240 + return mInstance->getWidth(); 1.241 +} 1.242 + 1.243 +GLsizei Renderbuffer::getHeight() const 1.244 +{ 1.245 + return mInstance->getHeight(); 1.246 +} 1.247 + 1.248 +GLenum Renderbuffer::getInternalFormat() const 1.249 +{ 1.250 + return mInstance->getInternalFormat(); 1.251 +} 1.252 + 1.253 +GLenum Renderbuffer::getActualFormat() const 1.254 +{ 1.255 + return mInstance->getActualFormat(); 1.256 +} 1.257 + 1.258 +GLuint Renderbuffer::getRedSize() const 1.259 +{ 1.260 + return mInstance->getRedSize(); 1.261 +} 1.262 + 1.263 +GLuint Renderbuffer::getGreenSize() const 1.264 +{ 1.265 + return mInstance->getGreenSize(); 1.266 +} 1.267 + 1.268 +GLuint Renderbuffer::getBlueSize() const 1.269 +{ 1.270 + return mInstance->getBlueSize(); 1.271 +} 1.272 + 1.273 +GLuint Renderbuffer::getAlphaSize() const 1.274 +{ 1.275 + return mInstance->getAlphaSize(); 1.276 +} 1.277 + 1.278 +GLuint Renderbuffer::getDepthSize() const 1.279 +{ 1.280 + return mInstance->getDepthSize(); 1.281 +} 1.282 + 1.283 +GLuint Renderbuffer::getStencilSize() const 1.284 +{ 1.285 + return mInstance->getStencilSize(); 1.286 +} 1.287 + 1.288 +GLsizei Renderbuffer::getSamples() const 1.289 +{ 1.290 + return mInstance->getSamples(); 1.291 +} 1.292 + 1.293 +unsigned int Renderbuffer::getSerial() const 1.294 +{ 1.295 + return mInstance->getSerial(); 1.296 +} 1.297 + 1.298 +void Renderbuffer::setStorage(RenderbufferStorage *newStorage) 1.299 +{ 1.300 + ASSERT(newStorage != NULL); 1.301 + 1.302 + delete mInstance; 1.303 + mInstance = newStorage; 1.304 +} 1.305 + 1.306 +RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial()) 1.307 +{ 1.308 + mWidth = 0; 1.309 + mHeight = 0; 1.310 + mInternalFormat = GL_RGBA4; 1.311 + mActualFormat = GL_RGBA8_OES; 1.312 + mSamples = 0; 1.313 +} 1.314 + 1.315 +RenderbufferStorage::~RenderbufferStorage() 1.316 +{ 1.317 +} 1.318 + 1.319 +rx::RenderTarget *RenderbufferStorage::getRenderTarget() 1.320 +{ 1.321 + return NULL; 1.322 +} 1.323 + 1.324 +rx::RenderTarget *RenderbufferStorage::getDepthStencil() 1.325 +{ 1.326 + return NULL; 1.327 +} 1.328 + 1.329 +GLsizei RenderbufferStorage::getWidth() const 1.330 +{ 1.331 + return mWidth; 1.332 +} 1.333 + 1.334 +GLsizei RenderbufferStorage::getHeight() const 1.335 +{ 1.336 + return mHeight; 1.337 +} 1.338 + 1.339 +GLenum RenderbufferStorage::getInternalFormat() const 1.340 +{ 1.341 + return mInternalFormat; 1.342 +} 1.343 + 1.344 +GLenum RenderbufferStorage::getActualFormat() const 1.345 +{ 1.346 + return mActualFormat; 1.347 +} 1.348 + 1.349 +GLsizei RenderbufferStorage::getSamples() const 1.350 +{ 1.351 + return mSamples; 1.352 +} 1.353 + 1.354 +unsigned int RenderbufferStorage::getSerial() const 1.355 +{ 1.356 + return mSerial; 1.357 +} 1.358 + 1.359 +unsigned int RenderbufferStorage::issueSerial() 1.360 +{ 1.361 + return mCurrentSerial++; 1.362 +} 1.363 + 1.364 +unsigned int RenderbufferStorage::issueCubeSerials() 1.365 +{ 1.366 + unsigned int firstSerial = mCurrentSerial; 1.367 + mCurrentSerial += 6; 1.368 + return firstSerial; 1.369 +} 1.370 + 1.371 +Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain) 1.372 +{ 1.373 + mRenderTarget = renderer->createRenderTarget(swapChain, false); 1.374 + 1.375 + if (mRenderTarget) 1.376 + { 1.377 + mWidth = mRenderTarget->getWidth(); 1.378 + mHeight = mRenderTarget->getHeight(); 1.379 + mInternalFormat = mRenderTarget->getInternalFormat(); 1.380 + mActualFormat = mRenderTarget->getActualFormat(); 1.381 + mSamples = mRenderTarget->getSamples(); 1.382 + } 1.383 +} 1.384 + 1.385 +Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL) 1.386 +{ 1.387 + mRenderTarget = renderer->createRenderTarget(width, height, format, samples, false); 1.388 + 1.389 + if (mRenderTarget) 1.390 + { 1.391 + mWidth = width; 1.392 + mHeight = height; 1.393 + mInternalFormat = format; 1.394 + mActualFormat = mRenderTarget->getActualFormat(); 1.395 + mSamples = mRenderTarget->getSamples(); 1.396 + } 1.397 +} 1.398 + 1.399 +Colorbuffer::~Colorbuffer() 1.400 +{ 1.401 + if (mRenderTarget) 1.402 + { 1.403 + delete mRenderTarget; 1.404 + } 1.405 +} 1.406 + 1.407 +rx::RenderTarget *Colorbuffer::getRenderTarget() 1.408 +{ 1.409 + if (mRenderTarget) 1.410 + { 1.411 + return mRenderTarget; 1.412 + } 1.413 + 1.414 + return NULL; 1.415 +} 1.416 + 1.417 +DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain) 1.418 +{ 1.419 + mDepthStencil = renderer->createRenderTarget(swapChain, true); 1.420 + if (mDepthStencil) 1.421 + { 1.422 + mWidth = mDepthStencil->getWidth(); 1.423 + mHeight = mDepthStencil->getHeight(); 1.424 + mInternalFormat = mDepthStencil->getInternalFormat(); 1.425 + mSamples = mDepthStencil->getSamples(); 1.426 + mActualFormat = mDepthStencil->getActualFormat(); 1.427 + } 1.428 +} 1.429 + 1.430 +DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) 1.431 +{ 1.432 + 1.433 + mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples, true); 1.434 + 1.435 + mWidth = mDepthStencil->getWidth(); 1.436 + mHeight = mDepthStencil->getHeight(); 1.437 + mInternalFormat = GL_DEPTH24_STENCIL8_OES; 1.438 + mActualFormat = mDepthStencil->getActualFormat(); 1.439 + mSamples = mDepthStencil->getSamples(); 1.440 +} 1.441 + 1.442 +DepthStencilbuffer::~DepthStencilbuffer() 1.443 +{ 1.444 + if (mDepthStencil) 1.445 + { 1.446 + delete mDepthStencil; 1.447 + } 1.448 +} 1.449 + 1.450 +rx::RenderTarget *DepthStencilbuffer::getDepthStencil() 1.451 +{ 1.452 + if (mDepthStencil) 1.453 + { 1.454 + return mDepthStencil; 1.455 + } 1.456 + 1.457 + return NULL; 1.458 +} 1.459 + 1.460 +Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples) 1.461 +{ 1.462 + if (mDepthStencil) 1.463 + { 1.464 + mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function 1.465 + // will expect one of the valid renderbuffer formats for use in 1.466 + // glRenderbufferStorage 1.467 + } 1.468 +} 1.469 + 1.470 +Depthbuffer::~Depthbuffer() 1.471 +{ 1.472 +} 1.473 + 1.474 +Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples) 1.475 +{ 1.476 + if (mDepthStencil) 1.477 + { 1.478 + mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function 1.479 + // will expect one of the valid renderbuffer formats for use in 1.480 + // glRenderbufferStorage 1.481 + } 1.482 +} 1.483 + 1.484 +Stencilbuffer::~Stencilbuffer() 1.485 +{ 1.486 +} 1.487 + 1.488 +}