blob: 2e05f3837bdeb143a0ec3298788ba1ff035c5caf [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
Jamie Madillbfcda812013-10-22 13:07:33 -0400109unsigned int RenderbufferTexture2D::getTextureSerial() const
110{
111 return mTexture2D->getTextureSerial();
112}
113
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000114///// RenderbufferTextureCubeMap Implementation ////////
115
Geoff Lang8040f572013-07-25 16:49:54 -0400116RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum faceTarget, GLint level)
117 : mFaceTarget(faceTarget), mLevel(level)
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000118{
119 mTextureCubeMap.set(texture);
120}
121
122RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
123{
124 mTextureCubeMap.set(NULL);
125}
126
127// Textures need to maintain their own reference count for references via
128// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
129void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
130{
131 mTextureCubeMap->addProxyRef(proxy);
132}
133
134void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
135{
136 mTextureCubeMap->releaseProxy(proxy);
137}
138
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000139rx::RenderTarget *RenderbufferTextureCubeMap::getRenderTarget()
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000140{
Geoff Lang8040f572013-07-25 16:49:54 -0400141 return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000142}
143
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000144rx::RenderTarget *RenderbufferTextureCubeMap::getDepthStencil()
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000145{
Geoff Lang8040f572013-07-25 16:49:54 -0400146 return mTextureCubeMap->getDepthStencil(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000147}
148
Geoff Lang391c8c52013-09-17 17:05:51 -0400149rx::TextureStorage *RenderbufferTextureCubeMap::getTextureStorage()
150{
151 return mTextureCubeMap->getNativeTexture()->getStorageInstance();
152}
153
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000154GLsizei RenderbufferTextureCubeMap::getWidth() const
155{
Geoff Lang8040f572013-07-25 16:49:54 -0400156 return mTextureCubeMap->getWidth(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000157}
158
159GLsizei RenderbufferTextureCubeMap::getHeight() const
160{
Geoff Lang8040f572013-07-25 16:49:54 -0400161 return mTextureCubeMap->getHeight(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000162}
163
164GLenum RenderbufferTextureCubeMap::getInternalFormat() const
165{
Geoff Lang8040f572013-07-25 16:49:54 -0400166 return mTextureCubeMap->getInternalFormat(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000167}
168
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000169GLenum RenderbufferTextureCubeMap::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000170{
Geoff Lang8040f572013-07-25 16:49:54 -0400171 return mTextureCubeMap->getActualFormat(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000172}
173
174GLsizei RenderbufferTextureCubeMap::getSamples() const
175{
176 return 0;
177}
178
179unsigned int RenderbufferTextureCubeMap::getSerial() const
180{
Geoff Lang8040f572013-07-25 16:49:54 -0400181 return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000182}
183
Jamie Madillbfcda812013-10-22 13:07:33 -0400184unsigned int RenderbufferTextureCubeMap::getTextureSerial() const
185{
186 return mTextureCubeMap->getTextureSerial();
187}
188
Geoff Langd5d8e392013-07-25 16:53:03 -0400189///// RenderbufferTexture3DLayer Implementation ////////
190
191RenderbufferTexture3DLayer::RenderbufferTexture3DLayer(Texture3D *texture, GLint level, GLint layer)
192 : mLevel(level), mLayer(layer)
193{
194 mTexture3D.set(texture);
195}
196
197RenderbufferTexture3DLayer::~RenderbufferTexture3DLayer()
198{
199 mTexture3D.set(NULL);
200}
201
202// Textures need to maintain their own reference count for references via
203// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
204void RenderbufferTexture3DLayer::addProxyRef(const Renderbuffer *proxy)
205{
206 mTexture3D->addProxyRef(proxy);
207}
208
209void RenderbufferTexture3DLayer::releaseProxy(const Renderbuffer *proxy)
210{
211 mTexture3D->releaseProxy(proxy);
212}
213
214rx::RenderTarget *RenderbufferTexture3DLayer::getRenderTarget()
215{
216 return mTexture3D->getRenderTarget(mLevel, mLayer);
217}
218
219rx::RenderTarget *RenderbufferTexture3DLayer::getDepthStencil()
220{
221 return mTexture3D->getDepthStencil(mLevel, mLayer);
222}
223
Geoff Lang391c8c52013-09-17 17:05:51 -0400224rx::TextureStorage *RenderbufferTexture3DLayer::getTextureStorage()
225{
226 return mTexture3D->getNativeTexture()->getStorageInstance();
227}
228
Geoff Langd5d8e392013-07-25 16:53:03 -0400229GLsizei RenderbufferTexture3DLayer::getWidth() const
230{
231 return mTexture3D->getWidth(mLevel);
232}
233
234GLsizei RenderbufferTexture3DLayer::getHeight() const
235{
236 return mTexture3D->getHeight(mLevel);
237}
238
239GLenum RenderbufferTexture3DLayer::getInternalFormat() const
240{
241 return mTexture3D->getInternalFormat(mLevel);
242}
243
244GLenum RenderbufferTexture3DLayer::getActualFormat() const
245{
246 return mTexture3D->getActualFormat(mLevel);
247}
248
249GLsizei RenderbufferTexture3DLayer::getSamples() const
250{
251 return 0;
252}
253
254unsigned int RenderbufferTexture3DLayer::getSerial() const
255{
256 return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
257}
258
Jamie Madillbfcda812013-10-22 13:07:33 -0400259unsigned int RenderbufferTexture3DLayer::getTextureSerial() const
260{
261 return mTexture3D->getTextureSerial();
262}
263
Geoff Langd5d8e392013-07-25 16:53:03 -0400264////// RenderbufferTexture2DArrayLayer Implementation //////
265
266RenderbufferTexture2DArrayLayer::RenderbufferTexture2DArrayLayer(Texture2DArray *texture, GLint level, GLint layer)
267 : mLevel(level), mLayer(layer)
268{
269 mTexture2DArray.set(texture);
270}
271
272RenderbufferTexture2DArrayLayer::~RenderbufferTexture2DArrayLayer()
273{
274 mTexture2DArray.set(NULL);
275}
276
277void RenderbufferTexture2DArrayLayer::addProxyRef(const Renderbuffer *proxy)
278{
279 mTexture2DArray->addProxyRef(proxy);
280}
281
282void RenderbufferTexture2DArrayLayer::releaseProxy(const Renderbuffer *proxy)
283{
284 mTexture2DArray->releaseProxy(proxy);
285}
286
287rx::RenderTarget *RenderbufferTexture2DArrayLayer::getRenderTarget()
288{
289 return mTexture2DArray->getRenderTarget(mLevel, mLayer);
290}
291
292rx::RenderTarget *RenderbufferTexture2DArrayLayer::getDepthStencil()
293{
294 return mTexture2DArray->getDepthStencil(mLevel, mLayer);
295}
296
Geoff Lang391c8c52013-09-17 17:05:51 -0400297rx::TextureStorage *RenderbufferTexture2DArrayLayer::getTextureStorage()
298{
299 return mTexture2DArray->getNativeTexture()->getStorageInstance();
300}
301
Geoff Langd5d8e392013-07-25 16:53:03 -0400302GLsizei RenderbufferTexture2DArrayLayer::getWidth() const
303{
304 return mTexture2DArray->getWidth(mLevel);
305}
306
307GLsizei RenderbufferTexture2DArrayLayer::getHeight() const
308{
309 return mTexture2DArray->getHeight(mLevel);
310}
311
312GLenum RenderbufferTexture2DArrayLayer::getInternalFormat() const
313{
314 return mTexture2DArray->getInternalFormat(mLevel);
315}
316
317GLenum RenderbufferTexture2DArrayLayer::getActualFormat() const
318{
319 return mTexture2DArray->getActualFormat(mLevel);
320}
321
322GLsizei RenderbufferTexture2DArrayLayer::getSamples() const
323{
324 return 0;
325}
326
327unsigned int RenderbufferTexture2DArrayLayer::getSerial() const
328{
329 return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
330}
331
Jamie Madillbfcda812013-10-22 13:07:33 -0400332unsigned int RenderbufferTexture2DArrayLayer::getTextureSerial() const
333{
334 return mTexture2DArray->getTextureSerial();
335}
336
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000337////// Renderbuffer Implementation //////
338
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000339Renderbuffer::Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000340{
341 ASSERT(instance != NULL);
342 mInstance = instance;
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000343
344 ASSERT(renderer != NULL);
345 mRenderer = renderer;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000346}
347
348Renderbuffer::~Renderbuffer()
349{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000350 delete mInstance;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000351}
352
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000353// The RenderbufferInterface contained in this Renderbuffer may need to maintain
354// its own reference count, so we pass it on here.
355void Renderbuffer::addRef() const
356{
357 mInstance->addProxyRef(this);
358
359 RefCountObject::addRef();
360}
361
362void Renderbuffer::release() const
363{
364 mInstance->releaseProxy(this);
365
366 RefCountObject::release();
367}
368
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000369rx::RenderTarget *Renderbuffer::getRenderTarget()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000370{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000371 return mInstance->getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000372}
373
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000374rx::RenderTarget *Renderbuffer::getDepthStencil()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000375{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000376 return mInstance->getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000377}
378
Geoff Lang391c8c52013-09-17 17:05:51 -0400379rx::TextureStorage *Renderbuffer::getTextureStorage()
380{
381 return mInstance->getTextureStorage();
382}
383
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000384GLsizei Renderbuffer::getWidth() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000385{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000386 return mInstance->getWidth();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000387}
388
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000389GLsizei Renderbuffer::getHeight() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000390{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000391 return mInstance->getHeight();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000392}
393
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000394GLenum Renderbuffer::getInternalFormat() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000395{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000396 return mInstance->getInternalFormat();
397}
398
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000399GLenum Renderbuffer::getActualFormat() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000400{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000401 return mInstance->getActualFormat();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000402}
403
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000404GLuint Renderbuffer::getRedSize() const
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000405{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000406 return gl::GetRedBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000407}
408
409GLuint Renderbuffer::getGreenSize() const
410{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000411 return gl::GetGreenBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000412}
413
414GLuint Renderbuffer::getBlueSize() const
415{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000416 return gl::GetBlueBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000417}
418
419GLuint Renderbuffer::getAlphaSize() const
420{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000421 return gl::GetAlphaBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000422}
423
424GLuint Renderbuffer::getDepthSize() const
425{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000426 return gl::GetDepthBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000427}
428
429GLuint Renderbuffer::getStencilSize() const
430{
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000431 return gl::GetStencilBits(getActualFormat(), mRenderer->getCurrentClientVersion());
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000432}
433
Geoff Lang0a804792013-08-13 13:09:43 -0400434GLenum Renderbuffer::getComponentType() const
435{
436 return gl::GetComponentType(getActualFormat(), mRenderer->getCurrentClientVersion());
437}
438
439GLenum Renderbuffer::getColorEncoding() const
440{
441 return gl::GetColorEncoding(getActualFormat(), mRenderer->getCurrentClientVersion());
442}
443
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000444GLsizei Renderbuffer::getSamples() const
445{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000446 return mInstance->getSamples();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000447}
448
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000449unsigned int Renderbuffer::getSerial() const
450{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000451 return mInstance->getSerial();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000452}
453
Jamie Madillbfcda812013-10-22 13:07:33 -0400454unsigned int Renderbuffer::getTextureSerial() const
455{
456 return mInstance->getTextureSerial();
457}
458
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000459void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
460{
461 ASSERT(newStorage != NULL);
462
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000463 delete mInstance;
464 mInstance = newStorage;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000465}
466
Geoff Lang8040f572013-07-25 16:49:54 -0400467RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1))
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000468{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000469 mWidth = 0;
470 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000471 mInternalFormat = GL_RGBA4;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000472 mActualFormat = GL_RGBA8_OES;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000473 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000474}
475
476RenderbufferStorage::~RenderbufferStorage()
477{
478}
479
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000480rx::RenderTarget *RenderbufferStorage::getRenderTarget()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000481{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000482 return NULL;
483}
484
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000485rx::RenderTarget *RenderbufferStorage::getDepthStencil()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000486{
487 return NULL;
488}
489
Geoff Lang391c8c52013-09-17 17:05:51 -0400490rx::TextureStorage *RenderbufferStorage::getTextureStorage()
491{
492 return NULL;
493}
494
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000495GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000496{
497 return mWidth;
498}
499
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000500GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000501{
502 return mHeight;
503}
504
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000505GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000506{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000507 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000508}
509
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000510GLenum RenderbufferStorage::getActualFormat() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000511{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000512 return mActualFormat;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000513}
514
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000515GLsizei RenderbufferStorage::getSamples() const
516{
517 return mSamples;
518}
519
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000520unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000521{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000522 return mSerial;
523}
524
Geoff Lang8040f572013-07-25 16:49:54 -0400525unsigned int RenderbufferStorage::issueSerials(GLuint count)
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000526{
527 unsigned int firstSerial = mCurrentSerial;
Geoff Lang8040f572013-07-25 16:49:54 -0400528 mCurrentSerial += count;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000529 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000530}
531
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000532Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000533{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000534 mRenderTarget = renderer->createRenderTarget(swapChain, false);
535
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000536 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000537 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000538 mWidth = mRenderTarget->getWidth();
539 mHeight = mRenderTarget->getHeight();
540 mInternalFormat = mRenderTarget->getInternalFormat();
541 mActualFormat = mRenderTarget->getActualFormat();
542 mSamples = mRenderTarget->getSamples();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000543 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000544}
545
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000546Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000547{
Geoff Langa2d97f12013-06-11 11:44:02 -0400548 mRenderTarget = renderer->createRenderTarget(width, height, format, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000549
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000550 if (mRenderTarget)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000551 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000552 mWidth = width;
553 mHeight = height;
554 mInternalFormat = format;
555 mActualFormat = mRenderTarget->getActualFormat();
556 mSamples = mRenderTarget->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000557 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000558}
559
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000560Colorbuffer::~Colorbuffer()
561{
562 if (mRenderTarget)
563 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000564 delete mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000565 }
566}
567
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000568rx::RenderTarget *Colorbuffer::getRenderTarget()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000569{
Geoff Lang8040f572013-07-25 16:49:54 -0400570 return mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000571}
572
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000573DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000574{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000575 mDepthStencil = renderer->createRenderTarget(swapChain, true);
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000576 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000577 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000578 mWidth = mDepthStencil->getWidth();
579 mHeight = mDepthStencil->getHeight();
580 mInternalFormat = mDepthStencil->getInternalFormat();
581 mSamples = mDepthStencil->getSamples();
582 mActualFormat = mDepthStencil->getActualFormat();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000583 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000584}
585
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000586DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000587{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000588
Geoff Langa2d97f12013-06-11 11:44:02 -0400589 mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000590
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000591 mWidth = mDepthStencil->getWidth();
592 mHeight = mDepthStencil->getHeight();
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000593 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000594 mActualFormat = mDepthStencil->getActualFormat();
595 mSamples = mDepthStencil->getSamples();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000596}
597
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000598DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000599{
600 if (mDepthStencil)
601 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000602 delete mDepthStencil;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000603 }
604}
605
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000606rx::RenderTarget *DepthStencilbuffer::getDepthStencil()
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000607{
Geoff Lang8040f572013-07-25 16:49:54 -0400608 return mDepthStencil;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000609}
610
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000611Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000612{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000613 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000614 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000615 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
616 // will expect one of the valid renderbuffer formats for use in
617 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000618 }
619}
620
621Depthbuffer::~Depthbuffer()
622{
623}
624
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000625Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000626{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000627 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000628 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000629 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
630 // will expect one of the valid renderbuffer formats for use in
631 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000632 }
633}
634
635Stencilbuffer::~Stencilbuffer()
636{
637}
638
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000639}