Renderbuffer.h revision 0273322c0bc5c89b5f006334ab7db6a62c922970
153ca1f3190680f3e86aebe0f72f7918d63f71e0dCharles Davis// SwiftShader Software Renderer
21f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer//
34a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson// Copyright(c) 2005-2013 TransGaming Inc.
44a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson//
54a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson// All rights reserved. No part of this software may be copied, distributed, transmitted,
64a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson// transcribed, stored in a retrieval system, translated into any human or computer
71f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer// language by any means, or disclosed to third parties without the explicit written
84a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
94a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson// or implied, including but not limited to any patent rights, are granted to you.
104a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson//
114a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson
124a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson// Renderbuffer.h: Defines the wrapper class Renderbuffer, as well as the
134a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson// class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer,
144a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson// DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
154a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson// objects and related functionality.
164a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson
174a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson#ifndef LIBGL_RENDERBUFFER_H_
184a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson#define LIBGL_RENDERBUFFER_H_
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
201f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "common/Object.hpp"
214a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson#include "Image.hpp"
224a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson
234a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson#define _GDI32_
244a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson#include <windows.h>
253e61374295693beb0a899af44ccf4b5085dffbf3Argyrios Kyrtzidis#include <GL/GL.h>
2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include <GL/glext.h>
27793537d21f8aa46458a5733d96816ba8bddeef50Argyrios Kyrtzidis
284a28522c1a0828eff097194f31c262ae6d13cefeOwen Andersonnamespace gl
294a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson{
304a28522c1a0828eff097194f31c262ae6d13cefeOwen Andersonclass Texture2D;
314a28522c1a0828eff097194f31c262ae6d13cefeOwen Andersonclass TextureCubeMap;
324a28522c1a0828eff097194f31c262ae6d13cefeOwen Andersonclass Renderbuffer;
33793537d21f8aa46458a5733d96816ba8bddeef50Argyrios Kyrtzidisclass Colorbuffer;
344a28522c1a0828eff097194f31c262ae6d13cefeOwen Andersonclass DepthStencilbuffer;
354a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson
364a28522c1a0828eff097194f31c262ae6d13cefeOwen Andersonclass RenderbufferInterface
37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines{
38793537d21f8aa46458a5733d96816ba8bddeef50Argyrios Kyrtzidispublic:
394a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson	RenderbufferInterface();
404a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson
414a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson	virtual ~RenderbufferInterface() {};
42438d3946afc9ba502d56269d1a1d2c18d38d7e23Owen Anderson
43793537d21f8aa46458a5733d96816ba8bddeef50Argyrios Kyrtzidis	virtual void addProxyRef(const Renderbuffer *proxy);
4405897c8f2624a20a5fefcd57273583c5a618b12aDuncan Sands    virtual void releaseProxy(const Renderbuffer *proxy);
452b1a6e7581f9febbe807a65f70a560d69a19cbedOscar Fuentes
4605897c8f2624a20a5fefcd57273583c5a618b12aDuncan Sands	virtual Image *getRenderTarget() = 0;
474a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson
484a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson	virtual GLsizei getWidth() const = 0;
49826c148aa5af36cca688b7da447bc0b22905d904Owen Anderson	virtual GLsizei getHeight() const = 0;
50826c148aa5af36cca688b7da447bc0b22905d904Owen Anderson	virtual GLenum getFormat() const = 0;
51826c148aa5af36cca688b7da447bc0b22905d904Owen Anderson	virtual sw::Format getInternalFormat() const = 0;
52826c148aa5af36cca688b7da447bc0b22905d904Owen Anderson	virtual GLsizei getSamples() const = 0;
534a28522c1a0828eff097194f31c262ae6d13cefeOwen Anderson
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	Image *getRenderTarget();
73
74	virtual GLsizei getWidth() const;
75	virtual GLsizei getHeight() const;
76	virtual GLenum getFormat() const;
77	virtual sw::Format getInternalFormat() const;
78	virtual GLsizei getSamples() const;
79
80private:
81	BindingPointer<Texture2D> mTexture2D;
82};
83
84class RenderbufferTextureCubeMap : public RenderbufferInterface
85{
86public:
87	RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target);
88
89	virtual ~RenderbufferTextureCubeMap();
90
91	virtual void addProxyRef(const Renderbuffer *proxy);
92    virtual void releaseProxy(const Renderbuffer *proxy);
93
94	Image *getRenderTarget();
95
96	virtual GLsizei getWidth() const;
97	virtual GLsizei getHeight() const;
98	virtual GLenum getFormat() const;
99	virtual sw::Format getInternalFormat() const;
100	virtual GLsizei getSamples() const;
101
102private:
103	BindingPointer<TextureCubeMap> mTextureCubeMap;
104	GLenum mTarget;
105};
106
107// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
108// is called. The specific concrete type depends on whether the internal format is
109// colour depth, stencil or packed depth/stencil.
110class RenderbufferStorage : public RenderbufferInterface
111{
112public:
113	RenderbufferStorage();
114
115	virtual ~RenderbufferStorage() = 0;
116
117	virtual Image *getRenderTarget();
118
119	virtual GLsizei getWidth() const;
120	virtual GLsizei getHeight() const;
121	virtual GLenum getFormat() const;
122	virtual sw::Format getInternalFormat() const;
123	virtual GLsizei getSamples() const;
124
125protected:
126	GLsizei mWidth;
127	GLsizei mHeight;
128	GLenum format;
129	sw::Format internalFormat;
130	GLsizei mSamples;
131};
132
133// Renderbuffer implements the GL renderbuffer object.
134// It's only a proxy for a RenderbufferInterface instance; the internal object
135// can change whenever glRenderbufferStorage is called.
136class Renderbuffer : public NamedObject
137{
138public:
139	Renderbuffer(GLuint name, RenderbufferInterface *storage);
140
141	virtual ~Renderbuffer();
142
143	// These functions from Object are overloaded here because
144    // Textures need to maintain their own count of references to them via
145    // Renderbuffers/RenderbufferTextures. These functions invoke those
146    // reference counting functions on the RenderbufferInterface.
147    virtual void addRef();
148    virtual void release();
149
150	Image *getRenderTarget();
151
152	GLsizei getWidth() const;
153	GLsizei getHeight() const;
154	GLenum getFormat() const;
155	sw::Format getInternalFormat() const;
156	GLuint getRedSize() const;
157	GLuint getGreenSize() const;
158	GLuint getBlueSize() const;
159	GLuint getAlphaSize() const;
160	GLuint getDepthSize() const;
161	GLuint getStencilSize() const;
162	GLsizei getSamples() const;
163
164	void setStorage(RenderbufferStorage *newStorage);
165
166private:
167	RenderbufferInterface *mInstance;
168};
169
170class Colorbuffer : public RenderbufferStorage
171{
172public:
173	explicit Colorbuffer(Image *renderTarget);
174	Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
175
176	virtual ~Colorbuffer();
177
178	virtual Image *getRenderTarget();
179
180private:
181	Image *mRenderTarget;
182};
183
184class DepthStencilbuffer : public RenderbufferStorage
185{
186public:
187	explicit DepthStencilbuffer(Image *depthStencil);
188	DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
189
190	~DepthStencilbuffer();
191
192	virtual Image *getRenderTarget();
193
194protected:
195	Image *mDepthStencil;
196};
197
198class Depthbuffer : public DepthStencilbuffer
199{
200public:
201	explicit Depthbuffer(Image *depthStencil);
202	Depthbuffer(GLsizei width, GLsizei height, GLsizei samples);
203
204	virtual ~Depthbuffer();
205};
206
207class Stencilbuffer : public DepthStencilbuffer
208{
209public:
210	explicit Stencilbuffer(Image *depthStencil);
211	Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
212
213	virtual ~Stencilbuffer();
214};
215}
216
217#endif   // LIBGL_RENDERBUFFER_H_
218