blob: 9406fce58df1428d354ab2971614621274809612 [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"
enne@chromium.org0fa74632010-09-21 16:18:52 +000012#include "libGLESv2/Texture.h"
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +000013#include "libGLESv2/formatutils.h"
Jamie Madille261b442014-06-25 12:42:21 -040014#include "libGLESv2/FramebufferAttachment.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040015#include "libGLESv2/renderer/Renderer.h"
16#include "libGLESv2/renderer/RenderTarget.h"
17
18#include "common/utilities.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019
20namespace gl
21{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000022unsigned int RenderbufferStorage::mCurrentSerial = 1;
daniel@transgaming.com092bd482010-05-12 03:39:36 +000023
Geoff Lange4a492b2014-06-19 14:14:41 -040024Renderbuffer::Renderbuffer(GLuint id, RenderbufferStorage *newStorage)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040025 : RefCountObject(id),
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040026 mStorage(newStorage)
27{
28 ASSERT(mStorage);
29}
30
Cooper Partin75c42f42014-08-11 10:16:44 -070031Renderbuffer::~Renderbuffer()
32{
33 SafeDelete(mStorage);
34}
35
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040036void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
37{
38 ASSERT(newStorage);
39
40 SafeDelete(mStorage);
41 mStorage = newStorage;
42}
43
44RenderbufferStorage *Renderbuffer::getStorage()
45{
46 ASSERT(mStorage);
47 return mStorage;
48}
49
50GLsizei Renderbuffer::getWidth() const
51{
52 ASSERT(mStorage);
53 return mStorage->getWidth();
54}
55
56GLsizei Renderbuffer::getHeight() const
57{
58 ASSERT(mStorage);
59 return mStorage->getHeight();
60}
61
62GLenum Renderbuffer::getInternalFormat() const
63{
64 ASSERT(mStorage);
65 return mStorage->getInternalFormat();
66}
67
68GLenum Renderbuffer::getActualFormat() const
69{
70 ASSERT(mStorage);
71 return mStorage->getActualFormat();
72}
73
74GLsizei Renderbuffer::getSamples() const
75{
76 ASSERT(mStorage);
77 return mStorage->getSamples();
78}
79
80GLuint Renderbuffer::getRedSize() const
81{
Geoff Lang5d601382014-07-22 15:14:06 -040082 return GetInternalFormatInfo(getActualFormat()).redBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040083}
84
85GLuint Renderbuffer::getGreenSize() const
86{
Geoff Lang5d601382014-07-22 15:14:06 -040087 return GetInternalFormatInfo(getActualFormat()).greenBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040088}
89
90GLuint Renderbuffer::getBlueSize() const
91{
Geoff Lang5d601382014-07-22 15:14:06 -040092 return GetInternalFormatInfo(getActualFormat()).blueBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040093}
94
95GLuint Renderbuffer::getAlphaSize() const
96{
Geoff Lang5d601382014-07-22 15:14:06 -040097 return GetInternalFormatInfo(getActualFormat()).alphaBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040098}
99
100GLuint Renderbuffer::getDepthSize() const
101{
Geoff Lang5d601382014-07-22 15:14:06 -0400102 return GetInternalFormatInfo(getActualFormat()).depthBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400103}
104
105GLuint Renderbuffer::getStencilSize() const
106{
Geoff Lang5d601382014-07-22 15:14:06 -0400107 return GetInternalFormatInfo(getActualFormat()).stencilBits;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400108}
109
Geoff Lang8040f572013-07-25 16:49:54 -0400110RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1))
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000111{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000112 mWidth = 0;
113 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000114 mInternalFormat = GL_RGBA4;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000115 mActualFormat = GL_RGBA8_OES;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000116 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000117}
118
119RenderbufferStorage::~RenderbufferStorage()
120{
121}
122
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000123rx::RenderTarget *RenderbufferStorage::getRenderTarget()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000124{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000125 return NULL;
126}
127
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000128GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000129{
130 return mWidth;
131}
132
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000133GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000134{
135 return mHeight;
136}
137
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000138GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000139{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000140 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000141}
142
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000143GLenum RenderbufferStorage::getActualFormat() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000144{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000145 return mActualFormat;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000146}
147
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000148GLsizei RenderbufferStorage::getSamples() const
149{
150 return mSamples;
151}
152
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000153unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000154{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000155 return mSerial;
156}
157
Jamie Madillc4833262014-09-18 16:18:26 -0400158unsigned int RenderbufferStorage::issueSerials(unsigned int count)
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000159{
160 unsigned int firstSerial = mCurrentSerial;
Geoff Lang8040f572013-07-25 16:49:54 -0400161 mCurrentSerial += count;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000162 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000163}
164
Geoff Lang784371d2014-05-16 12:39:04 -0400165bool RenderbufferStorage::isTexture() const
166{
167 return false;
168}
169
170unsigned int RenderbufferStorage::getTextureSerial() const
171{
172 return -1;
173}
174
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000175Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000176{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000177 mRenderTarget = renderer->createRenderTarget(swapChain, false);
178
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000179 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000180 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000181 mWidth = mRenderTarget->getWidth();
182 mHeight = mRenderTarget->getHeight();
183 mInternalFormat = mRenderTarget->getInternalFormat();
184 mActualFormat = mRenderTarget->getActualFormat();
185 mSamples = mRenderTarget->getSamples();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000186 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000187}
188
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000189Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000190{
Geoff Langa2d97f12013-06-11 11:44:02 -0400191 mRenderTarget = renderer->createRenderTarget(width, height, format, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000192
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000193 if (mRenderTarget)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000194 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000195 mWidth = width;
196 mHeight = height;
197 mInternalFormat = format;
198 mActualFormat = mRenderTarget->getActualFormat();
199 mSamples = mRenderTarget->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000200 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000201}
202
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000203Colorbuffer::~Colorbuffer()
204{
205 if (mRenderTarget)
206 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000207 delete mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208 }
209}
210
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000211rx::RenderTarget *Colorbuffer::getRenderTarget()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000212{
Geoff Lang8040f572013-07-25 16:49:54 -0400213 return mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000214}
215
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000216DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000217{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000218 mDepthStencil = renderer->createRenderTarget(swapChain, true);
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000219 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000221 mWidth = mDepthStencil->getWidth();
222 mHeight = mDepthStencil->getHeight();
223 mInternalFormat = mDepthStencil->getInternalFormat();
224 mSamples = mDepthStencil->getSamples();
225 mActualFormat = mDepthStencil->getActualFormat();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000226 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000227}
228
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000229DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000230{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000231
Geoff Langa2d97f12013-06-11 11:44:02 -0400232 mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000233
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000234 mWidth = mDepthStencil->getWidth();
235 mHeight = mDepthStencil->getHeight();
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000236 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000237 mActualFormat = mDepthStencil->getActualFormat();
238 mSamples = mDepthStencil->getSamples();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000239}
240
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000241DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000242{
243 if (mDepthStencil)
244 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000245 delete mDepthStencil;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000246 }
247}
248
Jamie Madill685dd272014-08-29 15:46:43 -0400249rx::RenderTarget *DepthStencilbuffer::getRenderTarget()
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000250{
Geoff Lang8040f572013-07-25 16:49:54 -0400251 return mDepthStencil;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000252}
253
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000254Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000255{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000256 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000257 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000258 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
259 // will expect one of the valid renderbuffer formats for use in
260 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000261 }
262}
263
264Depthbuffer::~Depthbuffer()
265{
266}
267
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000268Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000269{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000270 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000271 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000272 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
273 // will expect one of the valid renderbuffer formats for use in
274 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000275 }
276}
277
278Stencilbuffer::~Stencilbuffer()
279{
280}
281
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282}