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. 19 20 #ifndef LIBGL_RENDERBUFFER_H_ 21 #define LIBGL_RENDERBUFFER_H_ 22 23 #include "common/Object.hpp" 24 #include "Image.hpp" 25 26 #define _GDI32_ 27 #include <windows.h> 28 #include <GL/GL.h> 29 #include <GL/glext.h> 30 31 namespace gl 32 { 33 class Texture2D; 34 class TextureCubeMap; 35 class Renderbuffer; 36 class Colorbuffer; 37 class DepthStencilbuffer; 38 39 class RenderbufferInterface 40 { 41 public: 42 RenderbufferInterface(); 43 ~RenderbufferInterface()44 virtual ~RenderbufferInterface() {}; 45 46 virtual void addProxyRef(const Renderbuffer *proxy); 47 virtual void releaseProxy(const Renderbuffer *proxy); 48 49 virtual Image *getRenderTarget() = 0; 50 51 virtual GLsizei getWidth() const = 0; 52 virtual GLsizei getHeight() const = 0; 53 virtual GLenum getFormat() const = 0; 54 virtual sw::Format getInternalFormat() const = 0; 55 virtual GLsizei getSamples() const = 0; 56 57 GLuint getRedSize() const; 58 GLuint getGreenSize() const; 59 GLuint getBlueSize() const; 60 GLuint getAlphaSize() const; 61 GLuint getDepthSize() const; 62 GLuint getStencilSize() const; 63 }; 64 65 class RenderbufferTexture2D : public RenderbufferInterface 66 { 67 public: 68 RenderbufferTexture2D(Texture2D *texture); 69 70 virtual ~RenderbufferTexture2D(); 71 72 virtual void addProxyRef(const Renderbuffer *proxy); 73 virtual void releaseProxy(const Renderbuffer *proxy); 74 75 Image *getRenderTarget(); 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 83 private: 84 BindingPointer<Texture2D> mTexture2D; 85 }; 86 87 class RenderbufferTextureCubeMap : public RenderbufferInterface 88 { 89 public: 90 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target); 91 92 virtual ~RenderbufferTextureCubeMap(); 93 94 virtual void addProxyRef(const Renderbuffer *proxy); 95 virtual void releaseProxy(const Renderbuffer *proxy); 96 97 Image *getRenderTarget(); 98 99 virtual GLsizei getWidth() const; 100 virtual GLsizei getHeight() const; 101 virtual GLenum getFormat() const; 102 virtual sw::Format getInternalFormat() const; 103 virtual GLsizei getSamples() const; 104 105 private: 106 BindingPointer<TextureCubeMap> mTextureCubeMap; 107 GLenum mTarget; 108 }; 109 110 // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage 111 // is called. The specific concrete type depends on whether the internal format is 112 // colour depth, stencil or packed depth/stencil. 113 class RenderbufferStorage : public RenderbufferInterface 114 { 115 public: 116 RenderbufferStorage(); 117 118 virtual ~RenderbufferStorage() = 0; 119 120 virtual Image *getRenderTarget(); 121 122 virtual GLsizei getWidth() const; 123 virtual GLsizei getHeight() const; 124 virtual GLenum getFormat() const; 125 virtual sw::Format getInternalFormat() const; 126 virtual GLsizei getSamples() const; 127 128 protected: 129 GLsizei mWidth; 130 GLsizei mHeight; 131 GLenum format; 132 sw::Format internalFormat; 133 GLsizei mSamples; 134 }; 135 136 // Renderbuffer implements the GL renderbuffer object. 137 // It's only a proxy for a RenderbufferInterface instance; the internal object 138 // can change whenever glRenderbufferStorage is called. 139 class Renderbuffer : public NamedObject 140 { 141 public: 142 Renderbuffer(GLuint name, RenderbufferInterface *storage); 143 144 virtual ~Renderbuffer(); 145 146 // These functions from Object are overloaded here because 147 // Textures need to maintain their own count of references to them via 148 // Renderbuffers/RenderbufferTextures. These functions invoke those 149 // reference counting functions on the RenderbufferInterface. 150 virtual void addRef(); 151 virtual void release(); 152 153 Image *getRenderTarget(); 154 155 GLsizei getWidth() const; 156 GLsizei getHeight() const; 157 GLenum getFormat() const; 158 sw::Format getInternalFormat() const; 159 GLuint getRedSize() const; 160 GLuint getGreenSize() const; 161 GLuint getBlueSize() const; 162 GLuint getAlphaSize() const; 163 GLuint getDepthSize() const; 164 GLuint getStencilSize() const; 165 GLsizei getSamples() const; 166 167 void setStorage(RenderbufferStorage *newStorage); 168 169 private: 170 RenderbufferInterface *mInstance; 171 }; 172 173 class Colorbuffer : public RenderbufferStorage 174 { 175 public: 176 explicit Colorbuffer(Image *renderTarget); 177 Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples); 178 179 virtual ~Colorbuffer(); 180 181 virtual Image *getRenderTarget(); 182 183 private: 184 Image *mRenderTarget; 185 }; 186 187 class DepthStencilbuffer : public RenderbufferStorage 188 { 189 public: 190 explicit DepthStencilbuffer(Image *depthStencil); 191 DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples); 192 193 ~DepthStencilbuffer(); 194 195 virtual Image *getRenderTarget(); 196 197 protected: 198 Image *mDepthStencil; 199 }; 200 201 class Depthbuffer : public DepthStencilbuffer 202 { 203 public: 204 explicit Depthbuffer(Image *depthStencil); 205 Depthbuffer(GLsizei width, GLsizei height, GLsizei samples); 206 207 virtual ~Depthbuffer(); 208 }; 209 210 class Stencilbuffer : public DepthStencilbuffer 211 { 212 public: 213 explicit Stencilbuffer(Image *depthStencil); 214 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples); 215 216 virtual ~Stencilbuffer(); 217 }; 218 } 219 220 #endif // LIBGL_RENDERBUFFER_H_ 221