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