blob: ff0ec6327085613a930cffc9c9d194b5bba1df06 [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.comd8e36562012-10-31 19:52:19 +000017#include "libGLESv2/renderer/renderer9_utils.h" // D3D9_REPLACE
18
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019namespace gl
20{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000021unsigned int RenderbufferStorage::mCurrentSerial = 1;
daniel@transgaming.com092bd482010-05-12 03:39:36 +000022
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000023RenderbufferInterface::RenderbufferInterface()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000024{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000025}
26
daniel@transgaming.com2678b342012-01-18 16:29:40 +000027// The default case for classes inherited from RenderbufferInterface is not to
28// need to do anything upon the reference count to the parent Renderbuffer incrementing
29// or decrementing.
30void RenderbufferInterface::addProxyRef(const Renderbuffer *proxy)
31{
32}
33
34void RenderbufferInterface::releaseProxy(const Renderbuffer *proxy)
35{
36}
37
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000038GLuint RenderbufferInterface::getRedSize() const
39{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000040 return gl::GetRedSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000041}
42
43GLuint RenderbufferInterface::getGreenSize() const
44{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000045 return gl::GetGreenSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000046}
47
48GLuint RenderbufferInterface::getBlueSize() const
49{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000050 return gl::GetBlueSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000051}
52
53GLuint RenderbufferInterface::getAlphaSize() const
54{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000055 return gl::GetAlphaSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000056}
57
58GLuint RenderbufferInterface::getDepthSize() const
59{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000060 return gl::GetDepthSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000061}
62
63GLuint RenderbufferInterface::getStencilSize() const
64{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000065 return gl::GetStencilSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000066}
67
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000068///// RenderbufferTexture2D Implementation ////////
69
70RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLenum target) : mTarget(target)
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000071{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000072 mTexture2D.set(texture);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000073}
74
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000075RenderbufferTexture2D::~RenderbufferTexture2D()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000076{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000077 mTexture2D.set(NULL);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000078}
79
daniel@transgaming.com2678b342012-01-18 16:29:40 +000080// Textures need to maintain their own reference count for references via
81// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000082void RenderbufferTexture2D::addProxyRef(const Renderbuffer *proxy)
daniel@transgaming.com2678b342012-01-18 16:29:40 +000083{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000084 mTexture2D->addProxyRef(proxy);
daniel@transgaming.com2678b342012-01-18 16:29:40 +000085}
86
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000087void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
daniel@transgaming.com2678b342012-01-18 16:29:40 +000088{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000089 mTexture2D->releaseProxy(proxy);
daniel@transgaming.com2678b342012-01-18 16:29:40 +000090}
91
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +000092// Increments refcount on surface.
93// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000094IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000095{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000096 return mTexture2D->getRenderTarget(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000097}
98
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +000099// Increments refcount on surface.
100// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000101IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000102{
daniel@transgaming.com68145c62012-05-31 01:14:46 +0000103 return mTexture2D->getDepthStencil(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000104}
105
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000106GLsizei RenderbufferTexture2D::getWidth() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000107{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000108 return mTexture2D->getWidth(0);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000109}
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000110
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000111GLsizei RenderbufferTexture2D::getHeight() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000112{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000113 return mTexture2D->getHeight(0);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000114}
115
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000116GLenum RenderbufferTexture2D::getInternalFormat() const
117{
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000118 return mTexture2D->getInternalFormat(0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000119}
120
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000121GLenum RenderbufferTexture2D::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000122{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000123 return mTexture2D->getActualFormat(0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000124}
125
126GLsizei RenderbufferTexture2D::getSamples() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000127{
128 return 0;
129}
130
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000131unsigned int RenderbufferTexture2D::getSerial() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000132{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000133 return mTexture2D->getRenderTargetSerial(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000134}
135
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000136///// RenderbufferTextureCubeMap Implementation ////////
137
138RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target) : mTarget(target)
139{
140 mTextureCubeMap.set(texture);
141}
142
143RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
144{
145 mTextureCubeMap.set(NULL);
146}
147
148// Textures need to maintain their own reference count for references via
149// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
150void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
151{
152 mTextureCubeMap->addProxyRef(proxy);
153}
154
155void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
156{
157 mTextureCubeMap->releaseProxy(proxy);
158}
159
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000160// Increments refcount on surface.
161// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000162IDirect3DSurface9 *RenderbufferTextureCubeMap::getRenderTarget()
163{
164 return mTextureCubeMap->getRenderTarget(mTarget);
165}
166
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000167// Increments refcount on surface.
168// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000169IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil()
170{
171 return NULL;
172}
173
174GLsizei RenderbufferTextureCubeMap::getWidth() const
175{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000176 return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000177}
178
179GLsizei RenderbufferTextureCubeMap::getHeight() const
180{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000181 return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000182}
183
184GLenum RenderbufferTextureCubeMap::getInternalFormat() const
185{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000186 return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000187}
188
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000189GLenum RenderbufferTextureCubeMap::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000190{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000191 return mTextureCubeMap->getActualFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000192}
193
194GLsizei RenderbufferTextureCubeMap::getSamples() const
195{
196 return 0;
197}
198
199unsigned int RenderbufferTextureCubeMap::getSerial() const
200{
201 return mTextureCubeMap->getRenderTargetSerial(mTarget);
202}
203
204////// Renderbuffer Implementation //////
205
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000206Renderbuffer::Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000207{
208 ASSERT(instance != NULL);
209 mInstance = instance;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000210}
211
212Renderbuffer::~Renderbuffer()
213{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000214 delete mInstance;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000215}
216
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000217// The RenderbufferInterface contained in this Renderbuffer may need to maintain
218// its own reference count, so we pass it on here.
219void Renderbuffer::addRef() const
220{
221 mInstance->addProxyRef(this);
222
223 RefCountObject::addRef();
224}
225
226void Renderbuffer::release() const
227{
228 mInstance->releaseProxy(this);
229
230 RefCountObject::release();
231}
232
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000233// Increments refcount on surface.
234// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000235IDirect3DSurface9 *Renderbuffer::getRenderTarget()
236{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000237 return mInstance->getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238}
239
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000240// Increments refcount on surface.
241// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000242IDirect3DSurface9 *Renderbuffer::getDepthStencil()
243{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000244 return mInstance->getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000245}
246
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000247GLsizei Renderbuffer::getWidth() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000248{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000249 return mInstance->getWidth();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000250}
251
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000252GLsizei Renderbuffer::getHeight() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000253{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000254 return mInstance->getHeight();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000255}
256
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000257GLenum Renderbuffer::getInternalFormat() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000258{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000259 return mInstance->getInternalFormat();
260}
261
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000262GLenum Renderbuffer::getActualFormat() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000263{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000264 return mInstance->getActualFormat();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000265}
266
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000267GLuint Renderbuffer::getRedSize() const
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000268{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000269 return mInstance->getRedSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000270}
271
272GLuint Renderbuffer::getGreenSize() const
273{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000274 return mInstance->getGreenSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000275}
276
277GLuint Renderbuffer::getBlueSize() const
278{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000279 return mInstance->getBlueSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000280}
281
282GLuint Renderbuffer::getAlphaSize() const
283{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000284 return mInstance->getAlphaSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000285}
286
287GLuint Renderbuffer::getDepthSize() const
288{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000289 return mInstance->getDepthSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000290}
291
292GLuint Renderbuffer::getStencilSize() const
293{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000294 return mInstance->getStencilSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000295}
296
297GLsizei Renderbuffer::getSamples() const
298{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000299 return mInstance->getSamples();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000300}
301
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000302unsigned int Renderbuffer::getSerial() const
303{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000304 return mInstance->getSerial();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000305}
306
307void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
308{
309 ASSERT(newStorage != NULL);
310
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000311 delete mInstance;
312 mInstance = newStorage;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000313}
314
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000315RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial())
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000316{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000317 mWidth = 0;
318 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000319 mInternalFormat = GL_RGBA4;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000320 mD3DFormat = D3DFMT_A8R8G8B8;
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.com96c38932012-10-31 18:42:52 +0000387 mRenderTarget = swapChain->getRenderTarget();
388 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000389 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000390 D3DSURFACE_DESC description;
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000391 mRenderTarget->GetDesc(&description);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000393 mWidth = description.Width;
394 mHeight = description.Height;
395 mInternalFormat = dx2es::ConvertBackBufferFormat(description.Format);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000396 mD3DFormat = description.Format;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000397 mActualFormat = dx2es::GetEquivalentFormat(mD3DFormat);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000398 mSamples = dx2es::GetSamplesFromMultisampleType(description.MultiSampleType);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000399 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000400}
401
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000402Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000403{
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000404 ASSERT(dynamic_cast<rx::Renderer9*>(renderer) != NULL); // D3D9_REPLACE
405 rx::Renderer9 *renderer9 = static_cast<rx::Renderer9*>(renderer); // D3D9_REPLACE
406 IDirect3DDevice9 *device = renderer9->getDevice(); // D3D9_REPLACE
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000407
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000408 D3DFORMAT requestedFormat = es2dx::ConvertRenderbufferFormat(format);
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000409 int supportedSamples = renderer9->getNearestSupportedSamples(requestedFormat, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000410
411 if (supportedSamples == -1)
412 {
413 error(GL_OUT_OF_MEMORY);
414
415 return;
416 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000417
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000418 if (width > 0 && height > 0)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000419 {
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000420 HRESULT result = device->CreateRenderTarget(width, height, requestedFormat,
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000421 es2dx::GetMultisampleTypeFromSamples(supportedSamples), 0, FALSE, &mRenderTarget, NULL);
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000422
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000423 if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
424 {
425 error(GL_OUT_OF_MEMORY);
426
427 return;
428 }
429
430 ASSERT(SUCCEEDED(result));
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000431 }
432
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000433 mWidth = width;
434 mHeight = height;
435 mInternalFormat = format;
436 mD3DFormat = requestedFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000437 mActualFormat = dx2es::GetEquivalentFormat(mD3DFormat);
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000438 mSamples = supportedSamples;
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000439}
440
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000441Colorbuffer::~Colorbuffer()
442{
443 if (mRenderTarget)
444 {
445 mRenderTarget->Release();
446 }
447}
448
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000449// Increments refcount on surface.
450// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000451IDirect3DSurface9 *Colorbuffer::getRenderTarget()
452{
daniel@transgaming.com5e4dbb32011-11-11 04:10:18 +0000453 if (mRenderTarget)
454 {
455 mRenderTarget->AddRef();
456 }
457
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000458 return mRenderTarget;
459}
460
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000461DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000462{
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000463 mDepthStencil = swapChain->getDepthStencil();
464 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000465 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000466 D3DSURFACE_DESC description;
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000467 mDepthStencil->GetDesc(&description);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000468
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000469 mWidth = description.Width;
470 mHeight = description.Height;
471 mInternalFormat = dx2es::ConvertDepthStencilFormat(description.Format);
472 mSamples = dx2es::GetSamplesFromMultisampleType(description.MultiSampleType);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000473 mD3DFormat = description.Format;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000474 mActualFormat = dx2es::GetEquivalentFormat(mD3DFormat);
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000475 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000476}
477
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000478DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000479{
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000480 ASSERT(dynamic_cast<rx::Renderer9*>(renderer) != NULL); // D3D9_REPLACE
481 rx::Renderer9 *renderer9 = static_cast<rx::Renderer9*>(renderer); // D3D9_REPLACE
482 IDirect3DDevice9 *device = renderer9->getDevice(); // D3D9_REPLACE
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000483
484 mDepthStencil = NULL;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000485
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000486 int supportedSamples = renderer9->getNearestSupportedSamples(D3DFMT_D24S8, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000487
488 if (supportedSamples == -1)
489 {
490 error(GL_OUT_OF_MEMORY);
491
492 return;
493 }
494
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000495 if (width > 0 && height > 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000496 {
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000497 HRESULT result = device->CreateDepthStencilSurface(width, height, D3DFMT_D24S8, es2dx::GetMultisampleTypeFromSamples(supportedSamples),
498 0, FALSE, &mDepthStencil, 0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000499
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000500 if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
501 {
502 error(GL_OUT_OF_MEMORY);
503
504 return;
505 }
506
507 ASSERT(SUCCEEDED(result));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000508 }
509
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000510 mWidth = width;
511 mHeight = height;
512 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
513 mD3DFormat = D3DFMT_D24S8;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000514 mActualFormat = GL_DEPTH24_STENCIL8_OES;
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000515 mSamples = supportedSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000516}
517
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000518DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519{
520 if (mDepthStencil)
521 {
522 mDepthStencil->Release();
523 }
524}
525
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000526// Increments refcount on surface.
527// caller must Release() the returned surface
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000528IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
529{
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000530 if (mDepthStencil)
531 {
532 mDepthStencil->AddRef();
533 }
534
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000535 return mDepthStencil;
536}
537
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000538Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000539{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000540 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000541 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000542 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
543 // will expect one of the valid renderbuffer formats for use in
544 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000545 }
546}
547
548Depthbuffer::~Depthbuffer()
549{
550}
551
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000552Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000553{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000554 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000555 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000556 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
557 // will expect one of the valid renderbuffer formats for use in
558 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000559 }
560}
561
562Stencilbuffer::~Stencilbuffer()
563{
564}
565
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000566}