blob: 6065afb086b1cb00e04ba40f416da76d17e6c8eb [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3// 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
17namespace gl
18{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000019unsigned int RenderbufferStorage::mCurrentSerial = 1;
daniel@transgaming.com092bd482010-05-12 03:39:36 +000020
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000021RenderbufferInterface::RenderbufferInterface()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000022{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000023}
24
daniel@transgaming.com2678b342012-01-18 16:29:40 +000025// The default case for classes inherited from RenderbufferInterface is not to
26// need to do anything upon the reference count to the parent Renderbuffer incrementing
27// or decrementing.
28void RenderbufferInterface::addProxyRef(const Renderbuffer *proxy)
29{
30}
31
32void RenderbufferInterface::releaseProxy(const Renderbuffer *proxy)
33{
34}
35
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000036GLuint RenderbufferInterface::getRedSize() const
37{
38 return dx2es::GetRedSize(getD3DFormat());
39}
40
41GLuint RenderbufferInterface::getGreenSize() const
42{
43 return dx2es::GetGreenSize(getD3DFormat());
44}
45
46GLuint RenderbufferInterface::getBlueSize() const
47{
48 return dx2es::GetBlueSize(getD3DFormat());
49}
50
51GLuint RenderbufferInterface::getAlphaSize() const
52{
53 return dx2es::GetAlphaSize(getD3DFormat());
54}
55
56GLuint RenderbufferInterface::getDepthSize() const
57{
58 return dx2es::GetDepthSize(getD3DFormat());
59}
60
61GLuint RenderbufferInterface::getStencilSize() const
62{
63 return dx2es::GetStencilSize(getD3DFormat());
64}
65
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000066///// RenderbufferTexture2D Implementation ////////
67
68RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLenum target) : mTarget(target)
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000069{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000070 mTexture2D.set(texture);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000071}
72
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000073RenderbufferTexture2D::~RenderbufferTexture2D()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000074{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000075 mTexture2D.set(NULL);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000076}
77
daniel@transgaming.com2678b342012-01-18 16:29:40 +000078// Textures need to maintain their own reference count for references via
79// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000080void RenderbufferTexture2D::addProxyRef(const Renderbuffer *proxy)
daniel@transgaming.com2678b342012-01-18 16:29:40 +000081{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000082 mTexture2D->addProxyRef(proxy);
daniel@transgaming.com2678b342012-01-18 16:29:40 +000083}
84
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000085void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
daniel@transgaming.com2678b342012-01-18 16:29:40 +000086{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000087 mTexture2D->releaseProxy(proxy);
daniel@transgaming.com2678b342012-01-18 16:29:40 +000088}
89
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +000090// Increments refcount on surface.
91// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000092IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000093{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000094 return mTexture2D->getRenderTarget(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000095}
96
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +000097// Increments refcount on surface.
98// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000099IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000100{
daniel@transgaming.com68145c62012-05-31 01:14:46 +0000101 return mTexture2D->getDepthStencil(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000102}
103
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000104GLsizei RenderbufferTexture2D::getWidth() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000105{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000106 return mTexture2D->getWidth(0);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000107}
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000108
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000109GLsizei RenderbufferTexture2D::getHeight() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000110{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000111 return mTexture2D->getHeight(0);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000112}
113
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000114GLenum RenderbufferTexture2D::getInternalFormat() const
115{
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000116 return mTexture2D->getInternalFormat(0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000117}
118
119D3DFORMAT RenderbufferTexture2D::getD3DFormat() const
120{
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000121 return mTexture2D->getD3DFormat(0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000122}
123
124GLsizei RenderbufferTexture2D::getSamples() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000125{
126 return 0;
127}
128
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000129unsigned int RenderbufferTexture2D::getSerial() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000130{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000131 return mTexture2D->getRenderTargetSerial(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000132}
133
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000134///// RenderbufferTextureCubeMap Implementation ////////
135
136RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target) : mTarget(target)
137{
138 mTextureCubeMap.set(texture);
139}
140
141RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
142{
143 mTextureCubeMap.set(NULL);
144}
145
146// Textures need to maintain their own reference count for references via
147// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
148void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
149{
150 mTextureCubeMap->addProxyRef(proxy);
151}
152
153void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
154{
155 mTextureCubeMap->releaseProxy(proxy);
156}
157
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000158// Increments refcount on surface.
159// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000160IDirect3DSurface9 *RenderbufferTextureCubeMap::getRenderTarget()
161{
162 return mTextureCubeMap->getRenderTarget(mTarget);
163}
164
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000165// Increments refcount on surface.
166// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000167IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil()
168{
169 return NULL;
170}
171
172GLsizei RenderbufferTextureCubeMap::getWidth() const
173{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000174 return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000175}
176
177GLsizei RenderbufferTextureCubeMap::getHeight() const
178{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000179 return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000180}
181
182GLenum RenderbufferTextureCubeMap::getInternalFormat() const
183{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000184 return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000185}
186
187D3DFORMAT RenderbufferTextureCubeMap::getD3DFormat() const
188{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000189 return mTextureCubeMap->getD3DFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000190}
191
192GLsizei RenderbufferTextureCubeMap::getSamples() const
193{
194 return 0;
195}
196
197unsigned int RenderbufferTextureCubeMap::getSerial() const
198{
199 return mTextureCubeMap->getRenderTargetSerial(mTarget);
200}
201
202////// Renderbuffer Implementation //////
203
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000204Renderbuffer::Renderbuffer(GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
205{
206 ASSERT(instance != NULL);
207 mInstance = instance;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208}
209
210Renderbuffer::~Renderbuffer()
211{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000212 delete mInstance;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000213}
214
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000215// The RenderbufferInterface contained in this Renderbuffer may need to maintain
216// its own reference count, so we pass it on here.
217void Renderbuffer::addRef() const
218{
219 mInstance->addProxyRef(this);
220
221 RefCountObject::addRef();
222}
223
224void Renderbuffer::release() const
225{
226 mInstance->releaseProxy(this);
227
228 RefCountObject::release();
229}
230
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000231// Increments refcount on surface.
232// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233IDirect3DSurface9 *Renderbuffer::getRenderTarget()
234{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000235 return mInstance->getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000236}
237
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000238// Increments refcount on surface.
239// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000240IDirect3DSurface9 *Renderbuffer::getDepthStencil()
241{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000242 return mInstance->getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000243}
244
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000245GLsizei Renderbuffer::getWidth() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000246{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000247 return mInstance->getWidth();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000248}
249
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000250GLsizei Renderbuffer::getHeight() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000251{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000252 return mInstance->getHeight();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000253}
254
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000255GLenum Renderbuffer::getInternalFormat() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000256{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000257 return mInstance->getInternalFormat();
258}
259
260D3DFORMAT Renderbuffer::getD3DFormat() const
261{
262 return mInstance->getD3DFormat();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000263}
264
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000265GLuint Renderbuffer::getRedSize() const
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000266{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000267 return mInstance->getRedSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000268}
269
270GLuint Renderbuffer::getGreenSize() const
271{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000272 return mInstance->getGreenSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000273}
274
275GLuint Renderbuffer::getBlueSize() const
276{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000277 return mInstance->getBlueSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000278}
279
280GLuint Renderbuffer::getAlphaSize() const
281{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000282 return mInstance->getAlphaSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000283}
284
285GLuint Renderbuffer::getDepthSize() const
286{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000287 return mInstance->getDepthSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000288}
289
290GLuint Renderbuffer::getStencilSize() const
291{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000292 return mInstance->getStencilSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000293}
294
295GLsizei Renderbuffer::getSamples() const
296{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000297 return mInstance->getSamples();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000298}
299
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000300unsigned int Renderbuffer::getSerial() const
301{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000302 return mInstance->getSerial();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000303}
304
305void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
306{
307 ASSERT(newStorage != NULL);
308
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000309 delete mInstance;
310 mInstance = newStorage;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000311}
312
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000313RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial())
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000314{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000315 mWidth = 0;
316 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000317 mInternalFormat = GL_RGBA4;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000318 mD3DFormat = D3DFMT_A8R8G8B8;
319 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000320}
321
322RenderbufferStorage::~RenderbufferStorage()
323{
324}
325
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000326// Increments refcount on surface.
327// caller must Release() the returned surface
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000328IDirect3DSurface9 *RenderbufferStorage::getRenderTarget()
329{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000330 return NULL;
331}
332
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000333// Increments refcount on surface.
334// caller must Release() the returned surface
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000335IDirect3DSurface9 *RenderbufferStorage::getDepthStencil()
336{
337 return NULL;
338}
339
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000340GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000341{
342 return mWidth;
343}
344
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000345GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000346{
347 return mHeight;
348}
349
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000350GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000351{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000352 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000353}
354
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000355D3DFORMAT RenderbufferStorage::getD3DFormat() const
356{
357 return mD3DFormat;
358}
359
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000360GLsizei RenderbufferStorage::getSamples() const
361{
362 return mSamples;
363}
364
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000365unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000366{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000367 return mSerial;
368}
369
370unsigned int RenderbufferStorage::issueSerial()
371{
372 return mCurrentSerial++;
373}
374
375unsigned int RenderbufferStorage::issueCubeSerials()
376{
377 unsigned int firstSerial = mCurrentSerial;
378 mCurrentSerial += 6;
379 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000380}
381
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000382Colorbuffer::Colorbuffer(renderer::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000383{
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000384 mRenderTarget = swapChain->getRenderTarget();
385 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000386 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000387 D3DSURFACE_DESC description;
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000388 mRenderTarget->GetDesc(&description);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000389
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000390 mWidth = description.Width;
391 mHeight = description.Height;
392 mInternalFormat = dx2es::ConvertBackBufferFormat(description.Format);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000393 mD3DFormat = description.Format;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000394 mSamples = dx2es::GetSamplesFromMultisampleType(description.MultiSampleType);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000395 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000396}
397
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000398Colorbuffer::Colorbuffer(int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000399{
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000400 renderer::Renderer *renderer = getDisplay()->getRenderer();
401 IDirect3DDevice9 *device = renderer->getDevice(); // D3D9_REPLACE
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000402
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000403 D3DFORMAT requestedFormat = es2dx::ConvertRenderbufferFormat(format);
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000404 int supportedSamples = renderer->getNearestSupportedSamples(requestedFormat, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000405
406 if (supportedSamples == -1)
407 {
408 error(GL_OUT_OF_MEMORY);
409
410 return;
411 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000412
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000413 if (width > 0 && height > 0)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000414 {
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000415 HRESULT result = device->CreateRenderTarget(width, height, requestedFormat,
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000416 es2dx::GetMultisampleTypeFromSamples(supportedSamples), 0, FALSE, &mRenderTarget, NULL);
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000417
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000418 if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
419 {
420 error(GL_OUT_OF_MEMORY);
421
422 return;
423 }
424
425 ASSERT(SUCCEEDED(result));
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000426 }
427
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000428 mWidth = width;
429 mHeight = height;
430 mInternalFormat = format;
431 mD3DFormat = requestedFormat;
432 mSamples = supportedSamples;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000433}
434
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000435Colorbuffer::~Colorbuffer()
436{
437 if (mRenderTarget)
438 {
439 mRenderTarget->Release();
440 }
441}
442
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000443// Increments refcount on surface.
444// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000445IDirect3DSurface9 *Colorbuffer::getRenderTarget()
446{
daniel@transgaming.com5e4dbb32011-11-11 04:10:18 +0000447 if (mRenderTarget)
448 {
449 mRenderTarget->AddRef();
450 }
451
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000452 return mRenderTarget;
453}
454
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000455DepthStencilbuffer::DepthStencilbuffer(IDirect3DSurface9 *depthStencil) : mDepthStencil(depthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000456{
457 if (depthStencil)
458 {
459 depthStencil->AddRef();
460
461 D3DSURFACE_DESC description;
462 depthStencil->GetDesc(&description);
463
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000464 mWidth = description.Width;
465 mHeight = description.Height;
466 mInternalFormat = dx2es::ConvertDepthStencilFormat(description.Format);
467 mSamples = dx2es::GetSamplesFromMultisampleType(description.MultiSampleType);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000468 mD3DFormat = description.Format;
469 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000470}
471
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000472DepthStencilbuffer::DepthStencilbuffer(int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000473{
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000474 renderer::Renderer *renderer = getDisplay()->getRenderer();
475 IDirect3DDevice9 *device = renderer->getDevice(); // D3D9_REPLACE
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000476
477 mDepthStencil = NULL;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000478
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000479 int supportedSamples = renderer->getNearestSupportedSamples(D3DFMT_D24S8, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000480
481 if (supportedSamples == -1)
482 {
483 error(GL_OUT_OF_MEMORY);
484
485 return;
486 }
487
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000488 if (width > 0 && height > 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000489 {
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000490 HRESULT result = device->CreateDepthStencilSurface(width, height, D3DFMT_D24S8, es2dx::GetMultisampleTypeFromSamples(supportedSamples),
491 0, FALSE, &mDepthStencil, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000492
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000493 if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
494 {
495 error(GL_OUT_OF_MEMORY);
496
497 return;
498 }
499
500 ASSERT(SUCCEEDED(result));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000501 }
502
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000503 mWidth = width;
504 mHeight = height;
505 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
506 mD3DFormat = D3DFMT_D24S8;
507 mSamples = supportedSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000508}
509
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000510DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000511{
512 if (mDepthStencil)
513 {
514 mDepthStencil->Release();
515 }
516}
517
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000518// Increments refcount on surface.
519// caller must Release() the returned surface
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000520IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
521{
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000522 if (mDepthStencil)
523 {
524 mDepthStencil->AddRef();
525 }
526
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000527 return mDepthStencil;
528}
529
530Depthbuffer::Depthbuffer(IDirect3DSurface9 *depthStencil) : DepthStencilbuffer(depthStencil)
531{
532 if (depthStencil)
533 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000534 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
535 // will expect one of the valid renderbuffer formats for use in
536 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000537 }
538}
539
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000540Depthbuffer::Depthbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000541{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000542 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000543 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000544 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
545 // will expect one of the valid renderbuffer formats for use in
546 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000547 }
548}
549
550Depthbuffer::~Depthbuffer()
551{
552}
553
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000554Stencilbuffer::Stencilbuffer(IDirect3DSurface9 *depthStencil) : DepthStencilbuffer(depthStencil)
555{
556 if (depthStencil)
557 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000558 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
559 // will expect one of the valid renderbuffer formats for use in
560 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000561 }
562}
563
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000564Stencilbuffer::Stencilbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000565{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000566 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000567 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000568 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
569 // will expect one of the valid renderbuffer formats for use in
570 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000571 }
572}
573
574Stencilbuffer::~Stencilbuffer()
575{
576}
577
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000578}