blob: 32b2c0d7701e147929337979fce83b4bb96bfe9d [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.combdfb3912012-10-31 19:55:21 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// 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
Jamie Madillea247592014-08-28 10:37:08 -040011#include "libGLESv2/common_includes.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000012#include "libGLESv2/Renderbuffer.h"
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000013#include "libGLESv2/renderer/RenderTarget.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000014
enne@chromium.org0fa74632010-09-21 16:18:52 +000015#include "libGLESv2/Texture.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000016#include "libGLESv2/renderer/Renderer.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000017#include "common/utilities.h"
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +000018#include "libGLESv2/formatutils.h"
Jamie Madille261b442014-06-25 12:42:21 -040019#include "libGLESv2/FramebufferAttachment.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020
21namespace gl
22{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000023unsigned int RenderbufferStorage::mCurrentSerial = 1;
daniel@transgaming.com092bd482010-05-12 03:39:36 +000024
Geoff Lange4a492b2014-06-19 14:14:41 -040025Renderbuffer::Renderbuffer(GLuint id, RenderbufferStorage *newStorage)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040026 : RefCountObject(id),
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040027 mStorage(newStorage)
28{
29 ASSERT(mStorage);
30}
31
Cooper Partin75c42f42014-08-11 10:16:44 -070032Renderbuffer::~Renderbuffer()
33{
34 SafeDelete(mStorage);
35}
36
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040037void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
38{
39 ASSERT(newStorage);
40
41 SafeDelete(mStorage);
42 mStorage = newStorage;
43}
44
45RenderbufferStorage *Renderbuffer::getStorage()
46{
47 ASSERT(mStorage);
48 return mStorage;
49}
50
51GLsizei Renderbuffer::getWidth() const
52{
53 ASSERT(mStorage);
54 return mStorage->getWidth();
55}
56
57GLsizei Renderbuffer::getHeight() const
58{
59 ASSERT(mStorage);
60 return mStorage->getHeight();
61}
62
63GLenum Renderbuffer::getInternalFormat() const
64{
65 ASSERT(mStorage);
66 return mStorage->getInternalFormat();
67}
68
69GLenum Renderbuffer::getActualFormat() const
70{
71 ASSERT(mStorage);
72 return mStorage->getActualFormat();
73}
74
75GLsizei Renderbuffer::getSamples() const
76{
77 ASSERT(mStorage);
78 return mStorage->getSamples();
79}
80
81GLuint Renderbuffer::getRedSize() const
82{
Geoff Lang5d601382014-07-22 15:14:06 -040083 return GetInternalFormatInfo(getActualFormat()).redBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040084}
85
86GLuint Renderbuffer::getGreenSize() const
87{
Geoff Lang5d601382014-07-22 15:14:06 -040088 return GetInternalFormatInfo(getActualFormat()).greenBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040089}
90
91GLuint Renderbuffer::getBlueSize() const
92{
Geoff Lang5d601382014-07-22 15:14:06 -040093 return GetInternalFormatInfo(getActualFormat()).blueBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040094}
95
96GLuint Renderbuffer::getAlphaSize() const
97{
Geoff Lang5d601382014-07-22 15:14:06 -040098 return GetInternalFormatInfo(getActualFormat()).alphaBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040099}
100
101GLuint Renderbuffer::getDepthSize() const
102{
Geoff Lang5d601382014-07-22 15:14:06 -0400103 return GetInternalFormatInfo(getActualFormat()).depthBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400104}
105
106GLuint Renderbuffer::getStencilSize() const
107{
Geoff Lang5d601382014-07-22 15:14:06 -0400108 return GetInternalFormatInfo(getActualFormat()).stencilBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400109}
110
Geoff Lang8040f572013-07-25 16:49:54 -0400111RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1))
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000112{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000113 mWidth = 0;
114 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000115 mInternalFormat = GL_RGBA4;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000116 mActualFormat = GL_RGBA8_OES;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000117 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000118}
119
120RenderbufferStorage::~RenderbufferStorage()
121{
122}
123
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000124rx::RenderTarget *RenderbufferStorage::getRenderTarget()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000125{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000126 return NULL;
127}
128
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000129rx::RenderTarget *RenderbufferStorage::getDepthStencil()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000130{
131 return NULL;
132}
133
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000134GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135{
136 return mWidth;
137}
138
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000139GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140{
141 return mHeight;
142}
143
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000144GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000145{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000146 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000147}
148
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000149GLenum RenderbufferStorage::getActualFormat() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000150{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000151 return mActualFormat;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000152}
153
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000154GLsizei RenderbufferStorage::getSamples() const
155{
156 return mSamples;
157}
158
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000159unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000160{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000161 return mSerial;
162}
163
Geoff Lang8040f572013-07-25 16:49:54 -0400164unsigned int RenderbufferStorage::issueSerials(GLuint count)
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000165{
166 unsigned int firstSerial = mCurrentSerial;
Geoff Lang8040f572013-07-25 16:49:54 -0400167 mCurrentSerial += count;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000168 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000169}
170
Geoff Lang784371d2014-05-16 12:39:04 -0400171bool RenderbufferStorage::isTexture() const
172{
173 return false;
174}
175
176unsigned int RenderbufferStorage::getTextureSerial() const
177{
178 return -1;
179}
180
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000181Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000182{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000183 mRenderTarget = renderer->createRenderTarget(swapChain, false);
184
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000185 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000186 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000187 mWidth = mRenderTarget->getWidth();
188 mHeight = mRenderTarget->getHeight();
189 mInternalFormat = mRenderTarget->getInternalFormat();
190 mActualFormat = mRenderTarget->getActualFormat();
191 mSamples = mRenderTarget->getSamples();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000192 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000193}
194
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000195Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000196{
Geoff Langa2d97f12013-06-11 11:44:02 -0400197 mRenderTarget = renderer->createRenderTarget(width, height, format, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000198
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000199 if (mRenderTarget)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000200 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000201 mWidth = width;
202 mHeight = height;
203 mInternalFormat = format;
204 mActualFormat = mRenderTarget->getActualFormat();
205 mSamples = mRenderTarget->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000206 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000207}
208
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209Colorbuffer::~Colorbuffer()
210{
211 if (mRenderTarget)
212 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000213 delete mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000214 }
215}
216
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000217rx::RenderTarget *Colorbuffer::getRenderTarget()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000218{
Geoff Lang8040f572013-07-25 16:49:54 -0400219 return mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220}
221
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000222DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000223{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000224 mDepthStencil = renderer->createRenderTarget(swapChain, true);
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000225 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000227 mWidth = mDepthStencil->getWidth();
228 mHeight = mDepthStencil->getHeight();
229 mInternalFormat = mDepthStencil->getInternalFormat();
230 mSamples = mDepthStencil->getSamples();
231 mActualFormat = mDepthStencil->getActualFormat();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000232 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233}
234
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000235DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000236{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000237
Geoff Langa2d97f12013-06-11 11:44:02 -0400238 mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000239
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000240 mWidth = mDepthStencil->getWidth();
241 mHeight = mDepthStencil->getHeight();
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000242 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000243 mActualFormat = mDepthStencil->getActualFormat();
244 mSamples = mDepthStencil->getSamples();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000245}
246
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000247DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000248{
249 if (mDepthStencil)
250 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000251 delete mDepthStencil;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000252 }
253}
254
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000255rx::RenderTarget *DepthStencilbuffer::getDepthStencil()
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000256{
Geoff Lang8040f572013-07-25 16:49:54 -0400257 return mDepthStencil;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000258}
259
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000260Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000261{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000262 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000263 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000264 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
265 // will expect one of the valid renderbuffer formats for use in
266 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000267 }
268}
269
270Depthbuffer::~Depthbuffer()
271{
272}
273
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000274Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000275{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000276 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000277 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000278 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
279 // will expect one of the valid renderbuffer formats for use in
280 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000281 }
282}
283
284Stencilbuffer::~Stencilbuffer()
285{
286}
287
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000288}