blob: d30dfa904b25a0b69bb4248389cb95c0543c735a [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{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000038 return gl::GetRedSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000039}
40
41GLuint RenderbufferInterface::getGreenSize() const
42{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000043 return gl::GetGreenSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000044}
45
46GLuint RenderbufferInterface::getBlueSize() const
47{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000048 return gl::GetBlueSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000049}
50
51GLuint RenderbufferInterface::getAlphaSize() const
52{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000053 return gl::GetAlphaSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000054}
55
56GLuint RenderbufferInterface::getDepthSize() const
57{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000058 return gl::GetDepthSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000059}
60
61GLuint RenderbufferInterface::getStencilSize() const
62{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000063 return gl::GetStencilSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000064}
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
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000119GLenum RenderbufferTexture2D::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000120{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000121 return mTexture2D->getActualFormat(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
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000187GLenum RenderbufferTextureCubeMap::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000188{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000189 return mTextureCubeMap->getActualFormat(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
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000260GLenum Renderbuffer::getActualFormat() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000261{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000262 return mInstance->getActualFormat();
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;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000319 mActualFormat = GL_RGBA8_OES;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000320 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000321}
322
323RenderbufferStorage::~RenderbufferStorage()
324{
325}
326
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000327// Increments refcount on surface.
328// caller must Release() the returned surface
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000329IDirect3DSurface9 *RenderbufferStorage::getRenderTarget()
330{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 return NULL;
332}
333
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000334// Increments refcount on surface.
335// caller must Release() the returned surface
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000336IDirect3DSurface9 *RenderbufferStorage::getDepthStencil()
337{
338 return NULL;
339}
340
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000341GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000342{
343 return mWidth;
344}
345
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000346GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000347{
348 return mHeight;
349}
350
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000351GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000352{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000353 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000354}
355
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000356GLenum RenderbufferStorage::getActualFormat() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000357{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000358 return mActualFormat;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000359}
360
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000361GLsizei RenderbufferStorage::getSamples() const
362{
363 return mSamples;
364}
365
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000366unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000367{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000368 return mSerial;
369}
370
371unsigned int RenderbufferStorage::issueSerial()
372{
373 return mCurrentSerial++;
374}
375
376unsigned int RenderbufferStorage::issueCubeSerials()
377{
378 unsigned int firstSerial = mCurrentSerial;
379 mCurrentSerial += 6;
380 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000381}
382
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000383Colorbuffer::Colorbuffer(renderer::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000384{
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000385 mRenderTarget = swapChain->getRenderTarget();
386 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000387 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000388 D3DSURFACE_DESC description;
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000389 mRenderTarget->GetDesc(&description);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000390
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.com20d36662012-10-31 19:51:43 +0000395 mActualFormat = dx2es::GetEquivalentFormat(mD3DFormat);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000396 mSamples = dx2es::GetSamplesFromMultisampleType(description.MultiSampleType);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000397 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000398}
399
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000400Colorbuffer::Colorbuffer(int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000401{
daniel@transgaming.com2507f412012-10-31 18:46:48 +0000402 renderer::Renderer9 *renderer = getDisplay()->getRenderer();
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000403 IDirect3DDevice9 *device = renderer->getDevice(); // D3D9_REPLACE
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000404
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000405 D3DFORMAT requestedFormat = es2dx::ConvertRenderbufferFormat(format);
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000406 int supportedSamples = renderer->getNearestSupportedSamples(requestedFormat, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000407
408 if (supportedSamples == -1)
409 {
410 error(GL_OUT_OF_MEMORY);
411
412 return;
413 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000414
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000415 if (width > 0 && height > 0)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000416 {
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000417 HRESULT result = device->CreateRenderTarget(width, height, requestedFormat,
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000418 es2dx::GetMultisampleTypeFromSamples(supportedSamples), 0, FALSE, &mRenderTarget, NULL);
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000419
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000420 if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
421 {
422 error(GL_OUT_OF_MEMORY);
423
424 return;
425 }
426
427 ASSERT(SUCCEEDED(result));
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000428 }
429
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000430 mWidth = width;
431 mHeight = height;
432 mInternalFormat = format;
433 mD3DFormat = requestedFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000434 mActualFormat = dx2es::GetEquivalentFormat(mD3DFormat);
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000435 mSamples = supportedSamples;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000436}
437
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000438Colorbuffer::~Colorbuffer()
439{
440 if (mRenderTarget)
441 {
442 mRenderTarget->Release();
443 }
444}
445
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000446// Increments refcount on surface.
447// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000448IDirect3DSurface9 *Colorbuffer::getRenderTarget()
449{
daniel@transgaming.com5e4dbb32011-11-11 04:10:18 +0000450 if (mRenderTarget)
451 {
452 mRenderTarget->AddRef();
453 }
454
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000455 return mRenderTarget;
456}
457
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000458DepthStencilbuffer::DepthStencilbuffer(renderer::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000459{
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000460 mDepthStencil = swapChain->getDepthStencil();
461 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000462 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000463 D3DSURFACE_DESC description;
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000464 mDepthStencil->GetDesc(&description);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000465
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000466 mWidth = description.Width;
467 mHeight = description.Height;
468 mInternalFormat = dx2es::ConvertDepthStencilFormat(description.Format);
469 mSamples = dx2es::GetSamplesFromMultisampleType(description.MultiSampleType);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000470 mD3DFormat = description.Format;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000471 mActualFormat = dx2es::GetEquivalentFormat(mD3DFormat);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000472 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000473}
474
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000475DepthStencilbuffer::DepthStencilbuffer(int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000476{
daniel@transgaming.com2507f412012-10-31 18:46:48 +0000477 renderer::Renderer9 *renderer = getDisplay()->getRenderer();
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000478 IDirect3DDevice9 *device = renderer->getDevice(); // D3D9_REPLACE
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000479
480 mDepthStencil = NULL;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000481
daniel@transgaming.com06eef172012-10-31 18:31:50 +0000482 int supportedSamples = renderer->getNearestSupportedSamples(D3DFMT_D24S8, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000483
484 if (supportedSamples == -1)
485 {
486 error(GL_OUT_OF_MEMORY);
487
488 return;
489 }
490
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000491 if (width > 0 && height > 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000492 {
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000493 HRESULT result = device->CreateDepthStencilSurface(width, height, D3DFMT_D24S8, es2dx::GetMultisampleTypeFromSamples(supportedSamples),
494 0, FALSE, &mDepthStencil, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000495
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000496 if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
497 {
498 error(GL_OUT_OF_MEMORY);
499
500 return;
501 }
502
503 ASSERT(SUCCEEDED(result));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000504 }
505
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000506 mWidth = width;
507 mHeight = height;
508 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
509 mD3DFormat = D3DFMT_D24S8;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000510 mActualFormat = GL_DEPTH24_STENCIL8_OES;
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000511 mSamples = supportedSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000512}
513
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000514DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000515{
516 if (mDepthStencil)
517 {
518 mDepthStencil->Release();
519 }
520}
521
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000522// Increments refcount on surface.
523// caller must Release() the returned surface
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000524IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
525{
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000526 if (mDepthStencil)
527 {
528 mDepthStencil->AddRef();
529 }
530
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000531 return mDepthStencil;
532}
533
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000534Depthbuffer::Depthbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000535{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000536 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000537 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000538 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
539 // will expect one of the valid renderbuffer formats for use in
540 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000541 }
542}
543
544Depthbuffer::~Depthbuffer()
545{
546}
547
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000548Stencilbuffer::Stencilbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000549{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000550 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000551 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000552 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
553 // will expect one of the valid renderbuffer formats for use in
554 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000555 }
556}
557
558Stencilbuffer::~Stencilbuffer()
559{
560}
561
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000562}