blob: c3d751d5d9f4c110043bc17aa0fb650efdd6985b [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Renderbuffer.h: Defines the wrapper class Renderbuffer, as well as the
16// class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer,
17// DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
18// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
19
20#ifndef LIBGLES_CM_RENDERBUFFER_H_
21#define LIBGLES_CM_RENDERBUFFER_H_
22
23#include "common/Object.hpp"
24#include "common/Image.hpp"
25
26#include <GLES/gl.h>
27
28namespace es1
29{
30class Texture2D;
31class Renderbuffer;
32class Colorbuffer;
33class DepthStencilbuffer;
34
35class RenderbufferInterface
36{
37public:
38 RenderbufferInterface();
39
Ben Clayton2a582382019-04-24 12:11:36 +010040 virtual ~RenderbufferInterface() {}
Nicolas Capens0bac2852016-05-07 06:09:58 -040041
42 virtual void addProxyRef(const Renderbuffer *proxy);
43 virtual void releaseProxy(const Renderbuffer *proxy);
44
45 virtual egl::Image *getRenderTarget() = 0;
46 virtual egl::Image *createSharedImage() = 0;
47 virtual bool isShared() const = 0;
48
49 virtual GLsizei getWidth() const = 0;
50 virtual GLsizei getHeight() const = 0;
Nicolas Capens0ccc71d2018-03-23 10:13:06 -040051 virtual GLint getLevel() const { return 0; }
Nicolas Capens3e5f6fd2018-02-26 17:47:06 -050052 virtual GLint getFormat() const = 0;
Nicolas Capens0bac2852016-05-07 06:09:58 -040053 virtual GLsizei getSamples() const = 0;
54
Nicolas Capens0ccc71d2018-03-23 10:13:06 -040055 virtual void setLevel(GLint) {}
56
Nicolas Capens0bac2852016-05-07 06:09:58 -040057 GLuint getRedSize() const;
58 GLuint getGreenSize() const;
59 GLuint getBlueSize() const;
60 GLuint getAlphaSize() const;
61 GLuint getDepthSize() const;
62 GLuint getStencilSize() const;
63};
64
65class RenderbufferTexture2D : public RenderbufferInterface
66{
67public:
Nicolas Capens0ccc71d2018-03-23 10:13:06 -040068 RenderbufferTexture2D(Texture2D *texture, GLint level);
Nicolas Capens0bac2852016-05-07 06:09:58 -040069
Nicolas Capens0ccc71d2018-03-23 10:13:06 -040070 ~RenderbufferTexture2D() override;
Nicolas Capens0bac2852016-05-07 06:09:58 -040071
Nicolas Capens0ccc71d2018-03-23 10:13:06 -040072 void addProxyRef(const Renderbuffer *proxy) override;
73 void releaseProxy(const Renderbuffer *proxy) override;
Nicolas Capens0bac2852016-05-07 06:09:58 -040074
Nicolas Capens0ccc71d2018-03-23 10:13:06 -040075 egl::Image *getRenderTarget() override;
76 egl::Image *createSharedImage() override;
77 bool isShared() const override;
Nicolas Capens0bac2852016-05-07 06:09:58 -040078
Nicolas Capens0ccc71d2018-03-23 10:13:06 -040079 GLsizei getWidth() const override;
80 GLsizei getHeight() const override;
81 GLint getLevel() const override { return mLevel; }
82 GLint getFormat() const override;
83 GLsizei getSamples() const override;
84
85 void setLevel(GLint level) override { mLevel = level; }
Nicolas Capens0bac2852016-05-07 06:09:58 -040086
87private:
88 gl::BindingPointer<Texture2D> mTexture2D;
Nicolas Capens0ccc71d2018-03-23 10:13:06 -040089 GLint mLevel;
Nicolas Capens0bac2852016-05-07 06:09:58 -040090};
91
92// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
93// is called. The specific concrete type depends on whether the internal format is
94// colour depth, stencil or packed depth/stencil.
95class RenderbufferStorage : public RenderbufferInterface
96{
97public:
98 RenderbufferStorage();
99
Nicolas Capens0ccc71d2018-03-23 10:13:06 -0400100 ~RenderbufferStorage() override = 0;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400101
Nicolas Capens0ccc71d2018-03-23 10:13:06 -0400102 egl::Image *getRenderTarget() override = 0;
103 egl::Image *createSharedImage() override = 0;
104 bool isShared() const override = 0;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400105
Nicolas Capens0ccc71d2018-03-23 10:13:06 -0400106 GLsizei getWidth() const override;
107 GLsizei getHeight() const override;
108 GLint getFormat() const override;
109 GLsizei getSamples() const override;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400110
111protected:
112 GLsizei mWidth;
113 GLsizei mHeight;
114 GLenum format;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400115 GLsizei mSamples;
116};
117
118// Renderbuffer implements the GL renderbuffer object.
119// It's only a proxy for a RenderbufferInterface instance; the internal object
120// can change whenever glRenderbufferStorage is called.
121class Renderbuffer : public gl::NamedObject
122{
123public:
124 Renderbuffer(GLuint name, RenderbufferInterface *storage);
125
126 virtual ~Renderbuffer();
127
128 // These functions from Object are overloaded here because
129 // Textures need to maintain their own count of references to them via
130 // Renderbuffers/RenderbufferTextures. These functions invoke those
131 // reference counting functions on the RenderbufferInterface.
132 virtual void addRef();
133 virtual void release();
134
135 egl::Image *getRenderTarget();
136 virtual egl::Image *createSharedImage();
137 virtual bool isShared() const;
138
139 GLsizei getWidth() const;
140 GLsizei getHeight() const;
Nicolas Capens0ccc71d2018-03-23 10:13:06 -0400141 GLint getLevel() const;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400142 GLenum getFormat() const;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400143 GLuint getRedSize() const;
144 GLuint getGreenSize() const;
145 GLuint getBlueSize() const;
146 GLuint getAlphaSize() const;
147 GLuint getDepthSize() const;
148 GLuint getStencilSize() const;
149 GLsizei getSamples() const;
150
Nicolas Capens0ccc71d2018-03-23 10:13:06 -0400151 void setLevel(GLint level);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400152 void setStorage(RenderbufferStorage *newStorage);
153
154private:
155 RenderbufferInterface *mInstance;
156};
157
158class Colorbuffer : public RenderbufferStorage
159{
160public:
161 explicit Colorbuffer(egl::Image *renderTarget);
Nicolas Capens3b4a25c2018-02-22 20:14:07 -0500162 Colorbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400163
Nicolas Capens0ccc71d2018-03-23 10:13:06 -0400164 ~Colorbuffer() override;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400165
Nicolas Capens0ccc71d2018-03-23 10:13:06 -0400166 egl::Image *getRenderTarget() override;
167 egl::Image *createSharedImage() override;
168 bool isShared() const override;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400169
170private:
171 egl::Image *mRenderTarget;
172};
173
174class DepthStencilbuffer : public RenderbufferStorage
175{
176public:
177 explicit DepthStencilbuffer(egl::Image *depthStencil);
Nicolas Capens3b4a25c2018-02-22 20:14:07 -0500178 DepthStencilbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400179
180 ~DepthStencilbuffer();
181
Nicolas Capens0ccc71d2018-03-23 10:13:06 -0400182 egl::Image *getRenderTarget() override;
183 egl::Image *createSharedImage() override;
184 bool isShared() const override;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400185
186protected:
187 egl::Image *mDepthStencil;
188};
189
190class Depthbuffer : public DepthStencilbuffer
191{
192public:
193 explicit Depthbuffer(egl::Image *depthStencil);
Nicolas Capens3b4a25c2018-02-22 20:14:07 -0500194 Depthbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
Nicolas Capens0bac2852016-05-07 06:09:58 -0400195
Nicolas Capens0ccc71d2018-03-23 10:13:06 -0400196 ~Depthbuffer() override;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400197};
198
199class Stencilbuffer : public DepthStencilbuffer
200{
201public:
202 explicit Stencilbuffer(egl::Image *depthStencil);
203 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
204
Nicolas Capens0ccc71d2018-03-23 10:13:06 -0400205 ~Stencilbuffer() override;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400206};
207}
208
209#endif // LIBGLES_CM_RENDERBUFFER_H_