blob: 0a1a5ee8396c7de09bed5c989edf991fb01891f7 [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
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000012
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013#include "libGLESv2/main.h"
enne@chromium.org0fa74632010-09-21 16:18:52 +000014#include "libGLESv2/Texture.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/utilities.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016
daniel@transgaming.com042d1b42012-11-28 19:37:09 +000017#include "libGLESv2/renderer/RenderTarget9.h" // D3D9_REPLACE
daniel@transgaming.comd8e36562012-10-31 19:52:19 +000018#include "libGLESv2/renderer/renderer9_utils.h" // D3D9_REPLACE
19
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020namespace gl
21{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000022unsigned int RenderbufferStorage::mCurrentSerial = 1;
daniel@transgaming.com092bd482010-05-12 03:39:36 +000023
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000024RenderbufferInterface::RenderbufferInterface()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000026}
27
daniel@transgaming.com2678b342012-01-18 16:29:40 +000028// The default case for classes inherited from RenderbufferInterface is not to
29// need to do anything upon the reference count to the parent Renderbuffer incrementing
30// or decrementing.
31void RenderbufferInterface::addProxyRef(const Renderbuffer *proxy)
32{
33}
34
35void RenderbufferInterface::releaseProxy(const Renderbuffer *proxy)
36{
37}
38
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000039GLuint RenderbufferInterface::getRedSize() const
40{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000041 return gl::GetRedSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000042}
43
44GLuint RenderbufferInterface::getGreenSize() const
45{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000046 return gl::GetGreenSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000047}
48
49GLuint RenderbufferInterface::getBlueSize() const
50{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000051 return gl::GetBlueSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000052}
53
54GLuint RenderbufferInterface::getAlphaSize() const
55{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000056 return gl::GetAlphaSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000057}
58
59GLuint RenderbufferInterface::getDepthSize() const
60{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000061 return gl::GetDepthSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000062}
63
64GLuint RenderbufferInterface::getStencilSize() const
65{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000066 return gl::GetStencilSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000067}
68
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000069///// RenderbufferTexture2D Implementation ////////
70
71RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLenum target) : mTarget(target)
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000072{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000073 mTexture2D.set(texture);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000074}
75
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000076RenderbufferTexture2D::~RenderbufferTexture2D()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000077{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000078 mTexture2D.set(NULL);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000079}
80
daniel@transgaming.com2678b342012-01-18 16:29:40 +000081// Textures need to maintain their own reference count for references via
82// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000083void RenderbufferTexture2D::addProxyRef(const Renderbuffer *proxy)
daniel@transgaming.com2678b342012-01-18 16:29:40 +000084{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000085 mTexture2D->addProxyRef(proxy);
daniel@transgaming.com2678b342012-01-18 16:29:40 +000086}
87
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000088void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
daniel@transgaming.com2678b342012-01-18 16:29:40 +000089{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000090 mTexture2D->releaseProxy(proxy);
daniel@transgaming.com2678b342012-01-18 16:29:40 +000091}
92
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +000093// Increments refcount on surface.
94// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000095IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000096{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000097 return mTexture2D->getRenderTarget(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000098}
99
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000100// Increments refcount on surface.
101// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000102IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000103{
daniel@transgaming.com68145c62012-05-31 01:14:46 +0000104 return mTexture2D->getDepthStencil(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000105}
106
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000107GLsizei RenderbufferTexture2D::getWidth() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000108{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000109 return mTexture2D->getWidth(0);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000110}
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000111
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000112GLsizei RenderbufferTexture2D::getHeight() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000113{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000114 return mTexture2D->getHeight(0);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000115}
116
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000117GLenum RenderbufferTexture2D::getInternalFormat() const
118{
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000119 return mTexture2D->getInternalFormat(0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000120}
121
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000122GLenum RenderbufferTexture2D::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000123{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000124 return mTexture2D->getActualFormat(0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000125}
126
127GLsizei RenderbufferTexture2D::getSamples() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000128{
129 return 0;
130}
131
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000132unsigned int RenderbufferTexture2D::getSerial() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000133{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000134 return mTexture2D->getRenderTargetSerial(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000135}
136
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000137///// RenderbufferTextureCubeMap Implementation ////////
138
139RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target) : mTarget(target)
140{
141 mTextureCubeMap.set(texture);
142}
143
144RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
145{
146 mTextureCubeMap.set(NULL);
147}
148
149// Textures need to maintain their own reference count for references via
150// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
151void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
152{
153 mTextureCubeMap->addProxyRef(proxy);
154}
155
156void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
157{
158 mTextureCubeMap->releaseProxy(proxy);
159}
160
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000161// Increments refcount on surface.
162// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000163IDirect3DSurface9 *RenderbufferTextureCubeMap::getRenderTarget()
164{
165 return mTextureCubeMap->getRenderTarget(mTarget);
166}
167
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000168// Increments refcount on surface.
169// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000170IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil()
171{
172 return NULL;
173}
174
175GLsizei RenderbufferTextureCubeMap::getWidth() const
176{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000177 return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000178}
179
180GLsizei RenderbufferTextureCubeMap::getHeight() const
181{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000182 return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000183}
184
185GLenum RenderbufferTextureCubeMap::getInternalFormat() const
186{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000187 return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000188}
189
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000190GLenum RenderbufferTextureCubeMap::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000191{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000192 return mTextureCubeMap->getActualFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000193}
194
195GLsizei RenderbufferTextureCubeMap::getSamples() const
196{
197 return 0;
198}
199
200unsigned int RenderbufferTextureCubeMap::getSerial() const
201{
202 return mTextureCubeMap->getRenderTargetSerial(mTarget);
203}
204
205////// Renderbuffer Implementation //////
206
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000207Renderbuffer::Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000208{
209 ASSERT(instance != NULL);
210 mInstance = instance;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000211}
212
213Renderbuffer::~Renderbuffer()
214{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000215 delete mInstance;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000216}
217
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000218// The RenderbufferInterface contained in this Renderbuffer may need to maintain
219// its own reference count, so we pass it on here.
220void Renderbuffer::addRef() const
221{
222 mInstance->addProxyRef(this);
223
224 RefCountObject::addRef();
225}
226
227void Renderbuffer::release() const
228{
229 mInstance->releaseProxy(this);
230
231 RefCountObject::release();
232}
233
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000234// Increments refcount on surface.
235// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000236IDirect3DSurface9 *Renderbuffer::getRenderTarget()
237{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000238 return mInstance->getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000239}
240
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000241// Increments refcount on surface.
242// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000243IDirect3DSurface9 *Renderbuffer::getDepthStencil()
244{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000245 return mInstance->getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000246}
247
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000248GLsizei Renderbuffer::getWidth() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000249{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000250 return mInstance->getWidth();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000251}
252
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000253GLsizei Renderbuffer::getHeight() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000254{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000255 return mInstance->getHeight();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000256}
257
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000258GLenum Renderbuffer::getInternalFormat() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000259{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000260 return mInstance->getInternalFormat();
261}
262
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000263GLenum Renderbuffer::getActualFormat() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000264{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000265 return mInstance->getActualFormat();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000266}
267
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000268GLuint Renderbuffer::getRedSize() const
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000269{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000270 return mInstance->getRedSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000271}
272
273GLuint Renderbuffer::getGreenSize() const
274{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000275 return mInstance->getGreenSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000276}
277
278GLuint Renderbuffer::getBlueSize() const
279{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000280 return mInstance->getBlueSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000281}
282
283GLuint Renderbuffer::getAlphaSize() const
284{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000285 return mInstance->getAlphaSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000286}
287
288GLuint Renderbuffer::getDepthSize() const
289{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000290 return mInstance->getDepthSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000291}
292
293GLuint Renderbuffer::getStencilSize() const
294{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000295 return mInstance->getStencilSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000296}
297
298GLsizei Renderbuffer::getSamples() const
299{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000300 return mInstance->getSamples();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000301}
302
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000303unsigned int Renderbuffer::getSerial() const
304{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000305 return mInstance->getSerial();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000306}
307
308void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
309{
310 ASSERT(newStorage != NULL);
311
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000312 delete mInstance;
313 mInstance = newStorage;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000314}
315
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000316RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial())
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000317{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000318 mWidth = 0;
319 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000320 mInternalFormat = GL_RGBA4;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000321 mActualFormat = GL_RGBA8_OES;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000322 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000323}
324
325RenderbufferStorage::~RenderbufferStorage()
326{
327}
328
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000329// Increments refcount on surface.
330// caller must Release() the returned surface
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000331IDirect3DSurface9 *RenderbufferStorage::getRenderTarget()
332{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000333 return NULL;
334}
335
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000336// Increments refcount on surface.
337// caller must Release() the returned surface
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000338IDirect3DSurface9 *RenderbufferStorage::getDepthStencil()
339{
340 return NULL;
341}
342
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000343GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000344{
345 return mWidth;
346}
347
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000348GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000349{
350 return mHeight;
351}
352
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000353GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000354{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000355 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000356}
357
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000358GLenum RenderbufferStorage::getActualFormat() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000359{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000360 return mActualFormat;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000361}
362
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000363GLsizei RenderbufferStorage::getSamples() const
364{
365 return mSamples;
366}
367
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000368unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000369{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000370 return mSerial;
371}
372
373unsigned int RenderbufferStorage::issueSerial()
374{
375 return mCurrentSerial++;
376}
377
378unsigned int RenderbufferStorage::issueCubeSerials()
379{
380 unsigned int firstSerial = mCurrentSerial;
381 mCurrentSerial += 6;
382 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000383}
384
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000385Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000386{
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000387 mRenderTarget = new rx::RenderTarget9(renderer, swapChain->getRenderTarget());
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000388 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000389 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000390 mWidth = mRenderTarget->getWidth();
391 mHeight = mRenderTarget->getHeight();
392 mInternalFormat = mRenderTarget->getInternalFormat();
393 mActualFormat = mRenderTarget->getActualFormat();
394 mSamples = mRenderTarget->getSamples();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000395 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000396}
397
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000398Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000399{
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000400
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000401 mRenderTarget = new rx::RenderTarget9(renderer, width, height, format, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000402
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000403 if (mRenderTarget)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000404 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000405 mWidth = width;
406 mHeight = height;
407 mInternalFormat = format;
408 mActualFormat = mRenderTarget->getActualFormat();
409 mSamples = mRenderTarget->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000410 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000411}
412
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000413Colorbuffer::~Colorbuffer()
414{
415 if (mRenderTarget)
416 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000417 delete mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000418 }
419}
420
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000421// Increments refcount on surface.
422// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000423IDirect3DSurface9 *Colorbuffer::getRenderTarget()
424{
daniel@transgaming.com5e4dbb32011-11-11 04:10:18 +0000425 if (mRenderTarget)
426 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000427 return mRenderTarget->getSurface();
daniel@transgaming.com5e4dbb32011-11-11 04:10:18 +0000428 }
429
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000430 return NULL;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000431}
432
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000433DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000434{
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000435 mDepthStencil = new rx::RenderTarget9(renderer, swapChain->getDepthStencil());
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000436 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000437 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000438 mWidth = mDepthStencil->getWidth();
439 mHeight = mDepthStencil->getHeight();
440 mInternalFormat = mDepthStencil->getInternalFormat();
441 mSamples = mDepthStencil->getSamples();
442 mActualFormat = mDepthStencil->getActualFormat();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000443 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000444}
445
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000446DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000447{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000449 mDepthStencil = new rx::RenderTarget9(renderer, width, height, GL_DEPTH24_STENCIL8_OES, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000450
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000451 mWidth = mDepthStencil->getWidth();
452 mHeight = mDepthStencil->getHeight();
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000453 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000454 mActualFormat = mDepthStencil->getActualFormat();
455 mSamples = mDepthStencil->getSamples();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000456}
457
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000458DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000459{
460 if (mDepthStencil)
461 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000462 delete mDepthStencil;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000463 }
464}
465
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000466// Increments refcount on surface.
467// caller must Release() the returned surface
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000468IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
469{
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000470 if (mDepthStencil)
471 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000472 return mDepthStencil->getSurface();
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000473 }
474
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000475 return NULL;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000476}
477
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000478Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000479{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000480 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000481 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000482 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
483 // will expect one of the valid renderbuffer formats for use in
484 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000485 }
486}
487
488Depthbuffer::~Depthbuffer()
489{
490}
491
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000492Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000493{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000494 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000495 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000496 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
497 // will expect one of the valid renderbuffer formats for use in
498 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000499 }
500}
501
502Stencilbuffer::~Stencilbuffer()
503{
504}
505
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000506}