blob: dade014b830d4d4f33a99ae38820d2d80d57ff74 [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"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020
21namespace gl
22{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000023unsigned int RenderbufferStorage::mCurrentSerial = 1;
daniel@transgaming.com092bd482010-05-12 03:39:36 +000024
Geoff Lang8040f572013-07-25 16:49:54 -040025RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerials(1))
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000026{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +000027 mWidth = 0;
28 mHeight = 0;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000029 mInternalFormat = GL_RGBA4;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000030 mActualFormat = GL_RGBA8_OES;
daniel@transgaming.com73a5db62010-10-15 17:58:13 +000031 mSamples = 0;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000032}
33
34RenderbufferStorage::~RenderbufferStorage()
35{
36}
37
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000038rx::RenderTarget *RenderbufferStorage::getRenderTarget()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000039{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000040 return NULL;
41}
42
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000043rx::RenderTarget *RenderbufferStorage::getDepthStencil()
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000044{
45 return NULL;
46}
47
Geoff Lang391c8c52013-09-17 17:05:51 -040048rx::TextureStorage *RenderbufferStorage::getTextureStorage()
49{
50 return NULL;
51}
52
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000053GLsizei RenderbufferStorage::getWidth() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000054{
55 return mWidth;
56}
57
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000058GLsizei RenderbufferStorage::getHeight() const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059{
60 return mHeight;
61}
62
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000063GLenum RenderbufferStorage::getInternalFormat() const
daniel@transgaming.com866f3182010-05-20 19:28:22 +000064{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000065 return mInternalFormat;
daniel@transgaming.com866f3182010-05-20 19:28:22 +000066}
67
daniel@transgaming.com20d36662012-10-31 19:51:43 +000068GLenum RenderbufferStorage::getActualFormat() const
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000069{
daniel@transgaming.com20d36662012-10-31 19:51:43 +000070 return mActualFormat;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000071}
72
daniel@transgaming.com1f135d82010-08-24 19:20:36 +000073GLsizei RenderbufferStorage::getSamples() const
74{
75 return mSamples;
76}
77
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000078unsigned int RenderbufferStorage::getSerial() const
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000079{
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000080 return mSerial;
81}
82
Geoff Lang8040f572013-07-25 16:49:54 -040083unsigned int RenderbufferStorage::issueSerials(GLuint count)
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000084{
85 unsigned int firstSerial = mCurrentSerial;
Geoff Lang8040f572013-07-25 16:49:54 -040086 mCurrentSerial += count;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000087 return firstSerial;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000088}
89
Geoff Lang784371d2014-05-16 12:39:04 -040090bool RenderbufferStorage::isTexture() const
91{
92 return false;
93}
94
95unsigned int RenderbufferStorage::getTextureSerial() const
96{
97 return -1;
98}
99
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000100Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000102 mRenderTarget = renderer->createRenderTarget(swapChain, false);
103
daniel@transgaming.com96c38932012-10-31 18:42:52 +0000104 if (mRenderTarget)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000105 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000106 mWidth = mRenderTarget->getWidth();
107 mHeight = mRenderTarget->getHeight();
108 mInternalFormat = mRenderTarget->getInternalFormat();
109 mActualFormat = mRenderTarget->getActualFormat();
110 mSamples = mRenderTarget->getSamples();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000111 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000112}
113
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000114Colorbuffer::Colorbuffer(rx::Renderer *renderer, int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000115{
Geoff Langa2d97f12013-06-11 11:44:02 -0400116 mRenderTarget = renderer->createRenderTarget(width, height, format, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000117
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000118 if (mRenderTarget)
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000119 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000120 mWidth = width;
121 mHeight = height;
122 mInternalFormat = format;
123 mActualFormat = mRenderTarget->getActualFormat();
124 mSamples = mRenderTarget->getSamples();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000125 }
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000126}
127
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000128Colorbuffer::~Colorbuffer()
129{
130 if (mRenderTarget)
131 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000132 delete mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000133 }
134}
135
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000136rx::RenderTarget *Colorbuffer::getRenderTarget()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137{
Geoff Lang8040f572013-07-25 16:49:54 -0400138 return mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000139}
140
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000141DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142{
daniel@transgaming.comf2423652012-11-28 20:53:50 +0000143 mDepthStencil = renderer->createRenderTarget(swapChain, true);
daniel@transgaming.com024786d2012-10-31 18:42:55 +0000144 if (mDepthStencil)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000145 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000146 mWidth = mDepthStencil->getWidth();
147 mHeight = mDepthStencil->getHeight();
148 mInternalFormat = mDepthStencil->getInternalFormat();
149 mSamples = mDepthStencil->getSamples();
150 mActualFormat = mDepthStencil->getActualFormat();
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000151 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000152}
153
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000154DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000155{
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156
Geoff Langa2d97f12013-06-11 11:44:02 -0400157 mDepthStencil = renderer->createRenderTarget(width, height, GL_DEPTH24_STENCIL8_OES, samples);
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000158
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000159 mWidth = mDepthStencil->getWidth();
160 mHeight = mDepthStencil->getHeight();
apatrick@chromium.org831fe2a2011-03-17 18:44:29 +0000161 mInternalFormat = GL_DEPTH24_STENCIL8_OES;
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000162 mActualFormat = mDepthStencil->getActualFormat();
163 mSamples = mDepthStencil->getSamples();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000164}
165
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000166DepthStencilbuffer::~DepthStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000167{
168 if (mDepthStencil)
169 {
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000170 delete mDepthStencil;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000171 }
172}
173
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000174rx::RenderTarget *DepthStencilbuffer::getDepthStencil()
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000175{
Geoff Lang8040f572013-07-25 16:49:54 -0400176 return mDepthStencil;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000177}
178
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000179Depthbuffer::Depthbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000180{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000181 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000182 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000183 mInternalFormat = GL_DEPTH_COMPONENT16; // If the renderbuffer parameters are queried, the calling function
184 // will expect one of the valid renderbuffer formats for use in
185 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000186 }
187}
188
189Depthbuffer::~Depthbuffer()
190{
191}
192
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000193Stencilbuffer::Stencilbuffer(rx::Renderer *renderer, int width, int height, GLsizei samples) : DepthStencilbuffer(renderer, width, height, samples)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000194{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000195 if (mDepthStencil)
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000196 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000197 mInternalFormat = GL_STENCIL_INDEX8; // If the renderbuffer parameters are queried, the calling function
198 // will expect one of the valid renderbuffer formats for use in
199 // glRenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000200 }
201}
202
203Stencilbuffer::~Stencilbuffer()
204{
205}
206
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000207}