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