blob: 3fa4d636ca9e2759669181658e4eb451acaf71cb [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.combdfb3912012-10-31 19:55:21 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Renderbuffer.cpp: the gl::Renderbuffer class and its derived classes
8// Colorbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
9// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
10
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011#include "libGLESv2/Renderbuffer.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000012
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013#include "libGLESv2/main.h"
enne@chromium.org0fa74632010-09-21 16:18:52 +000014#include "libGLESv2/Texture.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000015#include "libGLESv2/utilities.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016
daniel@transgaming.com042d1b42012-11-28 19:37:09 +000017#include "libGLESv2/renderer/RenderTarget9.h" // D3D9_REPLACE
daniel@transgaming.coma27e05b2012-11-28 19:39:42 +000018#include "libGLESv2/renderer/SwapChain9.h" // D3D9_REPLACE
daniel@transgaming.comd8e36562012-10-31 19:52:19 +000019#include "libGLESv2/renderer/renderer9_utils.h" // D3D9_REPLACE
20
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021namespace gl
22{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000023unsigned int RenderbufferStorage::mCurrentSerial = 1;
daniel@transgaming.com092bd482010-05-12 03:39:36 +000024
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000025RenderbufferInterface::RenderbufferInterface()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000027}
28
daniel@transgaming.com2678b342012-01-18 16:29:40 +000029// The default case for classes inherited from RenderbufferInterface is not to
30// need to do anything upon the reference count to the parent Renderbuffer incrementing
31// or decrementing.
32void RenderbufferInterface::addProxyRef(const Renderbuffer *proxy)
33{
34}
35
36void RenderbufferInterface::releaseProxy(const Renderbuffer *proxy)
37{
38}
39
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000040GLuint RenderbufferInterface::getRedSize() const
41{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000042 return gl::GetRedSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000043}
44
45GLuint RenderbufferInterface::getGreenSize() const
46{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000047 return gl::GetGreenSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000048}
49
50GLuint RenderbufferInterface::getBlueSize() const
51{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000052 return gl::GetBlueSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000053}
54
55GLuint RenderbufferInterface::getAlphaSize() const
56{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000057 return gl::GetAlphaSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000058}
59
60GLuint RenderbufferInterface::getDepthSize() const
61{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000062 return gl::GetDepthSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000063}
64
65GLuint RenderbufferInterface::getStencilSize() const
66{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000067 return gl::GetStencilSize(getActualFormat());
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000068}
69
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000070///// RenderbufferTexture2D Implementation ////////
71
72RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLenum target) : mTarget(target)
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000073{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000074 mTexture2D.set(texture);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000075}
76
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000077RenderbufferTexture2D::~RenderbufferTexture2D()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000078{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000079 mTexture2D.set(NULL);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000080}
81
daniel@transgaming.com2678b342012-01-18 16:29:40 +000082// Textures need to maintain their own reference count for references via
83// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000084void RenderbufferTexture2D::addProxyRef(const Renderbuffer *proxy)
daniel@transgaming.com2678b342012-01-18 16:29:40 +000085{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000086 mTexture2D->addProxyRef(proxy);
daniel@transgaming.com2678b342012-01-18 16:29:40 +000087}
88
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000089void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
daniel@transgaming.com2678b342012-01-18 16:29:40 +000090{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000091 mTexture2D->releaseProxy(proxy);
daniel@transgaming.com2678b342012-01-18 16:29:40 +000092}
93
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +000094// Increments refcount on surface.
95// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000096IDirect3DSurface9 *RenderbufferTexture2D::getRenderTarget()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000097{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000098 return mTexture2D->getRenderTarget(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000099}
100
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000101// Increments refcount on surface.
102// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000103IDirect3DSurface9 *RenderbufferTexture2D::getDepthStencil()
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000104{
daniel@transgaming.com68145c62012-05-31 01:14:46 +0000105 return mTexture2D->getDepthStencil(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000106}
107
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000108GLsizei RenderbufferTexture2D::getWidth() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000109{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000110 return mTexture2D->getWidth(0);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000111}
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000112
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000113GLsizei RenderbufferTexture2D::getHeight() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000114{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000115 return mTexture2D->getHeight(0);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000116}
117
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000118GLenum RenderbufferTexture2D::getInternalFormat() const
119{
daniel@transgaming.com92f49922012-05-09 15:49:19 +0000120 return mTexture2D->getInternalFormat(0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000121}
122
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000123GLenum RenderbufferTexture2D::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000124{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000125 return mTexture2D->getActualFormat(0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000126}
127
128GLsizei RenderbufferTexture2D::getSamples() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000129{
130 return 0;
131}
132
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000133unsigned int RenderbufferTexture2D::getSerial() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000134{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000135 return mTexture2D->getRenderTargetSerial(mTarget);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000136}
137
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000138///// RenderbufferTextureCubeMap Implementation ////////
139
140RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target) : mTarget(target)
141{
142 mTextureCubeMap.set(texture);
143}
144
145RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
146{
147 mTextureCubeMap.set(NULL);
148}
149
150// Textures need to maintain their own reference count for references via
151// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
152void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
153{
154 mTextureCubeMap->addProxyRef(proxy);
155}
156
157void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
158{
159 mTextureCubeMap->releaseProxy(proxy);
160}
161
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000162// Increments refcount on surface.
163// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000164IDirect3DSurface9 *RenderbufferTextureCubeMap::getRenderTarget()
165{
166 return mTextureCubeMap->getRenderTarget(mTarget);
167}
168
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000169// Increments refcount on surface.
170// caller must Release() the returned surface
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000171IDirect3DSurface9 *RenderbufferTextureCubeMap::getDepthStencil()
172{
173 return NULL;
174}
175
176GLsizei RenderbufferTextureCubeMap::getWidth() const
177{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000178 return mTextureCubeMap->getWidth(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000179}
180
181GLsizei RenderbufferTextureCubeMap::getHeight() const
182{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000183 return mTextureCubeMap->getHeight(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000184}
185
186GLenum RenderbufferTextureCubeMap::getInternalFormat() const
187{
daniel@transgaming.com4df88e82012-05-09 15:49:24 +0000188 return mTextureCubeMap->getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000189}
190
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000191GLenum RenderbufferTextureCubeMap::getActualFormat() const
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000192{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000193 return mTextureCubeMap->getActualFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000194}
195
196GLsizei RenderbufferTextureCubeMap::getSamples() const
197{
198 return 0;
199}
200
201unsigned int RenderbufferTextureCubeMap::getSerial() const
202{
203 return mTextureCubeMap->getRenderTargetSerial(mTarget);
204}
205
206////// Renderbuffer Implementation //////
207
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000208Renderbuffer::Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000209{
210 ASSERT(instance != NULL);
211 mInstance = instance;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000212}
213
214Renderbuffer::~Renderbuffer()
215{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000216 delete mInstance;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000217}
218
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000219// The RenderbufferInterface contained in this Renderbuffer may need to maintain
220// its own reference count, so we pass it on here.
221void Renderbuffer::addRef() const
222{
223 mInstance->addProxyRef(this);
224
225 RefCountObject::addRef();
226}
227
228void Renderbuffer::release() const
229{
230 mInstance->releaseProxy(this);
231
232 RefCountObject::release();
233}
234
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000235// Increments refcount on surface.
236// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000237IDirect3DSurface9 *Renderbuffer::getRenderTarget()
238{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000239 return mInstance->getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000240}
241
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000242// Increments refcount on surface.
243// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000244IDirect3DSurface9 *Renderbuffer::getDepthStencil()
245{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000246 return mInstance->getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000247}
248
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000249GLsizei Renderbuffer::getWidth() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000250{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000251 return mInstance->getWidth();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000252}
253
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000254GLsizei Renderbuffer::getHeight() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000255{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000256 return mInstance->getHeight();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000257}
258
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000259GLenum Renderbuffer::getInternalFormat() const
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000260{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000261 return mInstance->getInternalFormat();
262}
263
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000264GLenum Renderbuffer::getActualFormat() const
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000265{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000266 return mInstance->getActualFormat();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000267}
268
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000269GLuint Renderbuffer::getRedSize() const
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000270{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000271 return mInstance->getRedSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000272}
273
274GLuint Renderbuffer::getGreenSize() const
275{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000276 return mInstance->getGreenSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000277}
278
279GLuint Renderbuffer::getBlueSize() const
280{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000281 return mInstance->getBlueSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000282}
283
284GLuint Renderbuffer::getAlphaSize() const
285{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000286 return mInstance->getAlphaSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000287}
288
289GLuint Renderbuffer::getDepthSize() const
290{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000291 return mInstance->getDepthSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000292}
293
294GLuint Renderbuffer::getStencilSize() const
295{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000296 return mInstance->getStencilSize();
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000297}
298
299GLsizei Renderbuffer::getSamples() const
300{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000301 return mInstance->getSamples();
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000302}
303
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000304unsigned int Renderbuffer::getSerial() const
305{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000306 return mInstance->getSerial();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000307}
308
309void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
310{
311 ASSERT(newStorage != NULL);
312
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000313 delete mInstance;
314 mInstance = newStorage;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000315}
316
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000317RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial())
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000318{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000319 mWidth = 0;
320 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000321 mInternalFormat = GL_RGBA4;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000322 mActualFormat = GL_RGBA8_OES;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000323 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000324}
325
326RenderbufferStorage::~RenderbufferStorage()
327{
328}
329
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000330// Increments refcount on surface.
331// caller must Release() the returned surface
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000332IDirect3DSurface9 *RenderbufferStorage::getRenderTarget()
333{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000334 return NULL;
335}
336
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000337// Increments refcount on surface.
338// caller must Release() the returned surface
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000339IDirect3DSurface9 *RenderbufferStorage::getDepthStencil()
340{
341 return NULL;
342}
343
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000344GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000345{
346 return mWidth;
347}
348
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000349GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000350{
351 return mHeight;
352}
353
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000354GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000355{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000356 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000357}
358
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000359GLenum RenderbufferStorage::getActualFormat() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000360{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000361 return mActualFormat;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000362}
363
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000364GLsizei RenderbufferStorage::getSamples() const
365{
366 return mSamples;
367}
368
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000369unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000370{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000371 return mSerial;
372}
373
374unsigned int RenderbufferStorage::issueSerial()
375{
376 return mCurrentSerial++;
377}
378
379unsigned int RenderbufferStorage::issueCubeSerials()
380{
381 unsigned int firstSerial = mCurrentSerial;
382 mCurrentSerial += 6;
383 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000384}
385
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000386Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000387{
daniel@transgaming.coma27e05b2012-11-28 19:39:42 +0000388 rx::SwapChain9 *swapChain9 = static_cast<rx::SwapChain9*>(swapChain);
389 mRenderTarget = new rx::RenderTarget9(renderer, swapChain9->getRenderTarget());
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000390 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000391 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000392 mWidth = mRenderTarget->getWidth();
393 mHeight = mRenderTarget->getHeight();
394 mInternalFormat = mRenderTarget->getInternalFormat();
395 mActualFormat = mRenderTarget->getActualFormat();
396 mSamples = mRenderTarget->getSamples();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000397 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000398}
399
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000400Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000401{
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000402
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000403 mRenderTarget = new rx::RenderTarget9(renderer, width, height, format, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000404
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000405 if (mRenderTarget)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000406 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000407 mWidth = width;
408 mHeight = height;
409 mInternalFormat = format;
410 mActualFormat = mRenderTarget->getActualFormat();
411 mSamples = mRenderTarget->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000412 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000413}
414
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000415Colorbuffer::~Colorbuffer()
416{
417 if (mRenderTarget)
418 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000419 delete mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000420 }
421}
422
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000423// Increments refcount on surface.
424// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000425IDirect3DSurface9 *Colorbuffer::getRenderTarget()
426{
daniel@transgaming.com5e4dbb32011-11-11 04:10:18 +0000427 if (mRenderTarget)
428 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000429 return mRenderTarget->getSurface();
daniel@transgaming.com5e4dbb32011-11-11 04:10:18 +0000430 }
431
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000432 return NULL;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000433}
434
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000435DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000436{
daniel@transgaming.coma27e05b2012-11-28 19:39:42 +0000437 rx::SwapChain9 *swapChain9 = static_cast<rx::SwapChain9*>(swapChain);
438 mDepthStencil = new rx::RenderTarget9(renderer, swapChain9->getDepthStencil());
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000439 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000440 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000441 mWidth = mDepthStencil->getWidth();
442 mHeight = mDepthStencil->getHeight();
443 mInternalFormat = mDepthStencil->getInternalFormat();
444 mSamples = mDepthStencil->getSamples();
445 mActualFormat = mDepthStencil->getActualFormat();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000446 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000447}
448
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000449DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000450{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000451
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000452 mDepthStencil = new rx::RenderTarget9(renderer, width, height, GL_DEPTH24_STENCIL8_OES, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000453
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000454 mWidth = mDepthStencil->getWidth();
455 mHeight = mDepthStencil->getHeight();
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000456 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000457 mActualFormat = mDepthStencil->getActualFormat();
458 mSamples = mDepthStencil->getSamples();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000459}
460
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000461DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000462{
463 if (mDepthStencil)
464 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000465 delete mDepthStencil;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000466 }
467}
468
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000469// Increments refcount on surface.
470// caller must Release() the returned surface
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000471IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
472{
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000473 if (mDepthStencil)
474 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000475 return mDepthStencil->getSurface();
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000476 }
477
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000478 return NULL;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000479}
480
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000481Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000482{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000483 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000484 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000485 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
486 // will expect one of the valid renderbuffer formats for use in
487 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000488 }
489}
490
491Depthbuffer::~Depthbuffer()
492{
493}
494
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000495Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000496{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000497 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000498 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000499 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
500 // will expect one of the valid renderbuffer formats for use in
501 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000502 }
503}
504
505Stencilbuffer::~Stencilbuffer()
506{
507}
508
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000509}