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. [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
40	virtual ~RenderbufferInterface() {};
41
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;
51	virtual GLint getFormat() const = 0;
52	virtual GLsizei getSamples() const = 0;
53
54	GLuint getRedSize() const;
55	GLuint getGreenSize() const;
56	GLuint getBlueSize() const;
57	GLuint getAlphaSize() const;
58	GLuint getDepthSize() const;
59	GLuint getStencilSize() const;
60};
61
62class RenderbufferTexture2D : public RenderbufferInterface
63{
64public:
65	RenderbufferTexture2D(Texture2D *texture);
66
67	virtual ~RenderbufferTexture2D();
68
69	virtual void addProxyRef(const Renderbuffer *proxy);
70    virtual void releaseProxy(const Renderbuffer *proxy);
71
72	virtual egl::Image *getRenderTarget();
73    virtual egl::Image *createSharedImage();
74    virtual bool isShared() const;
75
76	virtual GLsizei getWidth() const;
77	virtual GLsizei getHeight() const;
78	virtual GLint getFormat() const;
79	virtual GLsizei getSamples() const;
80
81private:
82	gl::BindingPointer<Texture2D> mTexture2D;
83};
84
85// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
86// is called. The specific concrete type depends on whether the internal format is
87// colour depth, stencil or packed depth/stencil.
88class RenderbufferStorage : public RenderbufferInterface
89{
90public:
91	RenderbufferStorage();
92
93	virtual ~RenderbufferStorage() = 0;
94
95	virtual egl::Image *getRenderTarget() = 0;
96    virtual egl::Image *createSharedImage() = 0;
97    virtual bool isShared() const = 0;
98
99	virtual GLsizei getWidth() const;
100	virtual GLsizei getHeight() const;
101	virtual GLint getFormat() const;
102	virtual GLsizei getSamples() const;
103
104protected:
105	GLsizei mWidth;
106	GLsizei mHeight;
107	GLenum format;
108	GLsizei mSamples;
109};
110
111// Renderbuffer implements the GL renderbuffer object.
112// It's only a proxy for a RenderbufferInterface instance; the internal object
113// can change whenever glRenderbufferStorage is called.
114class Renderbuffer : public gl::NamedObject
115{
116public:
117	Renderbuffer(GLuint name, RenderbufferInterface *storage);
118
119	virtual ~Renderbuffer();
120
121	// These functions from Object are overloaded here because
122    // Textures need to maintain their own count of references to them via
123    // Renderbuffers/RenderbufferTextures. These functions invoke those
124    // reference counting functions on the RenderbufferInterface.
125    virtual void addRef();
126    virtual void release();
127
128	egl::Image *getRenderTarget();
129    virtual egl::Image *createSharedImage();
130    virtual bool isShared() const;
131
132	GLsizei getWidth() const;
133	GLsizei getHeight() const;
134	GLenum getFormat() const;
135	GLuint getRedSize() const;
136	GLuint getGreenSize() const;
137	GLuint getBlueSize() const;
138	GLuint getAlphaSize() const;
139	GLuint getDepthSize() const;
140	GLuint getStencilSize() const;
141	GLsizei getSamples() const;
142
143	void setStorage(RenderbufferStorage *newStorage);
144
145private:
146	RenderbufferInterface *mInstance;
147};
148
149class Colorbuffer : public RenderbufferStorage
150{
151public:
152	explicit Colorbuffer(egl::Image *renderTarget);
153	Colorbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
154
155	virtual ~Colorbuffer();
156
157	virtual egl::Image *getRenderTarget();
158    virtual egl::Image *createSharedImage();
159    virtual bool isShared() const;
160
161private:
162	egl::Image *mRenderTarget;
163};
164
165class DepthStencilbuffer : public RenderbufferStorage
166{
167public:
168	explicit DepthStencilbuffer(egl::Image *depthStencil);
169	DepthStencilbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
170
171	~DepthStencilbuffer();
172
173	virtual egl::Image *getRenderTarget();
174    virtual egl::Image *createSharedImage();
175    virtual bool isShared() const;
176
177protected:
178	egl::Image *mDepthStencil;
179};
180
181class Depthbuffer : public DepthStencilbuffer
182{
183public:
184	explicit Depthbuffer(egl::Image *depthStencil);
185	Depthbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
186
187	virtual ~Depthbuffer();
188};
189
190class Stencilbuffer : public DepthStencilbuffer
191{
192public:
193	explicit Stencilbuffer(egl::Image *depthStencil);
194	Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
195
196	virtual ~Stencilbuffer();
197};
198}
199
200#endif   // LIBGLES_CM_RENDERBUFFER_H_
201