blob: 51c1eebef708dd2ef1c36c27a8f78287b017bd7b [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 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
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00007// Renderbuffer.h: Defines the wrapper class gl::Renderbuffer, as well as the
8// class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer,
9// DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
11
12#ifndef LIBGLESV2_RENDERBUFFER_H_
13#define LIBGLESV2_RENDERBUFFER_H_
14
shannon.woods%transgaming.com@gtempaccount.comf26ddae2013-04-13 03:29:13 +000015#include <GLES3/gl3.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016#include <GLES2/gl2.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000018#include "common/angleutils.h"
apatrick@chromium.orgb66a7012012-01-23 20:04:48 +000019#include "common/RefCountObject.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020
daniel@transgaming.com70062c92012-11-28 19:32:30 +000021namespace rx
22{
23class Renderer;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000024class SwapChain;
25class RenderTarget;
Geoff Lang391c8c52013-09-17 17:05:51 -040026class TextureStorage;
daniel@transgaming.com70062c92012-11-28 19:32:30 +000027}
28
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000029namespace gl
30{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040031class RenderbufferStorage;
Jamie Madille261b442014-06-25 12:42:21 -040032class FramebufferAttachment;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040033
34// A GL renderbuffer object is usually used as a depth or stencil buffer attachment
35// for a framebuffer object. The renderbuffer itself is a distinct GL object, see
36// FramebufferAttachment and Framebuffer for how they are applied to an FBO via an
37// attachment point.
38
39class Renderbuffer : public RefCountObject
40{
41 public:
42 Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferStorage *newStorage);
43
44 void setStorage(RenderbufferStorage *newStorage);
45 RenderbufferStorage *getStorage();
46
47 GLsizei getWidth() const;
48 GLsizei getHeight() const;
49 GLenum getInternalFormat() const;
50 GLenum getActualFormat() const;
51 GLsizei getSamples() const;
52 GLuint getRedSize() const;
53 GLuint getGreenSize() const;
54 GLuint getBlueSize() const;
55 GLuint getAlphaSize() const;
56 GLuint getDepthSize() const;
57 GLuint getStencilSize() const;
58
59 private:
60 rx::Renderer *mRenderer;
61 RenderbufferStorage *mStorage;
62};
Geoff Langd5d8e392013-07-25 16:53:03 -040063
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000064// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
65// is called. The specific concrete type depends on whether the internal format is
66// colour depth, stencil or packed depth/stencil.
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040067class RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068{
69 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000070 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000071
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000072 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000073
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000074 virtual rx::RenderTarget *getRenderTarget();
75 virtual rx::RenderTarget *getDepthStencil();
Geoff Lang391c8c52013-09-17 17:05:51 -040076 virtual rx::TextureStorage *getTextureStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000077
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000078 virtual GLsizei getWidth() const;
79 virtual GLsizei getHeight() const;
80 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000081 virtual GLenum getActualFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000082 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +000083
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000084 virtual unsigned int getSerial() const;
Geoff Lang784371d2014-05-16 12:39:04 -040085
86 virtual bool isTexture() const;
87 virtual unsigned int getTextureSerial() const;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000088
Geoff Lang8040f572013-07-25 16:49:54 -040089 static unsigned int issueSerials(GLuint count);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000090
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000091 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000092 GLsizei mWidth;
93 GLsizei mHeight;
94 GLenum mInternalFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000095 GLenum mActualFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +000096 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000097
98 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000099 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000100
101 const unsigned int mSerial;
102
103 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000104};
105
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000106class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107{
108 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000109 Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
110 Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000111
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000112 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000113
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000114 virtual rx::RenderTarget *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000115
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000116 private:
117 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000118
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000119 rx::RenderTarget *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000120};
121
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000122class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000123{
124 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000125 DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
126 DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000127
128 ~DepthStencilbuffer();
129
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000130 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000131
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000132 protected:
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000133 rx::RenderTarget *mDepthStencil;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000134
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000135 private:
136 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000137};
138
139class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140{
141 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000142 Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000143
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000144 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000145
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000146 private:
147 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148};
149
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000150class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151{
152 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000153 Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000154
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000155 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000157 private:
158 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000159};
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400160
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000161}
162
163#endif // LIBGLESV2_RENDERBUFFER_H_