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
31namespace gl
32{
33class Texture2D;
34class TextureCubeMap;
35class Renderbuffer;
36class Colorbuffer;
37class DepthStencilbuffer;
38
39class RenderbufferInterface
40{
41public:
42	RenderbufferInterface();
43
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
65class RenderbufferTexture2D : public RenderbufferInterface
66{
67public:
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
83private:
84	BindingPointer<Texture2D> mTexture2D;
85};
86
87class RenderbufferTextureCubeMap : public RenderbufferInterface
88{
89public:
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
105private:
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.
113class RenderbufferStorage : public RenderbufferInterface
114{
115public:
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
128protected:
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.
139class Renderbuffer : public NamedObject
140{
141public:
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
169private:
170	RenderbufferInterface *mInstance;
171};
172
173class Colorbuffer : public RenderbufferStorage
174{
175public:
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
183private:
184	Image *mRenderTarget;
185};
186
187class DepthStencilbuffer : public RenderbufferStorage
188{
189public:
190	explicit DepthStencilbuffer(Image *depthStencil);
191	DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
192
193	~DepthStencilbuffer();
194
195	virtual Image *getRenderTarget();
196
197protected:
198	Image *mDepthStencil;
199};
200
201class Depthbuffer : public DepthStencilbuffer
202{
203public:
204	explicit Depthbuffer(Image *depthStencil);
205	Depthbuffer(GLsizei width, GLsizei height, GLsizei samples);
206
207	virtual ~Depthbuffer();
208};
209
210class Stencilbuffer : public DepthStencilbuffer
211{
212public:
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