blob: eee179f9692f7de2e1c3ff9e0865ca4f0100dff4 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
daniel@transgaming.combdfb3912012-10-31 19:55:21 +00003// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// 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
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"
Geoff Lang391c8c52013-09-17 17:05:51 -040017#include "libGLESv2/renderer/TextureStorage.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000018#include "common/utilities.h"
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +000019#include "libGLESv2/formatutils.h"
Jamie Madille261b442014-06-25 12:42:21 -040020#include "libGLESv2/FramebufferAttachment.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021
22namespace gl
23{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000024unsigned int RenderbufferStorage::mCurrentSerial = 1;
daniel@transgaming.com092bd482010-05-12 03:39:36 +000025
Geoff Lange4a492b2014-06-19 14:14:41 -040026Renderbuffer::Renderbuffer(GLuint id, RenderbufferStorage *newStorage)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040027 : RefCountObject(id),
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040028 mStorage(newStorage)
29{
30 ASSERT(mStorage);
31}
32
33void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
34{
35 ASSERT(newStorage);
36
37 SafeDelete(mStorage);
38 mStorage = newStorage;
39}
40
41RenderbufferStorage *Renderbuffer::getStorage()
42{
43 ASSERT(mStorage);
44 return mStorage;
45}
46
47GLsizei Renderbuffer::getWidth() const
48{
49 ASSERT(mStorage);
50 return mStorage->getWidth();
51}
52
53GLsizei Renderbuffer::getHeight() const
54{
55 ASSERT(mStorage);
56 return mStorage->getHeight();
57}
58
59GLenum Renderbuffer::getInternalFormat() const
60{
61 ASSERT(mStorage);
62 return mStorage->getInternalFormat();
63}
64
65GLenum Renderbuffer::getActualFormat() const
66{
67 ASSERT(mStorage);
68 return mStorage->getActualFormat();
69}
70
71GLsizei Renderbuffer::getSamples() const
72{
73 ASSERT(mStorage);
74 return mStorage->getSamples();
75}
76
77GLuint Renderbuffer::getRedSize() const
78{
Geoff Lange4a492b2014-06-19 14:14:41 -040079 return gl::GetRedBits(getActualFormat());
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040080}
81
82GLuint Renderbuffer::getGreenSize() const
83{
Geoff Lange4a492b2014-06-19 14:14:41 -040084 return gl::GetGreenBits(getActualFormat());
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040085}
86
87GLuint Renderbuffer::getBlueSize() const
88{
Geoff Lange4a492b2014-06-19 14:14:41 -040089 return gl::GetBlueBits(getActualFormat());
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040090}
91
92GLuint Renderbuffer::getAlphaSize() const
93{
Geoff Lange4a492b2014-06-19 14:14:41 -040094 return gl::GetAlphaBits(getActualFormat());
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040095}
96
97GLuint Renderbuffer::getDepthSize() const
98{
Geoff Lange4a492b2014-06-19 14:14:41 -040099 return gl::GetDepthBits(getActualFormat());
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400100}
101
102GLuint Renderbuffer::getStencilSize() const
103{
Geoff Lange4a492b2014-06-19 14:14:41 -0400104 return gl::GetStencilBits(getActualFormat());
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400105}
106
Geoff Lang8040f572013-07-25 16:49:54 -0400107RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1))
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000108{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000109 mWidth = 0;
110 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000111 mInternalFormat = GL_RGBA4;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000112 mActualFormat = GL_RGBA8_OES;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000113 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000114}
115
116RenderbufferStorage::~RenderbufferStorage()
117{
118}
119
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000120rx::RenderTarget *RenderbufferStorage::getRenderTarget()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000121{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000122 return NULL;
123}
124
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000125rx::RenderTarget *RenderbufferStorage::getDepthStencil()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000126{
127 return NULL;
128}
129
Geoff Lang391c8c52013-09-17 17:05:51 -0400130rx::TextureStorage *RenderbufferStorage::getTextureStorage()
131{
132 return NULL;
133}
134
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000135GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136{
137 return mWidth;
138}
139
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000140GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000141{
142 return mHeight;
143}
144
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000145GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000146{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000147 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000148}
149
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000150GLenum RenderbufferStorage::getActualFormat() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000151{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000152 return mActualFormat;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000153}
154
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000155GLsizei RenderbufferStorage::getSamples() const
156{
157 return mSamples;
158}
159
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000160unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000161{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000162 return mSerial;
163}
164
Geoff Lang8040f572013-07-25 16:49:54 -0400165unsigned int RenderbufferStorage::issueSerials(GLuint count)
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000166{
167 unsigned int firstSerial = mCurrentSerial;
Geoff Lang8040f572013-07-25 16:49:54 -0400168 mCurrentSerial += count;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000169 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000170}
171
Geoff Lang784371d2014-05-16 12:39:04 -0400172bool RenderbufferStorage::isTexture() const
173{
174 return false;
175}
176
177unsigned int RenderbufferStorage::getTextureSerial() const
178{
179 return -1;
180}
181
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000182Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000183{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000184 mRenderTarget = renderer->createRenderTarget(swapChain, false);
185
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000186 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000187 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000188 mWidth = mRenderTarget->getWidth();
189 mHeight = mRenderTarget->getHeight();
190 mInternalFormat = mRenderTarget->getInternalFormat();
191 mActualFormat = mRenderTarget->getActualFormat();
192 mSamples = mRenderTarget->getSamples();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000193 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000194}
195
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000196Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000197{
Geoff Langa2d97f12013-06-11 11:44:02 -0400198 mRenderTarget = renderer->createRenderTarget(width, height, format, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000199
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000200 if (mRenderTarget)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000201 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000202 mWidth = width;
203 mHeight = height;
204 mInternalFormat = format;
205 mActualFormat = mRenderTarget->getActualFormat();
206 mSamples = mRenderTarget->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000207 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000208}
209
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000210Colorbuffer::~Colorbuffer()
211{
212 if (mRenderTarget)
213 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000214 delete mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000215 }
216}
217
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000218rx::RenderTarget *Colorbuffer::getRenderTarget()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000219{
Geoff Lang8040f572013-07-25 16:49:54 -0400220 return mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000221}
222
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000223DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000224{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000225 mDepthStencil = renderer->createRenderTarget(swapChain, true);
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000226 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000227 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000228 mWidth = mDepthStencil->getWidth();
229 mHeight = mDepthStencil->getHeight();
230 mInternalFormat = mDepthStencil->getInternalFormat();
231 mSamples = mDepthStencil->getSamples();
232 mActualFormat = mDepthStencil->getActualFormat();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000233 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000234}
235
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000236DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000237{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238
Geoff Langa2d97f12013-06-11 11:44:02 -0400239 mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000240
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000241 mWidth = mDepthStencil->getWidth();
242 mHeight = mDepthStencil->getHeight();
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000243 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000244 mActualFormat = mDepthStencil->getActualFormat();
245 mSamples = mDepthStencil->getSamples();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000246}
247
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000248DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000249{
250 if (mDepthStencil)
251 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000252 delete mDepthStencil;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253 }
254}
255
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000256rx::RenderTarget *DepthStencilbuffer::getDepthStencil()
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000257{
Geoff Lang8040f572013-07-25 16:49:54 -0400258 return mDepthStencil;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000259}
260
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000261Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000262{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000263 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000264 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000265 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
266 // will expect one of the valid renderbuffer formats for use in
267 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000268 }
269}
270
271Depthbuffer::~Depthbuffer()
272{
273}
274
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000275Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000276{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000277 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000278 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000279 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
280 // will expect one of the valid renderbuffer formats for use in
281 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000282 }
283}
284
285Stencilbuffer::~Stencilbuffer()
286{
287}
288
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000289}