blob: 9b926980203b19324435d9944641e8b6b422c581 [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
John Bauman66b8ab22014-05-06 15:57:45 -04002//
Nicolas Capens0bac2852016-05-07 06:09:58 -04003// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
John Bauman66b8ab22014-05-06 15:57:45 -04006//
Nicolas Capens0bac2852016-05-07 06:09:58 -04007// http://www.apache.org/licenses/LICENSE-2.0
John Bauman66b8ab22014-05-06 15:57:45 -04008//
Nicolas Capens0bac2852016-05-07 06:09:58 -04009// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
John Bauman66b8ab22014-05-06 15:57:45 -040014
15// Renderbuffer.cpp: the Renderbuffer class and its derived classes
16// Colorbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
17// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
18
19#include "Renderbuffer.h"
20
21#include "main.h"
22#include "Texture.h"
23#include "utilities.h"
24
Nicolas Capens14ee7622014-10-28 23:48:41 -040025namespace es2
John Bauman66b8ab22014-05-06 15:57:45 -040026{
27RenderbufferInterface::RenderbufferInterface()
28{
29}
30
31// The default case for classes inherited from RenderbufferInterface is not to
32// need to do anything upon the reference count to the parent Renderbuffer incrementing
Nicolas Capens0bac2852016-05-07 06:09:58 -040033// or decrementing.
John Bauman66b8ab22014-05-06 15:57:45 -040034void RenderbufferInterface::addProxyRef(const Renderbuffer *proxy)
35{
36}
37
38void RenderbufferInterface::releaseProxy(const Renderbuffer *proxy)
39{
40}
41
42GLuint RenderbufferInterface::getRedSize() const
43{
44 return sw2es::GetRedSize(getInternalFormat());
45}
46
47GLuint RenderbufferInterface::getGreenSize() const
48{
49 return sw2es::GetGreenSize(getInternalFormat());
50}
51
52GLuint RenderbufferInterface::getBlueSize() const
53{
54 return sw2es::GetBlueSize(getInternalFormat());
55}
56
57GLuint RenderbufferInterface::getAlphaSize() const
58{
59 return sw2es::GetAlphaSize(getInternalFormat());
60}
61
62GLuint RenderbufferInterface::getDepthSize() const
63{
64 return sw2es::GetDepthSize(getInternalFormat());
65}
66
67GLuint RenderbufferInterface::getStencilSize() const
68{
69 return sw2es::GetStencilSize(getInternalFormat());
70}
71
72///// RenderbufferTexture2D Implementation ////////
73
Alexis Hetu8af50072015-04-29 14:29:49 -040074RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLint level) : mLevel(level)
John Bauman66b8ab22014-05-06 15:57:45 -040075{
Nicolas Capensd7d9b4b2015-01-29 23:46:44 -050076 mTexture2D = texture;
John Bauman66b8ab22014-05-06 15:57:45 -040077}
78
79RenderbufferTexture2D::~RenderbufferTexture2D()
80{
Nicolas Capensd7d9b4b2015-01-29 23:46:44 -050081 mTexture2D = NULL;
John Bauman66b8ab22014-05-06 15:57:45 -040082}
83
84// Textures need to maintain their own reference count for references via
85// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
86void RenderbufferTexture2D::addProxyRef(const Renderbuffer *proxy)
87{
Alexis Hetub027aa92015-01-19 15:56:12 -050088 mTexture2D->addProxyRef(proxy);
John Bauman66b8ab22014-05-06 15:57:45 -040089}
90
91void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
92{
Alexis Hetub027aa92015-01-19 15:56:12 -050093 mTexture2D->releaseProxy(proxy);
John Bauman66b8ab22014-05-06 15:57:45 -040094}
95
Nicolas Capens6e77a642014-06-12 00:13:37 -040096// Increments refcount on image.
97// caller must release() the returned image
Nicolas Capensead7ac52014-10-27 23:56:02 -040098egl::Image *RenderbufferTexture2D::getRenderTarget()
John Bauman66b8ab22014-05-06 15:57:45 -040099{
Alexis Hetu8af50072015-04-29 14:29:49 -0400100 return mTexture2D->getRenderTarget(GL_TEXTURE_2D, mLevel);
John Bauman66b8ab22014-05-06 15:57:45 -0400101}
102
Nicolas Capens6e77a642014-06-12 00:13:37 -0400103// Increments refcount on image.
104// caller must release() the returned image
Nicolas Capensead7ac52014-10-27 23:56:02 -0400105egl::Image *RenderbufferTexture2D::createSharedImage()
Nicolas Capens6e77a642014-06-12 00:13:37 -0400106{
Alexis Hetu8af50072015-04-29 14:29:49 -0400107 return mTexture2D->createSharedImage(GL_TEXTURE_2D, mLevel);
Nicolas Capens6e77a642014-06-12 00:13:37 -0400108}
109
110bool RenderbufferTexture2D::isShared() const
111{
Alexis Hetu8af50072015-04-29 14:29:49 -0400112 return mTexture2D->isShared(GL_TEXTURE_2D, mLevel);
Nicolas Capens6e77a642014-06-12 00:13:37 -0400113}
114
John Bauman66b8ab22014-05-06 15:57:45 -0400115GLsizei RenderbufferTexture2D::getWidth() const
116{
Alexis Hetu8af50072015-04-29 14:29:49 -0400117 return mTexture2D->getWidth(GL_TEXTURE_2D, mLevel);
John Bauman66b8ab22014-05-06 15:57:45 -0400118}
119
120GLsizei RenderbufferTexture2D::getHeight() const
121{
Alexis Hetu8af50072015-04-29 14:29:49 -0400122 return mTexture2D->getHeight(GL_TEXTURE_2D, mLevel);
John Bauman66b8ab22014-05-06 15:57:45 -0400123}
124
125GLenum RenderbufferTexture2D::getFormat() const
126{
Alexis Hetu8af50072015-04-29 14:29:49 -0400127 return mTexture2D->getFormat(GL_TEXTURE_2D, mLevel);
John Bauman66b8ab22014-05-06 15:57:45 -0400128}
129
130sw::Format RenderbufferTexture2D::getInternalFormat() const
131{
Alexis Hetu8af50072015-04-29 14:29:49 -0400132 return mTexture2D->getInternalFormat(GL_TEXTURE_2D, mLevel);
John Bauman66b8ab22014-05-06 15:57:45 -0400133}
134
135GLsizei RenderbufferTexture2D::getSamples() const
136{
137 return 0;
138}
139
Alexis Hetub027aa92015-01-19 15:56:12 -0500140///// RenderbufferTexture3D Implementation ////////
141
Alexis Hetu8af50072015-04-29 14:29:49 -0400142RenderbufferTexture3D::RenderbufferTexture3D(Texture3D *texture, GLint level, GLint layer) : mLevel(level), mLayer(layer)
Alexis Hetub027aa92015-01-19 15:56:12 -0500143{
Nicolas Capensd7d9b4b2015-01-29 23:46:44 -0500144 mTexture3D = texture;
Alexis Hetu8af50072015-04-29 14:29:49 -0400145 if(mLayer != 0)
146 {
147 UNIMPLEMENTED();
148 }
Alexis Hetub027aa92015-01-19 15:56:12 -0500149}
150
151RenderbufferTexture3D::~RenderbufferTexture3D()
152{
Nicolas Capensd7d9b4b2015-01-29 23:46:44 -0500153 mTexture3D = NULL;
Alexis Hetub027aa92015-01-19 15:56:12 -0500154}
155
156// Textures need to maintain their own reference count for references via
157// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
158void RenderbufferTexture3D::addProxyRef(const Renderbuffer *proxy)
159{
160 mTexture3D->addProxyRef(proxy);
161}
162
163void RenderbufferTexture3D::releaseProxy(const Renderbuffer *proxy)
164{
165 mTexture3D->releaseProxy(proxy);
166}
167
168// Increments refcount on image.
169// caller must release() the returned image
170egl::Image *RenderbufferTexture3D::getRenderTarget()
171{
Alexis Hetu8af50072015-04-29 14:29:49 -0400172 return mTexture3D->getRenderTarget(mTexture3D->getTarget(), mLevel);
Alexis Hetub027aa92015-01-19 15:56:12 -0500173}
174
175// Increments refcount on image.
176// caller must release() the returned image
177egl::Image *RenderbufferTexture3D::createSharedImage()
178{
Alexis Hetu8af50072015-04-29 14:29:49 -0400179 return mTexture3D->createSharedImage(mTexture3D->getTarget(), mLevel);
Alexis Hetub027aa92015-01-19 15:56:12 -0500180}
181
182bool RenderbufferTexture3D::isShared() const
183{
Alexis Hetu8af50072015-04-29 14:29:49 -0400184 return mTexture3D->isShared(mTexture3D->getTarget(), mLevel);
Alexis Hetub027aa92015-01-19 15:56:12 -0500185}
186
187GLsizei RenderbufferTexture3D::getWidth() const
188{
Alexis Hetu8af50072015-04-29 14:29:49 -0400189 return mTexture3D->getWidth(mTexture3D->getTarget(), mLevel);
Alexis Hetub027aa92015-01-19 15:56:12 -0500190}
191
192GLsizei RenderbufferTexture3D::getHeight() const
193{
Alexis Hetu8af50072015-04-29 14:29:49 -0400194 return mTexture3D->getHeight(mTexture3D->getTarget(), mLevel);
Alexis Hetub027aa92015-01-19 15:56:12 -0500195}
196
Alexis Hetue23029a2015-12-04 17:12:35 -0500197GLsizei RenderbufferTexture3D::getDepth() const
198{
199 return mTexture3D->getDepth(mTexture3D->getTarget(), mLevel);
200}
201
Alexis Hetub027aa92015-01-19 15:56:12 -0500202GLenum RenderbufferTexture3D::getFormat() const
203{
Alexis Hetu8af50072015-04-29 14:29:49 -0400204 return mTexture3D->getFormat(mTexture3D->getTarget(), mLevel);
Alexis Hetub027aa92015-01-19 15:56:12 -0500205}
206
207sw::Format RenderbufferTexture3D::getInternalFormat() const
208{
Alexis Hetu8af50072015-04-29 14:29:49 -0400209 return mTexture3D->getInternalFormat(mTexture3D->getTarget(), mLevel);
Alexis Hetub027aa92015-01-19 15:56:12 -0500210}
211
212GLsizei RenderbufferTexture3D::getSamples() const
213{
214 return 0;
215}
216
John Bauman66b8ab22014-05-06 15:57:45 -0400217///// RenderbufferTextureCubeMap Implementation ////////
218
Alexis Hetu8af50072015-04-29 14:29:49 -0400219RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target, GLint level) : mTarget(target), mLevel(level)
John Bauman66b8ab22014-05-06 15:57:45 -0400220{
Nicolas Capensd7d9b4b2015-01-29 23:46:44 -0500221 mTextureCubeMap = texture;
John Bauman66b8ab22014-05-06 15:57:45 -0400222}
223
224RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
225{
Nicolas Capensd7d9b4b2015-01-29 23:46:44 -0500226 mTextureCubeMap = NULL;
John Bauman66b8ab22014-05-06 15:57:45 -0400227}
228
229// Textures need to maintain their own reference count for references via
230// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
231void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
232{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400233 mTextureCubeMap->addProxyRef(proxy);
John Bauman66b8ab22014-05-06 15:57:45 -0400234}
235
236void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
237{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400238 mTextureCubeMap->releaseProxy(proxy);
John Bauman66b8ab22014-05-06 15:57:45 -0400239}
240
Nicolas Capens6e77a642014-06-12 00:13:37 -0400241// Increments refcount on image.
242// caller must release() the returned image
Nicolas Capensdeda34b2015-04-28 15:21:53 -0700243egl::Image *RenderbufferTextureCubeMap::getRenderTarget()
John Bauman66b8ab22014-05-06 15:57:45 -0400244{
Alexis Hetu8af50072015-04-29 14:29:49 -0400245 return mTextureCubeMap->getRenderTarget(mTarget, mLevel);
John Bauman66b8ab22014-05-06 15:57:45 -0400246}
247
Nicolas Capens6e77a642014-06-12 00:13:37 -0400248// Increments refcount on image.
249// caller must release() the returned image
Nicolas Capensead7ac52014-10-27 23:56:02 -0400250egl::Image *RenderbufferTextureCubeMap::createSharedImage()
Nicolas Capens6e77a642014-06-12 00:13:37 -0400251{
Alexis Hetu8af50072015-04-29 14:29:49 -0400252 return mTextureCubeMap->createSharedImage(mTarget, mLevel);
Nicolas Capens6e77a642014-06-12 00:13:37 -0400253}
254
255bool RenderbufferTextureCubeMap::isShared() const
256{
Alexis Hetu8af50072015-04-29 14:29:49 -0400257 return mTextureCubeMap->isShared(mTarget, mLevel);
Nicolas Capens6e77a642014-06-12 00:13:37 -0400258}
259
John Bauman66b8ab22014-05-06 15:57:45 -0400260GLsizei RenderbufferTextureCubeMap::getWidth() const
261{
Alexis Hetu8af50072015-04-29 14:29:49 -0400262 return mTextureCubeMap->getWidth(mTarget, mLevel);
John Bauman66b8ab22014-05-06 15:57:45 -0400263}
264
265GLsizei RenderbufferTextureCubeMap::getHeight() const
266{
Alexis Hetu8af50072015-04-29 14:29:49 -0400267 return mTextureCubeMap->getHeight(mTarget, mLevel);
John Bauman66b8ab22014-05-06 15:57:45 -0400268}
269
270GLenum RenderbufferTextureCubeMap::getFormat() const
271{
Alexis Hetu8af50072015-04-29 14:29:49 -0400272 return mTextureCubeMap->getFormat(mTarget, mLevel);
John Bauman66b8ab22014-05-06 15:57:45 -0400273}
274
275sw::Format RenderbufferTextureCubeMap::getInternalFormat() const
276{
Alexis Hetu8af50072015-04-29 14:29:49 -0400277 return mTextureCubeMap->getInternalFormat(mTarget, mLevel);
John Bauman66b8ab22014-05-06 15:57:45 -0400278}
279
280GLsizei RenderbufferTextureCubeMap::getSamples() const
281{
282 return 0;
283}
284
285////// Renderbuffer Implementation //////
286
Nicolas Capense826ef02015-04-02 14:43:13 -0400287Renderbuffer::Renderbuffer(GLuint name, RenderbufferInterface *instance) : NamedObject(name)
John Bauman66b8ab22014-05-06 15:57:45 -0400288{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400289 ASSERT(instance);
John Bauman66b8ab22014-05-06 15:57:45 -0400290 mInstance = instance;
291}
292
293Renderbuffer::~Renderbuffer()
294{
295 delete mInstance;
296}
297
298// The RenderbufferInterface contained in this Renderbuffer may need to maintain
299// its own reference count, so we pass it on here.
300void Renderbuffer::addRef()
301{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400302 mInstance->addProxyRef(this);
John Bauman66b8ab22014-05-06 15:57:45 -0400303
Nicolas Capens0bac2852016-05-07 06:09:58 -0400304 Object::addRef();
John Bauman66b8ab22014-05-06 15:57:45 -0400305}
306
307void Renderbuffer::release()
308{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400309 mInstance->releaseProxy(this);
John Bauman66b8ab22014-05-06 15:57:45 -0400310
Nicolas Capens0bac2852016-05-07 06:09:58 -0400311 Object::release();
John Bauman66b8ab22014-05-06 15:57:45 -0400312}
313
Nicolas Capens6e77a642014-06-12 00:13:37 -0400314// Increments refcount on image.
315// caller must Release() the returned image
Nicolas Capensead7ac52014-10-27 23:56:02 -0400316egl::Image *Renderbuffer::getRenderTarget()
John Bauman66b8ab22014-05-06 15:57:45 -0400317{
318 return mInstance->getRenderTarget();
319}
320
Nicolas Capens6e77a642014-06-12 00:13:37 -0400321// Increments refcount on image.
322// caller must Release() the returned image
Nicolas Capensead7ac52014-10-27 23:56:02 -0400323egl::Image *Renderbuffer::createSharedImage()
Nicolas Capens6e77a642014-06-12 00:13:37 -0400324{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400325 return mInstance->createSharedImage();
Nicolas Capens6e77a642014-06-12 00:13:37 -0400326}
327
328bool Renderbuffer::isShared() const
329{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400330 return mInstance->isShared();
Nicolas Capens6e77a642014-06-12 00:13:37 -0400331}
332
John Bauman66b8ab22014-05-06 15:57:45 -0400333GLsizei Renderbuffer::getWidth() const
334{
335 return mInstance->getWidth();
336}
337
338GLsizei Renderbuffer::getHeight() const
339{
340 return mInstance->getHeight();
341}
342
Alexis Hetue23029a2015-12-04 17:12:35 -0500343GLsizei Renderbuffer::getDepth() const
344{
345 return mInstance->getDepth();
346}
347
Alexis Hetu074c6412015-06-22 15:57:27 -0400348GLint Renderbuffer::getLayer() const
349{
350 return mInstance->getLayer();
351}
352
Alexis Hetu526a89d2016-02-11 15:41:27 -0500353GLint Renderbuffer::getLevel() const
354{
355 return mInstance->getLevel();
356}
357
John Bauman66b8ab22014-05-06 15:57:45 -0400358GLenum Renderbuffer::getFormat() const
359{
360 return mInstance->getFormat();
361}
362
363sw::Format Renderbuffer::getInternalFormat() const
364{
365 return mInstance->getInternalFormat();
366}
367
368GLuint Renderbuffer::getRedSize() const
369{
370 return mInstance->getRedSize();
371}
372
373GLuint Renderbuffer::getGreenSize() const
374{
375 return mInstance->getGreenSize();
376}
377
378GLuint Renderbuffer::getBlueSize() const
379{
380 return mInstance->getBlueSize();
381}
382
383GLuint Renderbuffer::getAlphaSize() const
384{
385 return mInstance->getAlphaSize();
386}
387
388GLuint Renderbuffer::getDepthSize() const
389{
390 return mInstance->getDepthSize();
391}
392
393GLuint Renderbuffer::getStencilSize() const
394{
395 return mInstance->getStencilSize();
396}
397
398GLsizei Renderbuffer::getSamples() const
399{
400 return mInstance->getSamples();
401}
402
Alexis Hetu526a89d2016-02-11 15:41:27 -0500403void Renderbuffer::setLayer(GLint layer)
404{
405 return mInstance->setLayer(layer);
406}
407
408void Renderbuffer::setLevel(GLint level)
409{
410 return mInstance->setLevel(level);
411}
412
John Bauman66b8ab22014-05-06 15:57:45 -0400413void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
414{
415 ASSERT(newStorage != NULL);
416
417 delete mInstance;
418 mInstance = newStorage;
419}
420
421RenderbufferStorage::RenderbufferStorage()
422{
423 mWidth = 0;
424 mHeight = 0;
425 format = GL_RGBA4;
Nicolas Capensde6b75c2015-03-29 00:27:33 -0400426 internalFormat = sw::FORMAT_A8B8G8R8;
John Bauman66b8ab22014-05-06 15:57:45 -0400427 mSamples = 0;
428}
429
430RenderbufferStorage::~RenderbufferStorage()
431{
432}
433
John Bauman66b8ab22014-05-06 15:57:45 -0400434GLsizei RenderbufferStorage::getWidth() const
435{
436 return mWidth;
437}
438
439GLsizei RenderbufferStorage::getHeight() const
440{
441 return mHeight;
442}
443
444GLenum RenderbufferStorage::getFormat() const
445{
446 return format;
447}
448
449sw::Format RenderbufferStorage::getInternalFormat() const
450{
451 return internalFormat;
452}
453
454GLsizei RenderbufferStorage::getSamples() const
455{
456 return mSamples;
457}
458
Nicolas Capensead7ac52014-10-27 23:56:02 -0400459Colorbuffer::Colorbuffer(egl::Image *renderTarget) : mRenderTarget(renderTarget)
John Bauman66b8ab22014-05-06 15:57:45 -0400460{
461 if(renderTarget)
462 {
463 renderTarget->addRef();
Nicolas Capens0bac2852016-05-07 06:09:58 -0400464
John Bauman66b8ab22014-05-06 15:57:45 -0400465 mWidth = renderTarget->getWidth();
466 mHeight = renderTarget->getHeight();
467 internalFormat = renderTarget->getInternalFormat();
468 format = sw2es::ConvertBackBufferFormat(internalFormat);
Alexis Hetub027aa92015-01-19 15:56:12 -0500469 mSamples = renderTarget->getDepth() & ~1;
John Bauman66b8ab22014-05-06 15:57:45 -0400470 }
471}
472
Nicolas Capens3ff330f2015-09-03 16:41:09 -0400473Colorbuffer::Colorbuffer(int width, int height, GLenum format, GLsizei samples) : mRenderTarget(nullptr)
John Bauman66b8ab22014-05-06 15:57:45 -0400474{
475 Device *device = getDevice();
476
477 sw::Format requestedFormat = es2sw::ConvertRenderbufferFormat(format);
Nicolas Capens3ff330f2015-09-03 16:41:09 -0400478 int supportedSamples = Context::getSupportedMultisampleCount(samples);
John Bauman66b8ab22014-05-06 15:57:45 -0400479
480 if(width > 0 && height > 0)
481 {
482 mRenderTarget = device->createRenderTarget(width, height, requestedFormat, supportedSamples, false);
483
484 if(!mRenderTarget)
485 {
486 error(GL_OUT_OF_MEMORY);
487 return;
488 }
489 }
490
491 mWidth = width;
492 mHeight = height;
493 this->format = format;
494 internalFormat = requestedFormat;
Alexis Hetu7a570402015-07-02 13:46:59 -0400495 mSamples = supportedSamples;
John Bauman66b8ab22014-05-06 15:57:45 -0400496}
497
498Colorbuffer::~Colorbuffer()
499{
500 if(mRenderTarget)
501 {
502 mRenderTarget->release();
503 }
504}
505
Nicolas Capens6e77a642014-06-12 00:13:37 -0400506// Increments refcount on image.
507// caller must release() the returned image
Nicolas Capensead7ac52014-10-27 23:56:02 -0400508egl::Image *Colorbuffer::getRenderTarget()
John Bauman66b8ab22014-05-06 15:57:45 -0400509{
510 if(mRenderTarget)
511 {
512 mRenderTarget->addRef();
513 }
514
515 return mRenderTarget;
516}
517
Nicolas Capens6e77a642014-06-12 00:13:37 -0400518// Increments refcount on image.
519// caller must release() the returned image
Nicolas Capensead7ac52014-10-27 23:56:02 -0400520egl::Image *Colorbuffer::createSharedImage()
Nicolas Capens6e77a642014-06-12 00:13:37 -0400521{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400522 if(mRenderTarget)
523 {
524 mRenderTarget->addRef();
525 mRenderTarget->markShared();
526 }
Nicolas Capens6e77a642014-06-12 00:13:37 -0400527
Nicolas Capens0bac2852016-05-07 06:09:58 -0400528 return mRenderTarget;
Nicolas Capens6e77a642014-06-12 00:13:37 -0400529}
530
531bool Colorbuffer::isShared() const
532{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400533 return mRenderTarget->isShared();
Nicolas Capens6e77a642014-06-12 00:13:37 -0400534}
535
Nicolas Capensead7ac52014-10-27 23:56:02 -0400536DepthStencilbuffer::DepthStencilbuffer(egl::Image *depthStencil) : mDepthStencil(depthStencil)
John Bauman66b8ab22014-05-06 15:57:45 -0400537{
538 if(depthStencil)
539 {
540 depthStencil->addRef();
541
542 mWidth = depthStencil->getWidth();
543 mHeight = depthStencil->getHeight();
544 internalFormat = depthStencil->getInternalFormat();
545 format = sw2es::ConvertDepthStencilFormat(internalFormat);
Alexis Hetub027aa92015-01-19 15:56:12 -0500546 mSamples = depthStencil->getDepth() & ~1;
John Bauman66b8ab22014-05-06 15:57:45 -0400547 }
548}
549
Alexis Hetub02a8ee2016-02-11 15:52:49 -0500550DepthStencilbuffer::DepthStencilbuffer(int width, int height, GLenum requestedFormat, GLsizei samples) : mDepthStencil(nullptr)
John Bauman66b8ab22014-05-06 15:57:45 -0400551{
Alexis Hetub02a8ee2016-02-11 15:52:49 -0500552 format = requestedFormat;
553 switch(requestedFormat)
554 {
555 case GL_STENCIL_INDEX8:
556 case GL_DEPTH_COMPONENT24:
557 case GL_DEPTH24_STENCIL8_OES:
558 internalFormat = sw::FORMAT_D24S8;
559 break;
560 case GL_DEPTH32F_STENCIL8:
561 internalFormat = sw::FORMAT_D32FS8_TEXTURE;
562 break;
563 case GL_DEPTH_COMPONENT16:
564 internalFormat = sw::FORMAT_D16;
565 break;
566 case GL_DEPTH_COMPONENT32_OES:
567 internalFormat = sw::FORMAT_D32;
568 break;
569 case GL_DEPTH_COMPONENT32F:
570 internalFormat = sw::FORMAT_D32F;
571 break;
572 default:
573 UNREACHABLE(requestedFormat);
574 format = GL_DEPTH24_STENCIL8_OES;
575 internalFormat = sw::FORMAT_D24S8;
576 }
577
John Bauman66b8ab22014-05-06 15:57:45 -0400578 Device *device = getDevice();
579
Nicolas Capens3ff330f2015-09-03 16:41:09 -0400580 int supportedSamples = Context::getSupportedMultisampleCount(samples);
John Bauman66b8ab22014-05-06 15:57:45 -0400581
582 if(width > 0 && height > 0)
583 {
Alexis Hetub02a8ee2016-02-11 15:52:49 -0500584 mDepthStencil = device->createDepthStencilSurface(width, height, internalFormat, supportedSamples, false);
John Bauman66b8ab22014-05-06 15:57:45 -0400585
586 if(!mDepthStencil)
587 {
588 error(GL_OUT_OF_MEMORY);
589 return;
590 }
591 }
592
593 mWidth = width;
594 mHeight = height;
Alexis Hetu7a570402015-07-02 13:46:59 -0400595 mSamples = supportedSamples;
John Bauman66b8ab22014-05-06 15:57:45 -0400596}
597
598DepthStencilbuffer::~DepthStencilbuffer()
599{
600 if(mDepthStencil)
601 {
602 mDepthStencil->release();
603 }
604}
605
Nicolas Capens6e77a642014-06-12 00:13:37 -0400606// Increments refcount on image.
607// caller must release() the returned image
Nicolas Capensead7ac52014-10-27 23:56:02 -0400608egl::Image *DepthStencilbuffer::getRenderTarget()
John Bauman66b8ab22014-05-06 15:57:45 -0400609{
610 if(mDepthStencil)
611 {
612 mDepthStencil->addRef();
613 }
614
615 return mDepthStencil;
616}
617
Nicolas Capens6e77a642014-06-12 00:13:37 -0400618// Increments refcount on image.
619// caller must release() the returned image
Nicolas Capensead7ac52014-10-27 23:56:02 -0400620egl::Image *DepthStencilbuffer::createSharedImage()
Nicolas Capens6e77a642014-06-12 00:13:37 -0400621{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400622 if(mDepthStencil)
623 {
624 mDepthStencil->addRef();
625 mDepthStencil->markShared();
626 }
Nicolas Capens6e77a642014-06-12 00:13:37 -0400627
Nicolas Capens0bac2852016-05-07 06:09:58 -0400628 return mDepthStencil;
Nicolas Capens6e77a642014-06-12 00:13:37 -0400629}
630
631bool DepthStencilbuffer::isShared() const
632{
Nicolas Capens0bac2852016-05-07 06:09:58 -0400633 return mDepthStencil->isShared();
Nicolas Capens6e77a642014-06-12 00:13:37 -0400634}
635
Nicolas Capensead7ac52014-10-27 23:56:02 -0400636Depthbuffer::Depthbuffer(egl::Image *depthStencil) : DepthStencilbuffer(depthStencil)
John Bauman66b8ab22014-05-06 15:57:45 -0400637{
John Bauman66b8ab22014-05-06 15:57:45 -0400638}
639
Alexis Hetub02a8ee2016-02-11 15:52:49 -0500640Depthbuffer::Depthbuffer(int width, int height, GLenum format, GLsizei samples) : DepthStencilbuffer(width, height, format, samples)
John Bauman66b8ab22014-05-06 15:57:45 -0400641{
John Bauman66b8ab22014-05-06 15:57:45 -0400642}
643
644Depthbuffer::~Depthbuffer()
645{
646}
647
Nicolas Capensead7ac52014-10-27 23:56:02 -0400648Stencilbuffer::Stencilbuffer(egl::Image *depthStencil) : DepthStencilbuffer(depthStencil)
John Bauman66b8ab22014-05-06 15:57:45 -0400649{
John Bauman66b8ab22014-05-06 15:57:45 -0400650}
651
Alexis Hetub02a8ee2016-02-11 15:52:49 -0500652Stencilbuffer::Stencilbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, GL_STENCIL_INDEX8, samples)
John Bauman66b8ab22014-05-06 15:57:45 -0400653{
John Bauman66b8ab22014-05-06 15:57:45 -0400654}
655
656Stencilbuffer::~Stencilbuffer()
657{
658}
659
660}