blob: 285190876bba61a23de57624ab12e6e489a87b14 [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"
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
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000025RenderbufferInterface::RenderbufferInterface()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000027}
28
daniel@transgaming.com2678b342012-01-18 16:29:40 +000029// The default case for classes inherited from RenderbufferInterface is not to
30// need to do anything upon the reference count to the parent Renderbuffer incrementing
31// or decrementing.
32void RenderbufferInterface::addProxyRef(const Renderbuffer *proxy)
33{
34}
35
36void RenderbufferInterface::releaseProxy(const Renderbuffer *proxy)
37{
38}
39
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000040///// RenderbufferTexture2D Implementation ////////
41
Geoff Lang8040f572013-07-25 16:49:54 -040042RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLint level) : mLevel(level)
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000043{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000044 mTexture2D.set(texture);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000045}
46
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000047RenderbufferTexture2D::~RenderbufferTexture2D()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000048{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000049 mTexture2D.set(NULL);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000050}
51
daniel@transgaming.com2678b342012-01-18 16:29:40 +000052// Textures need to maintain their own reference count for references via
53// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000054void RenderbufferTexture2D::addProxyRef(const Renderbuffer *proxy)
daniel@transgaming.com2678b342012-01-18 16:29:40 +000055{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000056 mTexture2D->addProxyRef(proxy);
daniel@transgaming.com2678b342012-01-18 16:29:40 +000057}
58
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000059void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
daniel@transgaming.com2678b342012-01-18 16:29:40 +000060{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000061 mTexture2D->releaseProxy(proxy);
daniel@transgaming.com2678b342012-01-18 16:29:40 +000062}
63
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000064rx::RenderTarget *RenderbufferTexture2D::getRenderTarget()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000065{
Geoff Lang8040f572013-07-25 16:49:54 -040066 return mTexture2D->getRenderTarget(mLevel);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000067}
68
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000069rx::RenderTarget *RenderbufferTexture2D::getDepthStencil()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000070{
Geoff Lang8040f572013-07-25 16:49:54 -040071 return mTexture2D->getDepthSencil(mLevel);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000072}
73
Geoff Lang391c8c52013-09-17 17:05:51 -040074rx::TextureStorage *RenderbufferTexture2D::getTextureStorage()
75{
76 return mTexture2D->getNativeTexture()->getStorageInstance();
77}
78
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000079GLsizei RenderbufferTexture2D::getWidth() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000080{
Geoff Lang8040f572013-07-25 16:49:54 -040081 return mTexture2D->getWidth(mLevel);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000082}
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000083
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000084GLsizei RenderbufferTexture2D::getHeight() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000085{
Geoff Lang8040f572013-07-25 16:49:54 -040086 return mTexture2D->getHeight(mLevel);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000087}
88
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000089GLenum RenderbufferTexture2D::getInternalFormat() const
90{
Geoff Lang8040f572013-07-25 16:49:54 -040091 return mTexture2D->getInternalFormat(mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000092}
93
daniel@transgaming.com20d36662012-10-31 19:51:43 +000094GLenum RenderbufferTexture2D::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000095{
Geoff Lang8040f572013-07-25 16:49:54 -040096 return mTexture2D->getActualFormat(mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000097}
98
99GLsizei RenderbufferTexture2D::getSamples() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000100{
101 return 0;
102}
103
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000104unsigned int RenderbufferTexture2D::getSerial() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000105{
Geoff Lang8040f572013-07-25 16:49:54 -0400106 return mTexture2D->getRenderTargetSerial(mLevel);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000107}
108
Geoff Lang784371d2014-05-16 12:39:04 -0400109bool RenderbufferTexture2D::isTexture() const
110{
111 return true;
112}
113
Jamie Madillbfcda812013-10-22 13:07:33 -0400114unsigned int RenderbufferTexture2D::getTextureSerial() const
115{
116 return mTexture2D->getTextureSerial();
117}
118
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000119///// RenderbufferTextureCubeMap Implementation ////////
120
Geoff Lang8040f572013-07-25 16:49:54 -0400121RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum faceTarget, GLint level)
122 : mFaceTarget(faceTarget), mLevel(level)
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000123{
124 mTextureCubeMap.set(texture);
125}
126
127RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
128{
129 mTextureCubeMap.set(NULL);
130}
131
132// Textures need to maintain their own reference count for references via
133// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
134void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
135{
136 mTextureCubeMap->addProxyRef(proxy);
137}
138
139void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
140{
141 mTextureCubeMap->releaseProxy(proxy);
142}
143
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000144rx::RenderTarget *RenderbufferTextureCubeMap::getRenderTarget()
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000145{
Geoff Lang8040f572013-07-25 16:49:54 -0400146 return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000147}
148
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000149rx::RenderTarget *RenderbufferTextureCubeMap::getDepthStencil()
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000150{
Geoff Lang8040f572013-07-25 16:49:54 -0400151 return mTextureCubeMap->getDepthStencil(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000152}
153
Geoff Lang391c8c52013-09-17 17:05:51 -0400154rx::TextureStorage *RenderbufferTextureCubeMap::getTextureStorage()
155{
156 return mTextureCubeMap->getNativeTexture()->getStorageInstance();
157}
158
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000159GLsizei RenderbufferTextureCubeMap::getWidth() const
160{
Geoff Lang8040f572013-07-25 16:49:54 -0400161 return mTextureCubeMap->getWidth(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000162}
163
164GLsizei RenderbufferTextureCubeMap::getHeight() const
165{
Geoff Lang8040f572013-07-25 16:49:54 -0400166 return mTextureCubeMap->getHeight(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000167}
168
169GLenum RenderbufferTextureCubeMap::getInternalFormat() const
170{
Geoff Lang8040f572013-07-25 16:49:54 -0400171 return mTextureCubeMap->getInternalFormat(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000172}
173
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000174GLenum RenderbufferTextureCubeMap::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000175{
Geoff Lang8040f572013-07-25 16:49:54 -0400176 return mTextureCubeMap->getActualFormat(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000177}
178
179GLsizei RenderbufferTextureCubeMap::getSamples() const
180{
181 return 0;
182}
183
184unsigned int RenderbufferTextureCubeMap::getSerial() const
185{
Geoff Lang8040f572013-07-25 16:49:54 -0400186 return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000187}
188
Geoff Lang784371d2014-05-16 12:39:04 -0400189bool RenderbufferTextureCubeMap::isTexture() const
190{
191 return true;
192}
193
Jamie Madillbfcda812013-10-22 13:07:33 -0400194unsigned int RenderbufferTextureCubeMap::getTextureSerial() const
195{
196 return mTextureCubeMap->getTextureSerial();
197}
198
Geoff Langd5d8e392013-07-25 16:53:03 -0400199///// RenderbufferTexture3DLayer Implementation ////////
200
201RenderbufferTexture3DLayer::RenderbufferTexture3DLayer(Texture3D *texture, GLint level, GLint layer)
202 : mLevel(level), mLayer(layer)
203{
204 mTexture3D.set(texture);
205}
206
207RenderbufferTexture3DLayer::~RenderbufferTexture3DLayer()
208{
209 mTexture3D.set(NULL);
210}
211
212// Textures need to maintain their own reference count for references via
213// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
214void RenderbufferTexture3DLayer::addProxyRef(const Renderbuffer *proxy)
215{
216 mTexture3D->addProxyRef(proxy);
217}
218
219void RenderbufferTexture3DLayer::releaseProxy(const Renderbuffer *proxy)
220{
221 mTexture3D->releaseProxy(proxy);
222}
223
224rx::RenderTarget *RenderbufferTexture3DLayer::getRenderTarget()
225{
226 return mTexture3D->getRenderTarget(mLevel, mLayer);
227}
228
229rx::RenderTarget *RenderbufferTexture3DLayer::getDepthStencil()
230{
231 return mTexture3D->getDepthStencil(mLevel, mLayer);
232}
233
Geoff Lang391c8c52013-09-17 17:05:51 -0400234rx::TextureStorage *RenderbufferTexture3DLayer::getTextureStorage()
235{
236 return mTexture3D->getNativeTexture()->getStorageInstance();
237}
238
Geoff Langd5d8e392013-07-25 16:53:03 -0400239GLsizei RenderbufferTexture3DLayer::getWidth() const
240{
241 return mTexture3D->getWidth(mLevel);
242}
243
244GLsizei RenderbufferTexture3DLayer::getHeight() const
245{
246 return mTexture3D->getHeight(mLevel);
247}
248
249GLenum RenderbufferTexture3DLayer::getInternalFormat() const
250{
251 return mTexture3D->getInternalFormat(mLevel);
252}
253
254GLenum RenderbufferTexture3DLayer::getActualFormat() const
255{
256 return mTexture3D->getActualFormat(mLevel);
257}
258
259GLsizei RenderbufferTexture3DLayer::getSamples() const
260{
261 return 0;
262}
263
264unsigned int RenderbufferTexture3DLayer::getSerial() const
265{
266 return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
267}
268
Geoff Lang784371d2014-05-16 12:39:04 -0400269bool RenderbufferTexture3DLayer::isTexture() const
270{
271 return true;
272}
273
Jamie Madillbfcda812013-10-22 13:07:33 -0400274unsigned int RenderbufferTexture3DLayer::getTextureSerial() const
275{
276 return mTexture3D->getTextureSerial();
277}
278
Geoff Langd5d8e392013-07-25 16:53:03 -0400279////// RenderbufferTexture2DArrayLayer Implementation //////
280
281RenderbufferTexture2DArrayLayer::RenderbufferTexture2DArrayLayer(Texture2DArray *texture, GLint level, GLint layer)
282 : mLevel(level), mLayer(layer)
283{
284 mTexture2DArray.set(texture);
285}
286
287RenderbufferTexture2DArrayLayer::~RenderbufferTexture2DArrayLayer()
288{
289 mTexture2DArray.set(NULL);
290}
291
292void RenderbufferTexture2DArrayLayer::addProxyRef(const Renderbuffer *proxy)
293{
294 mTexture2DArray->addProxyRef(proxy);
295}
296
297void RenderbufferTexture2DArrayLayer::releaseProxy(const Renderbuffer *proxy)
298{
299 mTexture2DArray->releaseProxy(proxy);
300}
301
302rx::RenderTarget *RenderbufferTexture2DArrayLayer::getRenderTarget()
303{
304 return mTexture2DArray->getRenderTarget(mLevel, mLayer);
305}
306
307rx::RenderTarget *RenderbufferTexture2DArrayLayer::getDepthStencil()
308{
309 return mTexture2DArray->getDepthStencil(mLevel, mLayer);
310}
311
Geoff Lang391c8c52013-09-17 17:05:51 -0400312rx::TextureStorage *RenderbufferTexture2DArrayLayer::getTextureStorage()
313{
314 return mTexture2DArray->getNativeTexture()->getStorageInstance();
315}
316
Geoff Langd5d8e392013-07-25 16:53:03 -0400317GLsizei RenderbufferTexture2DArrayLayer::getWidth() const
318{
319 return mTexture2DArray->getWidth(mLevel);
320}
321
322GLsizei RenderbufferTexture2DArrayLayer::getHeight() const
323{
324 return mTexture2DArray->getHeight(mLevel);
325}
326
327GLenum RenderbufferTexture2DArrayLayer::getInternalFormat() const
328{
329 return mTexture2DArray->getInternalFormat(mLevel);
330}
331
332GLenum RenderbufferTexture2DArrayLayer::getActualFormat() const
333{
334 return mTexture2DArray->getActualFormat(mLevel);
335}
336
337GLsizei RenderbufferTexture2DArrayLayer::getSamples() const
338{
339 return 0;
340}
341
342unsigned int RenderbufferTexture2DArrayLayer::getSerial() const
343{
344 return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
345}
346
Geoff Lang784371d2014-05-16 12:39:04 -0400347bool RenderbufferTexture2DArrayLayer::isTexture() const
348{
349 return true;
350}
351
Jamie Madillbfcda812013-10-22 13:07:33 -0400352unsigned int RenderbufferTexture2DArrayLayer::getTextureSerial() const
353{
354 return mTexture2DArray->getTextureSerial();
355}
356
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000357////// Renderbuffer Implementation //////
358
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000359Renderbuffer::Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000360{
361 ASSERT(instance != NULL);
362 mInstance = instance;
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000363
364 ASSERT(renderer != NULL);
365 mRenderer = renderer;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000366}
367
368Renderbuffer::~Renderbuffer()
369{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000370 delete mInstance;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000371}
372
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000373// The RenderbufferInterface contained in this Renderbuffer may need to maintain
374// its own reference count, so we pass it on here.
375void Renderbuffer::addRef() const
376{
377 mInstance->addProxyRef(this);
378
379 RefCountObject::addRef();
380}
381
382void Renderbuffer::release() const
383{
384 mInstance->releaseProxy(this);
385
386 RefCountObject::release();
387}
388
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000389rx::RenderTarget *Renderbuffer::getRenderTarget()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000390{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000391 return mInstance->getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392}
393
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000394rx::RenderTarget *Renderbuffer::getDepthStencil()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000395{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000396 return mInstance->getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000397}
398
Geoff Lang391c8c52013-09-17 17:05:51 -0400399rx::TextureStorage *Renderbuffer::getTextureStorage()
400{
401 return mInstance->getTextureStorage();
402}
403
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000404GLsizei Renderbuffer::getWidth() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000405{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000406 return mInstance->getWidth();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000407}
408
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000409GLsizei Renderbuffer::getHeight() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000410{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000411 return mInstance->getHeight();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000412}
413
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000414GLenum Renderbuffer::getInternalFormat() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000415{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000416 return mInstance->getInternalFormat();
417}
418
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000419GLenum Renderbuffer::getActualFormat() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000420{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000421 return mInstance->getActualFormat();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000422}
423
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000424GLuint Renderbuffer::getRedSize() const
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000425{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000426 return gl::GetRedBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000427}
428
429GLuint Renderbuffer::getGreenSize() const
430{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000431 return gl::GetGreenBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000432}
433
434GLuint Renderbuffer::getBlueSize() const
435{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000436 return gl::GetBlueBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000437}
438
439GLuint Renderbuffer::getAlphaSize() const
440{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000441 return gl::GetAlphaBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000442}
443
444GLuint Renderbuffer::getDepthSize() const
445{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000446 return gl::GetDepthBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000447}
448
449GLuint Renderbuffer::getStencilSize() const
450{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000451 return gl::GetStencilBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000452}
453
Geoff Lang0a804792013-08-13 13:09:43 -0400454GLenum Renderbuffer::getComponentType() const
455{
456 return gl::GetComponentType(getActualFormat(), mRenderer->getCurrentClientVersion());
457}
458
459GLenum Renderbuffer::getColorEncoding() const
460{
461 return gl::GetColorEncoding(getActualFormat(), mRenderer->getCurrentClientVersion());
462}
463
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000464GLsizei Renderbuffer::getSamples() const
465{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000466 return mInstance->getSamples();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000467}
468
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000469unsigned int Renderbuffer::getSerial() const
470{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000471 return mInstance->getSerial();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000472}
473
Geoff Lang784371d2014-05-16 12:39:04 -0400474bool Renderbuffer::isTexture() const
475{
476 return mInstance->isTexture();
477}
478
Jamie Madillbfcda812013-10-22 13:07:33 -0400479unsigned int Renderbuffer::getTextureSerial() const
480{
481 return mInstance->getTextureSerial();
482}
483
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000484void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
485{
486 ASSERT(newStorage != NULL);
487
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000488 delete mInstance;
489 mInstance = newStorage;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000490}
491
Geoff Lang8040f572013-07-25 16:49:54 -0400492RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1))
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000493{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000494 mWidth = 0;
495 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000496 mInternalFormat = GL_RGBA4;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000497 mActualFormat = GL_RGBA8_OES;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000498 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000499}
500
501RenderbufferStorage::~RenderbufferStorage()
502{
503}
504
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000505rx::RenderTarget *RenderbufferStorage::getRenderTarget()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000506{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000507 return NULL;
508}
509
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000510rx::RenderTarget *RenderbufferStorage::getDepthStencil()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000511{
512 return NULL;
513}
514
Geoff Lang391c8c52013-09-17 17:05:51 -0400515rx::TextureStorage *RenderbufferStorage::getTextureStorage()
516{
517 return NULL;
518}
519
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000520GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000521{
522 return mWidth;
523}
524
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000525GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000526{
527 return mHeight;
528}
529
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000530GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000531{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000532 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000533}
534
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000535GLenum RenderbufferStorage::getActualFormat() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000536{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000537 return mActualFormat;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000538}
539
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000540GLsizei RenderbufferStorage::getSamples() const
541{
542 return mSamples;
543}
544
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000545unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000546{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000547 return mSerial;
548}
549
Geoff Lang8040f572013-07-25 16:49:54 -0400550unsigned int RenderbufferStorage::issueSerials(GLuint count)
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000551{
552 unsigned int firstSerial = mCurrentSerial;
Geoff Lang8040f572013-07-25 16:49:54 -0400553 mCurrentSerial += count;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000554 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000555}
556
Geoff Lang784371d2014-05-16 12:39:04 -0400557bool RenderbufferStorage::isTexture() const
558{
559 return false;
560}
561
562unsigned int RenderbufferStorage::getTextureSerial() const
563{
564 return -1;
565}
566
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000567Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000568{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000569 mRenderTarget = renderer->createRenderTarget(swapChain, false);
570
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000571 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000572 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000573 mWidth = mRenderTarget->getWidth();
574 mHeight = mRenderTarget->getHeight();
575 mInternalFormat = mRenderTarget->getInternalFormat();
576 mActualFormat = mRenderTarget->getActualFormat();
577 mSamples = mRenderTarget->getSamples();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000578 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579}
580
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000581Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000582{
Geoff Langa2d97f12013-06-11 11:44:02 -0400583 mRenderTarget = renderer->createRenderTarget(width, height, format, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000584
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000585 if (mRenderTarget)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000586 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000587 mWidth = width;
588 mHeight = height;
589 mInternalFormat = format;
590 mActualFormat = mRenderTarget->getActualFormat();
591 mSamples = mRenderTarget->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000592 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000593}
594
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000595Colorbuffer::~Colorbuffer()
596{
597 if (mRenderTarget)
598 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000599 delete mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000600 }
601}
602
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000603rx::RenderTarget *Colorbuffer::getRenderTarget()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000604{
Geoff Lang8040f572013-07-25 16:49:54 -0400605 return mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000606}
607
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000608DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000609{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000610 mDepthStencil = renderer->createRenderTarget(swapChain, true);
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000611 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000612 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000613 mWidth = mDepthStencil->getWidth();
614 mHeight = mDepthStencil->getHeight();
615 mInternalFormat = mDepthStencil->getInternalFormat();
616 mSamples = mDepthStencil->getSamples();
617 mActualFormat = mDepthStencil->getActualFormat();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000618 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000619}
620
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000621DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000622{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000623
Geoff Langa2d97f12013-06-11 11:44:02 -0400624 mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000625
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000626 mWidth = mDepthStencil->getWidth();
627 mHeight = mDepthStencil->getHeight();
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000628 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000629 mActualFormat = mDepthStencil->getActualFormat();
630 mSamples = mDepthStencil->getSamples();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000631}
632
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000633DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000634{
635 if (mDepthStencil)
636 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000637 delete mDepthStencil;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000638 }
639}
640
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000641rx::RenderTarget *DepthStencilbuffer::getDepthStencil()
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000642{
Geoff Lang8040f572013-07-25 16:49:54 -0400643 return mDepthStencil;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000644}
645
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000646Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000647{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000648 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000649 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000650 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
651 // will expect one of the valid renderbuffer formats for use in
652 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000653 }
654}
655
656Depthbuffer::~Depthbuffer()
657{
658}
659
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000660Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000661{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000662 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000663 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000664 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
665 // will expect one of the valid renderbuffer formats for use in
666 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000667 }
668}
669
670Stencilbuffer::~Stencilbuffer()
671{
672}
673
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000674}