1// 2// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. 3// Use of this source code is governed by a BSD-style license that can be 4// found in the LICENSE file. 5// 6 7// Renderbuffer.cpp: the gl::Renderbuffer class and its derived classes 8// Colorbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer 9// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. 10 11#include "libGLESv2/Renderbuffer.h" 12#include "libGLESv2/Texture.h" 13#include "libGLESv2/formatutils.h" 14#include "libGLESv2/FramebufferAttachment.h" 15#include "libGLESv2/renderer/Renderer.h" 16#include "libGLESv2/renderer/RenderTarget.h" 17 18#include "common/utilities.h" 19 20namespace gl 21{ 22unsigned int RenderbufferStorage::mCurrentSerial = 1; 23 24Renderbuffer::Renderbuffer(GLuint id, RenderbufferStorage *newStorage) 25 : RefCountObject(id), 26 mStorage(newStorage) 27{ 28 ASSERT(mStorage); 29} 30 31Renderbuffer::~Renderbuffer() 32{ 33 SafeDelete(mStorage); 34} 35 36void Renderbuffer::setStorage(RenderbufferStorage *newStorage) 37{ 38 ASSERT(newStorage); 39 40 SafeDelete(mStorage); 41 mStorage = newStorage; 42} 43 44RenderbufferStorage *Renderbuffer::getStorage() 45{ 46 ASSERT(mStorage); 47 return mStorage; 48} 49 50GLsizei Renderbuffer::getWidth() const 51{ 52 ASSERT(mStorage); 53 return mStorage->getWidth(); 54} 55 56GLsizei Renderbuffer::getHeight() const 57{ 58 ASSERT(mStorage); 59 return mStorage->getHeight(); 60} 61 62GLenum Renderbuffer::getInternalFormat() const 63{ 64 ASSERT(mStorage); 65 return mStorage->getInternalFormat(); 66} 67 68GLenum Renderbuffer::getActualFormat() const 69{ 70 ASSERT(mStorage); 71 return mStorage->getActualFormat(); 72} 73 74GLsizei Renderbuffer::getSamples() const 75{ 76 ASSERT(mStorage); 77 return mStorage->getSamples(); 78} 79 80GLuint Renderbuffer::getRedSize() const 81{ 82 return GetInternalFormatInfo(getActualFormat()).redBits; 83} 84 85GLuint Renderbuffer::getGreenSize() const 86{ 87 return GetInternalFormatInfo(getActualFormat()).greenBits; 88} 89 90GLuint Renderbuffer::getBlueSize() const 91{ 92 return GetInternalFormatInfo(getActualFormat()).blueBits; 93} 94 95GLuint Renderbuffer::getAlphaSize() const 96{ 97 return GetInternalFormatInfo(getActualFormat()).alphaBits; 98} 99 100GLuint Renderbuffer::getDepthSize() const 101{ 102 return GetInternalFormatInfo(getActualFormat()).depthBits; 103} 104 105GLuint Renderbuffer::getStencilSize() const 106{ 107 return GetInternalFormatInfo(getActualFormat()).stencilBits; 108} 109 110RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1)) 111{ 112 mWidth = 0; 113 mHeight = 0; 114 mInternalFormat = GL_RGBA4; 115 mActualFormat = GL_RGBA8_OES; 116 mSamples = 0; 117} 118 119RenderbufferStorage::~RenderbufferStorage() 120{ 121} 122 123rx::RenderTarget *RenderbufferStorage::getRenderTarget() 124{ 125 return NULL; 126} 127 128GLsizei RenderbufferStorage::getWidth() const 129{ 130 return mWidth; 131} 132 133GLsizei RenderbufferStorage::getHeight() const 134{ 135 return mHeight; 136} 137 138GLenum RenderbufferStorage::getInternalFormat() const 139{ 140 return mInternalFormat; 141} 142 143GLenum RenderbufferStorage::getActualFormat() const 144{ 145 return mActualFormat; 146} 147 148GLsizei RenderbufferStorage::getSamples() const 149{ 150 return mSamples; 151} 152 153unsigned int RenderbufferStorage::getSerial() const 154{ 155 return mSerial; 156} 157 158unsigned int RenderbufferStorage::issueSerials(unsigned int count) 159{ 160 unsigned int firstSerial = mCurrentSerial; 161 mCurrentSerial += count; 162 return firstSerial; 163} 164 165bool RenderbufferStorage::isTexture() const 166{ 167 return false; 168} 169 170unsigned int RenderbufferStorage::getTextureSerial() const 171{ 172 return -1; 173} 174 175Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain) 176{ 177 mRenderTarget = renderer->createRenderTarget(swapChain, false); 178 179 if (mRenderTarget) 180 { 181 mWidth = mRenderTarget->getWidth(); 182 mHeight = mRenderTarget->getHeight(); 183 mInternalFormat = mRenderTarget->getInternalFormat(); 184 mActualFormat = mRenderTarget->getActualFormat(); 185 mSamples = mRenderTarget->getSamples(); 186 } 187} 188 189Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL) 190{ 191 mRenderTarget = renderer->createRenderTarget(width, height, format, samples); 192 193 if (mRenderTarget) 194 { 195 mWidth = width; 196 mHeight = height; 197 mInternalFormat = format; 198 mActualFormat = mRenderTarget->getActualFormat(); 199 mSamples = mRenderTarget->getSamples(); 200 } 201} 202 203Colorbuffer::~Colorbuffer() 204{ 205 if (mRenderTarget) 206 { 207 delete mRenderTarget; 208 } 209} 210 211rx::RenderTarget *Colorbuffer::getRenderTarget() 212{ 213 return mRenderTarget; 214} 215 216DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain) 217{ 218 mDepthStencil = renderer->createRenderTarget(swapChain, true); 219 if (mDepthStencil) 220 { 221 mWidth = mDepthStencil->getWidth(); 222 mHeight = mDepthStencil->getHeight(); 223 mInternalFormat = mDepthStencil->getInternalFormat(); 224 mSamples = mDepthStencil->getSamples(); 225 mActualFormat = mDepthStencil->getActualFormat(); 226 } 227} 228 229DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) 230{ 231 232 mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples); 233 234 mWidth = mDepthStencil->getWidth(); 235 mHeight = mDepthStencil->getHeight(); 236 mInternalFormat = GL_DEPTH24_STENCIL8_OES; 237 mActualFormat = mDepthStencil->getActualFormat(); 238 mSamples = mDepthStencil->getSamples(); 239} 240 241DepthStencilbuffer::~DepthStencilbuffer() 242{ 243 if (mDepthStencil) 244 { 245 delete mDepthStencil; 246 } 247} 248 249rx::RenderTarget *DepthStencilbuffer::getRenderTarget() 250{ 251 return mDepthStencil; 252} 253 254Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples) 255{ 256 if (mDepthStencil) 257 { 258 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function 259 // will expect one of the valid renderbuffer formats for use in 260 // glRenderbufferStorage 261 } 262} 263 264Depthbuffer::~Depthbuffer() 265{ 266} 267 268Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples) 269{ 270 if (mDepthStencil) 271 { 272 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function 273 // will expect one of the valid renderbuffer formats for use in 274 // glRenderbufferStorage 275 } 276} 277 278Stencilbuffer::~Stencilbuffer() 279{ 280} 281 282} 283