blob: fb5c599bf36056a5eb55e522b9b1c68b01956b6f [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.comd14558a2011-11-09 17:46:18 +0000382Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(renderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000383{
384 if (renderTarget)
385 {
386 renderTarget->AddRef();
387
388 D3DSURFACE_DESC description;
389 renderTarget->GetDesc(&description);
390
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000391 mWidth = description.Width;
392 mHeight = description.Height;
393 mInternalFormat = dx2es::ConvertBackBufferFormat(description.Format);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000394 mD3DFormat = description.Format;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000395 mSamples = dx2es::GetSamplesFromMultisampleType(description.MultiSampleType);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000396 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000397}
398
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000399Colorbuffer::Colorbuffer(int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000400{
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000401 renderer::Renderer *renderer = getDisplay()->getRenderer();
402 IDirect3DDevice9 *device = renderer->getDevice(); // D3D9_REPLACE
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000403
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000404 D3DFORMAT requestedFormat = es2dx::ConvertRenderbufferFormat(format);
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000405 int supportedSamples = renderer->getNearestSupportedSamples(requestedFormat, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000406
407 if (supportedSamples == -1)
408 {
409 error(GL_OUT_OF_MEMORY);
410
411 return;
412 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000413
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000414 if (width > 0 && height > 0)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000415 {
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000416 HRESULT result = device->CreateRenderTarget(width, height, requestedFormat,
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000417 es2dx::GetMultisampleTypeFromSamples(supportedSamples), 0, FALSE, &mRenderTarget, NULL);
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000418
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000419 if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
420 {
421 error(GL_OUT_OF_MEMORY);
422
423 return;
424 }
425
426 ASSERT(SUCCEEDED(result));
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000427 }
428
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000429 mWidth = width;
430 mHeight = height;
431 mInternalFormat = format;
432 mD3DFormat = requestedFormat;
433 mSamples = supportedSamples;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000434}
435
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000436Colorbuffer::~Colorbuffer()
437{
438 if (mRenderTarget)
439 {
440 mRenderTarget->Release();
441 }
442}
443
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000444// Increments refcount on surface.
445// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000446IDirect3DSurface9 *Colorbuffer::getRenderTarget()
447{
daniel@transgaming.com5e4dbb32011-11-11 04:10:18 +0000448 if (mRenderTarget)
449 {
450 mRenderTarget->AddRef();
451 }
452
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000453 return mRenderTarget;
454}
455
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000456DepthStencilbuffer::DepthStencilbuffer(IDirect3DSurface9 *depthStencil) : mDepthStencil(depthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000457{
458 if (depthStencil)
459 {
460 depthStencil->AddRef();
461
462 D3DSURFACE_DESC description;
463 depthStencil->GetDesc(&description);
464
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000465 mWidth = description.Width;
466 mHeight = description.Height;
467 mInternalFormat = dx2es::ConvertDepthStencilFormat(description.Format);
468 mSamples = dx2es::GetSamplesFromMultisampleType(description.MultiSampleType);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000469 mD3DFormat = description.Format;
470 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000471}
472
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000473DepthStencilbuffer::DepthStencilbuffer(int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000474{
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000475 renderer::Renderer *renderer = getDisplay()->getRenderer();
476 IDirect3DDevice9 *device = renderer->getDevice(); // D3D9_REPLACE
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000477
478 mDepthStencil = NULL;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000479
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000480 int supportedSamples = renderer->getNearestSupportedSamples(D3DFMT_D24S8, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000481
482 if (supportedSamples == -1)
483 {
484 error(GL_OUT_OF_MEMORY);
485
486 return;
487 }
488
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000489 if (width > 0 && height > 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000490 {
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000491 HRESULT result = device->CreateDepthStencilSurface(width, height, D3DFMT_D24S8, es2dx::GetMultisampleTypeFromSamples(supportedSamples),
492 0, FALSE, &mDepthStencil, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000493
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000494 if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
495 {
496 error(GL_OUT_OF_MEMORY);
497
498 return;
499 }
500
501 ASSERT(SUCCEEDED(result));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000502 }
503
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000504 mWidth = width;
505 mHeight = height;
506 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
507 mD3DFormat = D3DFMT_D24S8;
508 mSamples = supportedSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000509}
510
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000511DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000512{
513 if (mDepthStencil)
514 {
515 mDepthStencil->Release();
516 }
517}
518
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000519// Increments refcount on surface.
520// caller must Release() the returned surface
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000521IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
522{
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000523 if (mDepthStencil)
524 {
525 mDepthStencil->AddRef();
526 }
527
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000528 return mDepthStencil;
529}
530
531Depthbuffer::Depthbuffer(IDirect3DSurface9 *depthStencil) : DepthStencilbuffer(depthStencil)
532{
533 if (depthStencil)
534 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000535 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
536 // will expect one of the valid renderbuffer formats for use in
537 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000538 }
539}
540
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000541Depthbuffer::Depthbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000542{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000543 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000544 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000545 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
546 // will expect one of the valid renderbuffer formats for use in
547 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000548 }
549}
550
551Depthbuffer::~Depthbuffer()
552{
553}
554
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000555Stencilbuffer::Stencilbuffer(IDirect3DSurface9 *depthStencil) : DepthStencilbuffer(depthStencil)
556{
557 if (depthStencil)
558 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000559 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
560 // will expect one of the valid renderbuffer formats for use in
561 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000562 }
563}
564
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000565Stencilbuffer::Stencilbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000566{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000567 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000568 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000569 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
570 // will expect one of the valid renderbuffer formats for use in
571 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000572 }
573}
574
575Stencilbuffer::~Stencilbuffer()
576{
577}
578
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000579}