blob: cae1eb8cb9ed7a4c1dba379b81113fa82449c451 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
daniel@transgaming.combdfb3912012-10-31 19:55:21 +00003// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// Renderbuffer.cpp: the gl::Renderbuffer class and its derived classes
9// Colorbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
10// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
11
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000012#include "libGLESv2/Renderbuffer.h"
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000013#include "libGLESv2/renderer/RenderTarget.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000014
enne@chromium.org0fa74632010-09-21 16:18:52 +000015#include "libGLESv2/Texture.h"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000016#include "libGLESv2/renderer/Renderer.h"
Geoff Lang391c8c52013-09-17 17:05:51 -040017#include "libGLESv2/renderer/TextureStorage.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000018#include "common/utilities.h"
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +000019#include "libGLESv2/formatutils.h"
Jamie Madille261b442014-06-25 12:42:21 -040020#include "libGLESv2/FramebufferAttachment.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021
22namespace gl
23{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000024unsigned int RenderbufferStorage::mCurrentSerial = 1;
daniel@transgaming.com092bd482010-05-12 03:39:36 +000025
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040026Renderbuffer::Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferStorage *newStorage)
27 : RefCountObject(id),
28 mRenderer(renderer),
29 mStorage(newStorage)
30{
31 ASSERT(mStorage);
32}
33
34void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
35{
36 ASSERT(newStorage);
37
38 SafeDelete(mStorage);
39 mStorage = newStorage;
40}
41
42RenderbufferStorage *Renderbuffer::getStorage()
43{
44 ASSERT(mStorage);
45 return mStorage;
46}
47
48GLsizei Renderbuffer::getWidth() const
49{
50 ASSERT(mStorage);
51 return mStorage->getWidth();
52}
53
54GLsizei Renderbuffer::getHeight() const
55{
56 ASSERT(mStorage);
57 return mStorage->getHeight();
58}
59
60GLenum Renderbuffer::getInternalFormat() const
61{
62 ASSERT(mStorage);
63 return mStorage->getInternalFormat();
64}
65
66GLenum Renderbuffer::getActualFormat() const
67{
68 ASSERT(mStorage);
69 return mStorage->getActualFormat();
70}
71
72GLsizei Renderbuffer::getSamples() const
73{
74 ASSERT(mStorage);
75 return mStorage->getSamples();
76}
77
78GLuint Renderbuffer::getRedSize() const
79{
80 return gl::GetRedBits(getActualFormat(), mRenderer->getCurrentClientVersion());
81}
82
83GLuint Renderbuffer::getGreenSize() const
84{
85 return gl::GetGreenBits(getActualFormat(), mRenderer->getCurrentClientVersion());
86}
87
88GLuint Renderbuffer::getBlueSize() const
89{
90 return gl::GetBlueBits(getActualFormat(), mRenderer->getCurrentClientVersion());
91}
92
93GLuint Renderbuffer::getAlphaSize() const
94{
95 return gl::GetAlphaBits(getActualFormat(), mRenderer->getCurrentClientVersion());
96}
97
98GLuint Renderbuffer::getDepthSize() const
99{
100 return gl::GetDepthBits(getActualFormat(), mRenderer->getCurrentClientVersion());
101}
102
103GLuint Renderbuffer::getStencilSize() const
104{
105 return gl::GetStencilBits(getActualFormat(), mRenderer->getCurrentClientVersion());
106}
107
Geoff Lang8040f572013-07-25 16:49:54 -0400108RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1))
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000109{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000110 mWidth = 0;
111 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000112 mInternalFormat = GL_RGBA4;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000113 mActualFormat = GL_RGBA8_OES;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000114 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000115}
116
117RenderbufferStorage::~RenderbufferStorage()
118{
119}
120
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000121rx::RenderTarget *RenderbufferStorage::getRenderTarget()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000122{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000123 return NULL;
124}
125
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000126rx::RenderTarget *RenderbufferStorage::getDepthStencil()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000127{
128 return NULL;
129}
130
Geoff Lang391c8c52013-09-17 17:05:51 -0400131rx::TextureStorage *RenderbufferStorage::getTextureStorage()
132{
133 return NULL;
134}
135
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000136GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137{
138 return mWidth;
139}
140
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000141GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142{
143 return mHeight;
144}
145
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000146GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000147{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000148 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +0000149}
150
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000151GLenum RenderbufferStorage::getActualFormat() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000152{
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000153 return mActualFormat;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000154}
155
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000156GLsizei RenderbufferStorage::getSamples() const
157{
158 return mSamples;
159}
160
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000161unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000162{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000163 return mSerial;
164}
165
Geoff Lang8040f572013-07-25 16:49:54 -0400166unsigned int RenderbufferStorage::issueSerials(GLuint count)
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000167{
168 unsigned int firstSerial = mCurrentSerial;
Geoff Lang8040f572013-07-25 16:49:54 -0400169 mCurrentSerial += count;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000170 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000171}
172
Geoff Lang784371d2014-05-16 12:39:04 -0400173bool RenderbufferStorage::isTexture() const
174{
175 return false;
176}
177
178unsigned int RenderbufferStorage::getTextureSerial() const
179{
180 return -1;
181}
182
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000183Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000184{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000185 mRenderTarget = renderer->createRenderTarget(swapChain, false);
186
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000187 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000188 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000189 mWidth = mRenderTarget->getWidth();
190 mHeight = mRenderTarget->getHeight();
191 mInternalFormat = mRenderTarget->getInternalFormat();
192 mActualFormat = mRenderTarget->getActualFormat();
193 mSamples = mRenderTarget->getSamples();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000194 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000195}
196
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000197Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000198{
Geoff Langa2d97f12013-06-11 11:44:02 -0400199 mRenderTarget = renderer->createRenderTarget(width, height, format, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000200
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000201 if (mRenderTarget)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000202 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000203 mWidth = width;
204 mHeight = height;
205 mInternalFormat = format;
206 mActualFormat = mRenderTarget->getActualFormat();
207 mSamples = mRenderTarget->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000208 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000209}
210
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000211Colorbuffer::~Colorbuffer()
212{
213 if (mRenderTarget)
214 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000215 delete mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000216 }
217}
218
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000219rx::RenderTarget *Colorbuffer::getRenderTarget()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220{
Geoff Lang8040f572013-07-25 16:49:54 -0400221 return mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000222}
223
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000224DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000225{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000226 mDepthStencil = renderer->createRenderTarget(swapChain, true);
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000227 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000228 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000229 mWidth = mDepthStencil->getWidth();
230 mHeight = mDepthStencil->getHeight();
231 mInternalFormat = mDepthStencil->getInternalFormat();
232 mSamples = mDepthStencil->getSamples();
233 mActualFormat = mDepthStencil->getActualFormat();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000234 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000235}
236
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000237DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000238{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000239
Geoff Langa2d97f12013-06-11 11:44:02 -0400240 mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000241
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000242 mWidth = mDepthStencil->getWidth();
243 mHeight = mDepthStencil->getHeight();
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000244 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000245 mActualFormat = mDepthStencil->getActualFormat();
246 mSamples = mDepthStencil->getSamples();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000247}
248
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000249DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000250{
251 if (mDepthStencil)
252 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000253 delete mDepthStencil;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000254 }
255}
256
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000257rx::RenderTarget *DepthStencilbuffer::getDepthStencil()
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000258{
Geoff Lang8040f572013-07-25 16:49:54 -0400259 return mDepthStencil;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000260}
261
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000262Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000263{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000264 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000265 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000266 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
267 // will expect one of the valid renderbuffer formats for use in
268 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000269 }
270}
271
272Depthbuffer::~Depthbuffer()
273{
274}
275
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000276Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000277{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000278 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000279 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000280 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
281 // will expect one of the valid renderbuffer formats for use in
282 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000283 }
284}
285
286Stencilbuffer::~Stencilbuffer()
287{
288}
289
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000290}