Renderbuffer.h revision 074c64176645063a8c0113e2acc2d3fac3469d5c
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 GLint getLayer() const { return 0; } 51 virtual GLenum getFormat() const = 0; 52 virtual sw::Format getInternalFormat() const = 0; 53 virtual GLsizei getSamples() const = 0; 54 55 GLuint getRedSize() const; 56 GLuint getGreenSize() const; 57 GLuint getBlueSize() const; 58 GLuint getAlphaSize() const; 59 GLuint getDepthSize() const; 60 GLuint getStencilSize() const; 61}; 62 63class RenderbufferTexture2D : public RenderbufferInterface 64{ 65public: 66 RenderbufferTexture2D(Texture2D *texture, GLint level); 67 68 virtual ~RenderbufferTexture2D(); 69 70 virtual void addProxyRef(const Renderbuffer *proxy); 71 virtual void releaseProxy(const Renderbuffer *proxy); 72 73 virtual egl::Image *getRenderTarget(); 74 virtual egl::Image *createSharedImage(); 75 virtual bool isShared() const; 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 gl::BindingPointer<Texture2D> mTexture2D; 85 GLint mLevel; 86}; 87 88class RenderbufferTexture3D : public RenderbufferInterface 89{ 90public: 91 RenderbufferTexture3D(Texture3D *texture, GLint level, GLint layer); 92 93 virtual ~RenderbufferTexture3D(); 94 95 virtual void addProxyRef(const Renderbuffer *proxy); 96 virtual void releaseProxy(const Renderbuffer *proxy); 97 98 virtual egl::Image *getRenderTarget(); 99 virtual egl::Image *createSharedImage(); 100 virtual bool isShared() const; 101 102 virtual GLsizei getWidth() const; 103 virtual GLsizei getHeight() const; 104 virtual GLint getLayer() const { return mLayer; } 105 virtual GLenum getFormat() const; 106 virtual sw::Format getInternalFormat() const; 107 virtual GLsizei getSamples() const; 108 109private: 110 gl::BindingPointer<Texture3D> mTexture3D; 111 GLint mLevel; 112 GLint mLayer; 113}; 114 115class RenderbufferTextureCubeMap : public RenderbufferInterface 116{ 117public: 118 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target, GLint level); 119 120 virtual ~RenderbufferTextureCubeMap(); 121 122 virtual void addProxyRef(const Renderbuffer *proxy); 123 virtual void releaseProxy(const Renderbuffer *proxy); 124 125 virtual egl::Image *getRenderTarget(); 126 virtual egl::Image *createSharedImage(); 127 virtual bool isShared() const; 128 129 virtual GLsizei getWidth() const; 130 virtual GLsizei getHeight() const; 131 virtual GLenum getFormat() const; 132 virtual sw::Format getInternalFormat() const; 133 virtual GLsizei getSamples() const; 134 135private: 136 gl::BindingPointer<TextureCubeMap> mTextureCubeMap; 137 GLenum mTarget; 138 GLint mLevel; 139}; 140 141// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage 142// is called. The specific concrete type depends on whether the internal format is 143// colour depth, stencil or packed depth/stencil. 144class RenderbufferStorage : public RenderbufferInterface 145{ 146public: 147 RenderbufferStorage(); 148 149 virtual ~RenderbufferStorage() = 0; 150 151 virtual egl::Image *getRenderTarget() = 0; 152 virtual egl::Image *createSharedImage() = 0; 153 virtual bool isShared() const = 0; 154 155 virtual GLsizei getWidth() const; 156 virtual GLsizei getHeight() const; 157 virtual GLenum getFormat() const; 158 virtual sw::Format getInternalFormat() const; 159 virtual GLsizei getSamples() const; 160 161protected: 162 GLsizei mWidth; 163 GLsizei mHeight; 164 GLenum format; 165 sw::Format internalFormat; 166 GLsizei mSamples; 167}; 168 169// Renderbuffer implements the GL renderbuffer object. 170// It's only a proxy for a RenderbufferInterface instance; the internal object 171// can change whenever glRenderbufferStorage is called. 172class Renderbuffer : public gl::NamedObject 173{ 174public: 175 Renderbuffer(GLuint name, RenderbufferInterface *storage); 176 177 virtual ~Renderbuffer(); 178 179 // These functions from Object are overloaded here because 180 // Textures need to maintain their own count of references to them via 181 // Renderbuffers/RenderbufferTextures. These functions invoke those 182 // reference counting functions on the RenderbufferInterface. 183 virtual void addRef(); 184 virtual void release(); 185 186 egl::Image *getRenderTarget(); 187 virtual egl::Image *createSharedImage(); 188 virtual bool isShared() const; 189 190 GLsizei getWidth() const; 191 GLsizei getHeight() const; 192 GLint getLayer() const; 193 GLenum getFormat() const; 194 sw::Format getInternalFormat() const; 195 GLuint getRedSize() const; 196 GLuint getGreenSize() const; 197 GLuint getBlueSize() const; 198 GLuint getAlphaSize() const; 199 GLuint getDepthSize() const; 200 GLuint getStencilSize() const; 201 GLsizei getSamples() const; 202 203 void setStorage(RenderbufferStorage *newStorage); 204 205private: 206 RenderbufferInterface *mInstance; 207}; 208 209class Colorbuffer : public RenderbufferStorage 210{ 211public: 212 explicit Colorbuffer(egl::Image *renderTarget); 213 Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples); 214 215 virtual ~Colorbuffer(); 216 217 virtual egl::Image *getRenderTarget(); 218 virtual egl::Image *createSharedImage(); 219 virtual bool isShared() const; 220 221private: 222 egl::Image *mRenderTarget; 223}; 224 225class DepthStencilbuffer : public RenderbufferStorage 226{ 227public: 228 explicit DepthStencilbuffer(egl::Image *depthStencil); 229 DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples); 230 231 ~DepthStencilbuffer(); 232 233 virtual egl::Image *getRenderTarget(); 234 virtual egl::Image *createSharedImage(); 235 virtual bool isShared() const; 236 237protected: 238 egl::Image *mDepthStencil; 239}; 240 241class Depthbuffer : public DepthStencilbuffer 242{ 243public: 244 explicit Depthbuffer(egl::Image *depthStencil); 245 Depthbuffer(GLsizei width, GLsizei height, GLsizei samples); 246 247 virtual ~Depthbuffer(); 248}; 249 250class Stencilbuffer : public DepthStencilbuffer 251{ 252public: 253 explicit Stencilbuffer(egl::Image *depthStencil); 254 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples); 255 256 virtual ~Stencilbuffer(); 257}; 258} 259 260#endif // LIBGLESV2_RENDERBUFFER_H_ 261