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 31namespace gl 32{ 33class Texture2D; 34class TextureCubeMap; 35class Renderbuffer; 36class Colorbuffer; 37class DepthStencilbuffer; 38 39class RenderbufferInterface 40{ 41public: 42 RenderbufferInterface(); 43 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 65class RenderbufferTexture2D : public RenderbufferInterface 66{ 67public: 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 83private: 84 BindingPointer<Texture2D> mTexture2D; 85}; 86 87class RenderbufferTextureCubeMap : public RenderbufferInterface 88{ 89public: 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 105private: 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. 113class RenderbufferStorage : public RenderbufferInterface 114{ 115public: 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 128protected: 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. 139class Renderbuffer : public NamedObject 140{ 141public: 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 169private: 170 RenderbufferInterface *mInstance; 171}; 172 173class Colorbuffer : public RenderbufferStorage 174{ 175public: 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 183private: 184 Image *mRenderTarget; 185}; 186 187class DepthStencilbuffer : public RenderbufferStorage 188{ 189public: 190 explicit DepthStencilbuffer(Image *depthStencil); 191 DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples); 192 193 ~DepthStencilbuffer(); 194 195 virtual Image *getRenderTarget(); 196 197protected: 198 Image *mDepthStencil; 199}; 200 201class Depthbuffer : public DepthStencilbuffer 202{ 203public: 204 explicit Depthbuffer(Image *depthStencil); 205 Depthbuffer(GLsizei width, GLsizei height, GLsizei samples); 206 207 virtual ~Depthbuffer(); 208}; 209 210class Stencilbuffer : public DepthStencilbuffer 211{ 212public: 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