• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // 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.
19 
20 #ifndef LIBGL_RENDERBUFFER_H_
21 #define LIBGL_RENDERBUFFER_H_
22 
23 #include "common/Object.hpp"
24 #include "Image.hpp"
25 
26 #define _GDI32_
27 #include <windows.h>
28 #include <GL/GL.h>
29 #include <GL/glext.h>
30 
31 namespace gl
32 {
33 class Texture2D;
34 class TextureCubeMap;
35 class Renderbuffer;
36 class Colorbuffer;
37 class DepthStencilbuffer;
38 
39 class RenderbufferInterface
40 {
41 public:
42 	RenderbufferInterface();
43 
~RenderbufferInterface()44 	virtual ~RenderbufferInterface() {};
45 
46 	virtual void addProxyRef(const Renderbuffer *proxy);
47 	virtual void releaseProxy(const Renderbuffer *proxy);
48 
49 	virtual Image *getRenderTarget() = 0;
50 
51 	virtual GLsizei getWidth() const = 0;
52 	virtual GLsizei getHeight() const = 0;
53 	virtual GLenum getFormat() const = 0;
54 	virtual sw::Format getInternalFormat() const = 0;
55 	virtual GLsizei getSamples() const = 0;
56 
57 	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 
65 class RenderbufferTexture2D : public RenderbufferInterface
66 {
67 public:
68 	RenderbufferTexture2D(Texture2D *texture);
69 
70 	virtual ~RenderbufferTexture2D();
71 
72 	virtual void addProxyRef(const Renderbuffer *proxy);
73 	virtual void releaseProxy(const Renderbuffer *proxy);
74 
75 	Image *getRenderTarget();
76 
77 	virtual GLsizei getWidth() const;
78 	virtual GLsizei getHeight() const;
79 	virtual GLenum getFormat() const;
80 	virtual sw::Format getInternalFormat() const;
81 	virtual GLsizei getSamples() const;
82 
83 private:
84 	BindingPointer<Texture2D> mTexture2D;
85 };
86 
87 class RenderbufferTextureCubeMap : public RenderbufferInterface
88 {
89 public:
90 	RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target);
91 
92 	virtual ~RenderbufferTextureCubeMap();
93 
94 	virtual void addProxyRef(const Renderbuffer *proxy);
95 	virtual void releaseProxy(const Renderbuffer *proxy);
96 
97 	Image *getRenderTarget();
98 
99 	virtual GLsizei getWidth() const;
100 	virtual GLsizei getHeight() const;
101 	virtual GLenum getFormat() const;
102 	virtual sw::Format getInternalFormat() const;
103 	virtual GLsizei getSamples() const;
104 
105 private:
106 	BindingPointer<TextureCubeMap> mTextureCubeMap;
107 	GLenum mTarget;
108 };
109 
110 // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
111 // is called. The specific concrete type depends on whether the internal format is
112 // colour depth, stencil or packed depth/stencil.
113 class RenderbufferStorage : public RenderbufferInterface
114 {
115 public:
116 	RenderbufferStorage();
117 
118 	virtual ~RenderbufferStorage() = 0;
119 
120 	virtual Image *getRenderTarget();
121 
122 	virtual GLsizei getWidth() const;
123 	virtual GLsizei getHeight() const;
124 	virtual GLenum getFormat() const;
125 	virtual sw::Format getInternalFormat() const;
126 	virtual GLsizei getSamples() const;
127 
128 protected:
129 	GLsizei mWidth;
130 	GLsizei mHeight;
131 	GLenum format;
132 	sw::Format internalFormat;
133 	GLsizei mSamples;
134 };
135 
136 // Renderbuffer implements the GL renderbuffer object.
137 // It's only a proxy for a RenderbufferInterface instance; the internal object
138 // can change whenever glRenderbufferStorage is called.
139 class Renderbuffer : public NamedObject
140 {
141 public:
142 	Renderbuffer(GLuint name, RenderbufferInterface *storage);
143 
144 	virtual ~Renderbuffer();
145 
146 	// These functions from Object are overloaded here because
147 	// Textures need to maintain their own count of references to them via
148 	// Renderbuffers/RenderbufferTextures. These functions invoke those
149 	// reference counting functions on the RenderbufferInterface.
150 	virtual void addRef();
151 	virtual void release();
152 
153 	Image *getRenderTarget();
154 
155 	GLsizei getWidth() const;
156 	GLsizei getHeight() const;
157 	GLenum getFormat() const;
158 	sw::Format getInternalFormat() const;
159 	GLuint getRedSize() const;
160 	GLuint getGreenSize() const;
161 	GLuint getBlueSize() const;
162 	GLuint getAlphaSize() const;
163 	GLuint getDepthSize() const;
164 	GLuint getStencilSize() const;
165 	GLsizei getSamples() const;
166 
167 	void setStorage(RenderbufferStorage *newStorage);
168 
169 private:
170 	RenderbufferInterface *mInstance;
171 };
172 
173 class Colorbuffer : public RenderbufferStorage
174 {
175 public:
176 	explicit Colorbuffer(Image *renderTarget);
177 	Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
178 
179 	virtual ~Colorbuffer();
180 
181 	virtual Image *getRenderTarget();
182 
183 private:
184 	Image *mRenderTarget;
185 };
186 
187 class DepthStencilbuffer : public RenderbufferStorage
188 {
189 public:
190 	explicit DepthStencilbuffer(Image *depthStencil);
191 	DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
192 
193 	~DepthStencilbuffer();
194 
195 	virtual Image *getRenderTarget();
196 
197 protected:
198 	Image *mDepthStencil;
199 };
200 
201 class Depthbuffer : public DepthStencilbuffer
202 {
203 public:
204 	explicit Depthbuffer(Image *depthStencil);
205 	Depthbuffer(GLsizei width, GLsizei height, GLsizei samples);
206 
207 	virtual ~Depthbuffer();
208 };
209 
210 class Stencilbuffer : public DepthStencilbuffer
211 {
212 public:
213 	explicit Stencilbuffer(Image *depthStencil);
214 	Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
215 
216 	virtual ~Stencilbuffer();
217 };
218 }
219 
220 #endif   // LIBGL_RENDERBUFFER_H_
221