Renderbuffer.h revision 0273322c0bc5c89b5f006334ab7db6a62c922970
1// SwiftShader Software Renderer 2// 3// Copyright(c) 2005-2013 TransGaming Inc. 4// 5// All rights reserved. No part of this software may be copied, distributed, transmitted, 6// transcribed, stored in a retrieval system, translated into any human or computer 7// language by any means, or disclosed to third parties without the explicit written 8// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express 9// or implied, including but not limited to any patent rights, are granted to you. 10// 11 12// Renderbuffer.h: Defines the wrapper class Renderbuffer, as well as the 13// class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer, 14// DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer 15// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. 16 17#ifndef LIBGLESV2_RENDERBUFFER_H_ 18#define LIBGLESV2_RENDERBUFFER_H_ 19 20#include "common/Object.hpp" 21#include "common/Image.hpp" 22 23#include <GLES2/gl2.h> 24 25namespace es2 26{ 27class Texture2D; 28class Texture3D; 29class TextureCubeMap; 30class Renderbuffer; 31class Colorbuffer; 32class DepthStencilbuffer; 33 34class RenderbufferInterface 35{ 36public: 37 RenderbufferInterface(); 38 39 virtual ~RenderbufferInterface() {}; 40 41 virtual void addProxyRef(const Renderbuffer *proxy); 42 virtual void releaseProxy(const Renderbuffer *proxy); 43 44 virtual egl::Image *getRenderTarget() = 0; 45 virtual egl::Image *createSharedImage() = 0; 46 virtual bool isShared() const = 0; 47 48 virtual GLsizei getWidth() const = 0; 49 virtual GLsizei getHeight() const = 0; 50 virtual GLenum getFormat() const = 0; 51 virtual sw::Format getInternalFormat() 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 GLenum getFormat() const; 79 virtual sw::Format getInternalFormat() const; 80 virtual GLsizei getSamples() const; 81 82private: 83 gl::BindingPointer<Texture2D> mTexture2D; 84}; 85 86class RenderbufferTexture3D : public RenderbufferInterface 87{ 88public: 89 RenderbufferTexture3D(Texture3D *texture); 90 91 virtual ~RenderbufferTexture3D(); 92 93 virtual void addProxyRef(const Renderbuffer *proxy); 94 virtual void releaseProxy(const Renderbuffer *proxy); 95 96 virtual egl::Image *getRenderTarget(); 97 virtual egl::Image *createSharedImage(); 98 virtual bool isShared() const; 99 100 virtual GLsizei getWidth() const; 101 virtual GLsizei getHeight() const; 102 virtual GLenum getFormat() const; 103 virtual sw::Format getInternalFormat() const; 104 virtual GLsizei getSamples() const; 105 106private: 107 gl::BindingPointer<Texture3D> mTexture3D; 108}; 109 110class RenderbufferTextureCubeMap : public RenderbufferInterface 111{ 112public: 113 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target); 114 115 virtual ~RenderbufferTextureCubeMap(); 116 117 virtual void addProxyRef(const Renderbuffer *proxy); 118 virtual void releaseProxy(const Renderbuffer *proxy); 119 120 virtual egl::Image *getRenderTarget(); 121 virtual egl::Image *createSharedImage(); 122 virtual bool isShared() const; 123 124 virtual GLsizei getWidth() const; 125 virtual GLsizei getHeight() const; 126 virtual GLenum getFormat() const; 127 virtual sw::Format getInternalFormat() const; 128 virtual GLsizei getSamples() const; 129 130private: 131 gl::BindingPointer<TextureCubeMap> mTextureCubeMap; 132 GLenum mTarget; 133}; 134 135// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage 136// is called. The specific concrete type depends on whether the internal format is 137// colour depth, stencil or packed depth/stencil. 138class RenderbufferStorage : public RenderbufferInterface 139{ 140public: 141 RenderbufferStorage(); 142 143 virtual ~RenderbufferStorage() = 0; 144 145 virtual egl::Image *getRenderTarget() = 0; 146 virtual egl::Image *createSharedImage() = 0; 147 virtual bool isShared() const = 0; 148 149 virtual GLsizei getWidth() const; 150 virtual GLsizei getHeight() const; 151 virtual GLenum getFormat() const; 152 virtual sw::Format getInternalFormat() const; 153 virtual GLsizei getSamples() const; 154 155protected: 156 GLsizei mWidth; 157 GLsizei mHeight; 158 GLenum format; 159 sw::Format internalFormat; 160 GLsizei mSamples; 161}; 162 163// Renderbuffer implements the GL renderbuffer object. 164// It's only a proxy for a RenderbufferInterface instance; the internal object 165// can change whenever glRenderbufferStorage is called. 166class Renderbuffer : public gl::NamedObject 167{ 168public: 169 Renderbuffer(GLuint name, RenderbufferInterface *storage); 170 171 virtual ~Renderbuffer(); 172 173 // These functions from Object are overloaded here because 174 // Textures need to maintain their own count of references to them via 175 // Renderbuffers/RenderbufferTextures. These functions invoke those 176 // reference counting functions on the RenderbufferInterface. 177 virtual void addRef(); 178 virtual void release(); 179 180 egl::Image *getRenderTarget(); 181 virtual egl::Image *createSharedImage(); 182 virtual bool isShared() const; 183 184 GLsizei getWidth() const; 185 GLsizei getHeight() const; 186 GLenum getFormat() const; 187 sw::Format getInternalFormat() const; 188 GLuint getRedSize() const; 189 GLuint getGreenSize() const; 190 GLuint getBlueSize() const; 191 GLuint getAlphaSize() const; 192 GLuint getDepthSize() const; 193 GLuint getStencilSize() const; 194 GLsizei getSamples() const; 195 196 void setStorage(RenderbufferStorage *newStorage); 197 198private: 199 RenderbufferInterface *mInstance; 200}; 201 202class Colorbuffer : public RenderbufferStorage 203{ 204public: 205 explicit Colorbuffer(egl::Image *renderTarget); 206 Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples); 207 208 virtual ~Colorbuffer(); 209 210 virtual egl::Image *getRenderTarget(); 211 virtual egl::Image *createSharedImage(); 212 virtual bool isShared() const; 213 214private: 215 egl::Image *mRenderTarget; 216}; 217 218class DepthStencilbuffer : public RenderbufferStorage 219{ 220public: 221 explicit DepthStencilbuffer(egl::Image *depthStencil); 222 DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples); 223 224 ~DepthStencilbuffer(); 225 226 virtual egl::Image *getRenderTarget(); 227 virtual egl::Image *createSharedImage(); 228 virtual bool isShared() const; 229 230protected: 231 egl::Image *mDepthStencil; 232}; 233 234class Depthbuffer : public DepthStencilbuffer 235{ 236public: 237 explicit Depthbuffer(egl::Image *depthStencil); 238 Depthbuffer(GLsizei width, GLsizei height, GLsizei samples); 239 240 virtual ~Depthbuffer(); 241}; 242 243class Stencilbuffer : public DepthStencilbuffer 244{ 245public: 246 explicit Stencilbuffer(egl::Image *depthStencil); 247 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples); 248 249 virtual ~Stencilbuffer(); 250}; 251} 252 253#endif // LIBGLESV2_RENDERBUFFER_H_ 254