|
1 // |
|
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 |
|
7 // 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 |
|
10 // 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 |
|
15 #define GL_APICALL |
|
16 #include <GLES2/gl2.h> |
|
17 |
|
18 #include "common/angleutils.h" |
|
19 #include "common/RefCountObject.h" |
|
20 |
|
21 namespace rx |
|
22 { |
|
23 class Renderer; |
|
24 class SwapChain; |
|
25 class RenderTarget; |
|
26 } |
|
27 |
|
28 namespace gl |
|
29 { |
|
30 class Texture2D; |
|
31 class TextureCubeMap; |
|
32 class Renderbuffer; |
|
33 class Colorbuffer; |
|
34 class DepthStencilbuffer; |
|
35 |
|
36 class RenderbufferInterface |
|
37 { |
|
38 public: |
|
39 RenderbufferInterface(); |
|
40 |
|
41 virtual ~RenderbufferInterface() {}; |
|
42 |
|
43 virtual void addProxyRef(const Renderbuffer *proxy); |
|
44 virtual void releaseProxy(const Renderbuffer *proxy); |
|
45 |
|
46 virtual rx::RenderTarget *getRenderTarget() = 0; |
|
47 virtual rx::RenderTarget *getDepthStencil() = 0; |
|
48 |
|
49 virtual GLsizei getWidth() const = 0; |
|
50 virtual GLsizei getHeight() const = 0; |
|
51 virtual GLenum getInternalFormat() const = 0; |
|
52 virtual GLenum getActualFormat() const = 0; |
|
53 virtual GLsizei getSamples() const = 0; |
|
54 |
|
55 GLuint getRedSize() const; |
|
56 GLuint getGreenSize() const; |
|
57 GLuint getBlueSize() const; |
|
58 GLuint getAlphaSize() const; |
|
59 GLuint getDepthSize() const; |
|
60 GLuint getStencilSize() const; |
|
61 |
|
62 virtual unsigned int getSerial() const = 0; |
|
63 |
|
64 private: |
|
65 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface); |
|
66 }; |
|
67 |
|
68 class RenderbufferTexture2D : public RenderbufferInterface |
|
69 { |
|
70 public: |
|
71 RenderbufferTexture2D(Texture2D *texture, GLenum target); |
|
72 |
|
73 virtual ~RenderbufferTexture2D(); |
|
74 |
|
75 void addProxyRef(const Renderbuffer *proxy); |
|
76 void releaseProxy(const Renderbuffer *proxy); |
|
77 |
|
78 rx::RenderTarget *getRenderTarget(); |
|
79 rx::RenderTarget *getDepthStencil(); |
|
80 |
|
81 virtual GLsizei getWidth() const; |
|
82 virtual GLsizei getHeight() const; |
|
83 virtual GLenum getInternalFormat() const; |
|
84 virtual GLenum getActualFormat() const; |
|
85 virtual GLsizei getSamples() const; |
|
86 |
|
87 virtual unsigned int getSerial() const; |
|
88 |
|
89 private: |
|
90 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D); |
|
91 |
|
92 BindingPointer <Texture2D> mTexture2D; |
|
93 GLenum mTarget; |
|
94 }; |
|
95 |
|
96 class RenderbufferTextureCubeMap : public RenderbufferInterface |
|
97 { |
|
98 public: |
|
99 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target); |
|
100 |
|
101 virtual ~RenderbufferTextureCubeMap(); |
|
102 |
|
103 void addProxyRef(const Renderbuffer *proxy); |
|
104 void releaseProxy(const Renderbuffer *proxy); |
|
105 |
|
106 rx::RenderTarget *getRenderTarget(); |
|
107 rx::RenderTarget *getDepthStencil(); |
|
108 |
|
109 virtual GLsizei getWidth() const; |
|
110 virtual GLsizei getHeight() const; |
|
111 virtual GLenum getInternalFormat() const; |
|
112 virtual GLenum getActualFormat() const; |
|
113 virtual GLsizei getSamples() const; |
|
114 |
|
115 virtual unsigned int getSerial() const; |
|
116 |
|
117 private: |
|
118 DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap); |
|
119 |
|
120 BindingPointer <TextureCubeMap> mTextureCubeMap; |
|
121 GLenum mTarget; |
|
122 }; |
|
123 |
|
124 // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage |
|
125 // is called. The specific concrete type depends on whether the internal format is |
|
126 // colour depth, stencil or packed depth/stencil. |
|
127 class RenderbufferStorage : public RenderbufferInterface |
|
128 { |
|
129 public: |
|
130 RenderbufferStorage(); |
|
131 |
|
132 virtual ~RenderbufferStorage() = 0; |
|
133 |
|
134 virtual rx::RenderTarget *getRenderTarget(); |
|
135 virtual rx::RenderTarget *getDepthStencil(); |
|
136 |
|
137 virtual GLsizei getWidth() const; |
|
138 virtual GLsizei getHeight() const; |
|
139 virtual GLenum getInternalFormat() const; |
|
140 virtual GLenum getActualFormat() const; |
|
141 virtual GLsizei getSamples() const; |
|
142 |
|
143 virtual unsigned int getSerial() const; |
|
144 |
|
145 static unsigned int issueSerial(); |
|
146 static unsigned int issueCubeSerials(); |
|
147 |
|
148 protected: |
|
149 GLsizei mWidth; |
|
150 GLsizei mHeight; |
|
151 GLenum mInternalFormat; |
|
152 GLenum mActualFormat; |
|
153 GLsizei mSamples; |
|
154 |
|
155 private: |
|
156 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage); |
|
157 |
|
158 const unsigned int mSerial; |
|
159 |
|
160 static unsigned int mCurrentSerial; |
|
161 }; |
|
162 |
|
163 // Renderbuffer implements the GL renderbuffer object. |
|
164 // It's only a proxy for a RenderbufferInterface instance; the internal object |
|
165 // can change whenever glRenderbufferStorage is called. |
|
166 class Renderbuffer : public RefCountObject |
|
167 { |
|
168 public: |
|
169 Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage); |
|
170 |
|
171 virtual ~Renderbuffer(); |
|
172 |
|
173 // These functions from RefCountObject are overloaded here because |
|
174 // Textures need to maintain their own count of references to them via |
|
175 // Renderbuffers/RenderbufferTextures. These functions invoke those |
|
176 // reference counting functions on the RenderbufferInterface. |
|
177 void addRef() const; |
|
178 void release() const; |
|
179 |
|
180 rx::RenderTarget *getRenderTarget(); |
|
181 rx::RenderTarget *getDepthStencil(); |
|
182 |
|
183 GLsizei getWidth() const; |
|
184 GLsizei getHeight() const; |
|
185 GLenum getInternalFormat() const; |
|
186 GLenum getActualFormat() const; |
|
187 GLuint getRedSize() const; |
|
188 GLuint getGreenSize() const; |
|
189 GLuint getBlueSize() const; |
|
190 GLuint getAlphaSize() const; |
|
191 GLuint getDepthSize() const; |
|
192 GLuint getStencilSize() const; |
|
193 GLsizei getSamples() const; |
|
194 |
|
195 unsigned int getSerial() const; |
|
196 |
|
197 void setStorage(RenderbufferStorage *newStorage); |
|
198 |
|
199 private: |
|
200 DISALLOW_COPY_AND_ASSIGN(Renderbuffer); |
|
201 |
|
202 RenderbufferInterface *mInstance; |
|
203 }; |
|
204 |
|
205 class Colorbuffer : public RenderbufferStorage |
|
206 { |
|
207 public: |
|
208 Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain); |
|
209 Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples); |
|
210 |
|
211 virtual ~Colorbuffer(); |
|
212 |
|
213 virtual rx::RenderTarget *getRenderTarget(); |
|
214 |
|
215 private: |
|
216 DISALLOW_COPY_AND_ASSIGN(Colorbuffer); |
|
217 |
|
218 rx::RenderTarget *mRenderTarget; |
|
219 }; |
|
220 |
|
221 class DepthStencilbuffer : public RenderbufferStorage |
|
222 { |
|
223 public: |
|
224 DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain); |
|
225 DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); |
|
226 |
|
227 ~DepthStencilbuffer(); |
|
228 |
|
229 virtual rx::RenderTarget *getDepthStencil(); |
|
230 |
|
231 protected: |
|
232 rx::RenderTarget *mDepthStencil; |
|
233 |
|
234 private: |
|
235 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer); |
|
236 }; |
|
237 |
|
238 class Depthbuffer : public DepthStencilbuffer |
|
239 { |
|
240 public: |
|
241 Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); |
|
242 |
|
243 virtual ~Depthbuffer(); |
|
244 |
|
245 private: |
|
246 DISALLOW_COPY_AND_ASSIGN(Depthbuffer); |
|
247 }; |
|
248 |
|
249 class Stencilbuffer : public DepthStencilbuffer |
|
250 { |
|
251 public: |
|
252 Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); |
|
253 |
|
254 virtual ~Stencilbuffer(); |
|
255 |
|
256 private: |
|
257 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer); |
|
258 }; |
|
259 } |
|
260 |
|
261 #endif // LIBGLESV2_RENDERBUFFER_H_ |