1//
2// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
3// 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
11#include "libGLESv2/Renderbuffer.h"
12#include "libGLESv2/Texture.h"
13#include "libGLESv2/formatutils.h"
14#include "libGLESv2/FramebufferAttachment.h"
15#include "libGLESv2/renderer/Renderer.h"
16#include "libGLESv2/renderer/RenderTarget.h"
17
18#include "common/utilities.h"
19
20namespace gl
21{
22unsigned int RenderbufferStorage::mCurrentSerial = 1;
23
24Renderbuffer::Renderbuffer(GLuint id, RenderbufferStorage *newStorage)
25  : RefCountObject(id),
26    mStorage(newStorage)
27{
28    ASSERT(mStorage);
29}
30
31Renderbuffer::~Renderbuffer()
32{
33    SafeDelete(mStorage);
34}
35
36void 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{
82    return GetInternalFormatInfo(getActualFormat()).redBits;
83}
84
85GLuint Renderbuffer::getGreenSize() const
86{
87    return GetInternalFormatInfo(getActualFormat()).greenBits;
88}
89
90GLuint Renderbuffer::getBlueSize() const
91{
92    return GetInternalFormatInfo(getActualFormat()).blueBits;
93}
94
95GLuint Renderbuffer::getAlphaSize() const
96{
97    return GetInternalFormatInfo(getActualFormat()).alphaBits;
98}
99
100GLuint Renderbuffer::getDepthSize() const
101{
102    return GetInternalFormatInfo(getActualFormat()).depthBits;
103}
104
105GLuint Renderbuffer::getStencilSize() const
106{
107    return GetInternalFormatInfo(getActualFormat()).stencilBits;
108}
109
110RenderbufferStorage::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
282}
283