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
Shannon Woodsf108df22014-10-30 18:53:29 +00007// 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.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010
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{
Shannon Woodsf108df22014-10-30 18:53:29 +000022unsigned int RenderbufferStorage::mCurrentSerial = 1;
Shannon Woods9fc51d92014-10-17 13:08:51 -040023
Shannon Woodsf108df22014-10-30 18:53:29 +000024Renderbuffer::Renderbuffer(GLuint id, RenderbufferStorage *newStorage)
25 : RefCountObject(id),
26 mStorage(newStorage)
27{
28 ASSERT(mStorage);
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040029}
30
Cooper Partin75c42f42014-08-11 10:16:44 -070031Renderbuffer::~Renderbuffer()
32{
Shannon Woodsf108df22014-10-30 18:53:29 +000033 SafeDelete(mStorage);
Cooper Partin75c42f42014-08-11 10:16:44 -070034}
35
Shannon Woodsf108df22014-10-30 18:53:29 +000036void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040037{
Shannon Woodsf108df22014-10-30 18:53:29 +000038 ASSERT(newStorage);
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040039
Shannon Woodsf108df22014-10-30 18:53:29 +000040 SafeDelete(mStorage);
41 mStorage = newStorage;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040042}
43
Shannon Woodsf108df22014-10-30 18:53:29 +000044RenderbufferStorage *Renderbuffer::getStorage()
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040045{
Shannon Woodsf108df22014-10-30 18:53:29 +000046 ASSERT(mStorage);
47 return mStorage;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040048}
49
50GLsizei Renderbuffer::getWidth() const
51{
Shannon Woodsf108df22014-10-30 18:53:29 +000052 ASSERT(mStorage);
53 return mStorage->getWidth();
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040054}
55
56GLsizei Renderbuffer::getHeight() const
57{
Shannon Woodsf108df22014-10-30 18:53:29 +000058 ASSERT(mStorage);
59 return mStorage->getHeight();
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040060}
61
62GLenum Renderbuffer::getInternalFormat() const
63{
Shannon Woodsf108df22014-10-30 18:53:29 +000064 ASSERT(mStorage);
65 return mStorage->getInternalFormat();
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040066}
67
68GLenum Renderbuffer::getActualFormat() const
69{
Shannon Woodsf108df22014-10-30 18:53:29 +000070 ASSERT(mStorage);
71 return mStorage->getActualFormat();
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040072}
73
74GLsizei Renderbuffer::getSamples() const
75{
Shannon Woodsf108df22014-10-30 18:53:29 +000076 ASSERT(mStorage);
77 return mStorage->getSamples();
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040078}
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
Shannon Woodsf108df22014-10-30 18:53:29 +0000110RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1))
111{
112 mWidth = 0;
113 mHeight = 0;
114 mInternalFormat = GL_RGBA4;
115 mActualFormat = GL_RGBA8_OES;
116 mSamples = 0;
117}
118
119RenderbufferStorage::~RenderbufferStorage()
120{
121}
122
123rx::RenderTarget *RenderbufferStorage::getRenderTarget()
124{
125 return NULL;
126}
127
128GLsizei RenderbufferStorage::getWidth() const
129{
130 return mWidth;
131}
132
133GLsizei RenderbufferStorage::getHeight() const
134{
135 return mHeight;
136}
137
138GLenum RenderbufferStorage::getInternalFormat() const
139{
140 return mInternalFormat;
141}
142
143GLenum RenderbufferStorage::getActualFormat() const
144{
145 return mActualFormat;
146}
147
148GLsizei RenderbufferStorage::getSamples() const
149{
150 return mSamples;
151}
152
153unsigned int RenderbufferStorage::getSerial() const
154{
155 return mSerial;
156}
157
158unsigned int RenderbufferStorage::issueSerials(unsigned int count)
159{
160 unsigned int firstSerial = mCurrentSerial;
161 mCurrentSerial += count;
162 return firstSerial;
163}
164
165bool RenderbufferStorage::isTexture() const
166{
167 return false;
168}
169
170unsigned int RenderbufferStorage::getTextureSerial() const
171{
172 return -1;
173}
174
175Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
176{
177 mRenderTarget = renderer->createRenderTarget(swapChain, false);
178
179 if (mRenderTarget)
180 {
181 mWidth = mRenderTarget->getWidth();
182 mHeight = mRenderTarget->getHeight();
183 mInternalFormat = mRenderTarget->getInternalFormat();
184 mActualFormat = mRenderTarget->getActualFormat();
185 mSamples = mRenderTarget->getSamples();
186 }
187}
188
189Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
190{
191 mRenderTarget = renderer->createRenderTarget(width, height, format, samples);
192
193 if (mRenderTarget)
194 {
195 mWidth = width;
196 mHeight = height;
197 mInternalFormat = format;
198 mActualFormat = mRenderTarget->getActualFormat();
199 mSamples = mRenderTarget->getSamples();
200 }
201}
202
203Colorbuffer::~Colorbuffer()
204{
205 if (mRenderTarget)
206 {
207 delete mRenderTarget;
208 }
209}
210
211rx::RenderTarget *Colorbuffer::getRenderTarget()
212{
213 return mRenderTarget;
214}
215
216DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
217{
218 mDepthStencil = renderer->createRenderTarget(swapChain, true);
219 if (mDepthStencil)
220 {
221 mWidth = mDepthStencil->getWidth();
222 mHeight = mDepthStencil->getHeight();
223 mInternalFormat = mDepthStencil->getInternalFormat();
224 mSamples = mDepthStencil->getSamples();
225 mActualFormat = mDepthStencil->getActualFormat();
226 }
227}
228
229DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
230{
231
232 mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples);
233
234 mWidth = mDepthStencil->getWidth();
235 mHeight = mDepthStencil->getHeight();
236 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
237 mActualFormat = mDepthStencil->getActualFormat();
238 mSamples = mDepthStencil->getSamples();
239}
240
241DepthStencilbuffer::~DepthStencilbuffer()
242{
243 if (mDepthStencil)
244 {
245 delete mDepthStencil;
246 }
247}
248
249rx::RenderTarget *DepthStencilbuffer::getRenderTarget()
250{
251 return mDepthStencil;
252}
253
254Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
255{
256 if (mDepthStencil)
257 {
258 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
261 }
262}
263
264Depthbuffer::~Depthbuffer()
265{
266}
267
268Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
269{
270 if (mDepthStencil)
271 {
272 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
275 }
276}
277
278Stencilbuffer::~Stencilbuffer()
279{
280}
281
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000282}