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 LIBGLES_CM_RENDERBUFFER_H_ 21#define LIBGLES_CM_RENDERBUFFER_H_ 22 23#include "common/Object.hpp" 24#include "common/Image.hpp" 25 26#include <GLES/gl.h> 27 28namespace es1 29{ 30class Texture2D; 31class Renderbuffer; 32class Colorbuffer; 33class DepthStencilbuffer; 34 35class RenderbufferInterface 36{ 37public: 38 RenderbufferInterface(); 39 40 virtual ~RenderbufferInterface() {}; 41 42 virtual void addProxyRef(const Renderbuffer *proxy); 43 virtual void releaseProxy(const Renderbuffer *proxy); 44 45 virtual egl::Image *getRenderTarget() = 0; 46 virtual egl::Image *createSharedImage() = 0; 47 virtual bool isShared() const = 0; 48 49 virtual GLsizei getWidth() const = 0; 50 virtual GLsizei getHeight() const = 0; 51 virtual GLint getFormat() 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 GLint getFormat() const; 79 virtual GLsizei getSamples() const; 80 81private: 82 gl::BindingPointer<Texture2D> mTexture2D; 83}; 84 85// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage 86// is called. The specific concrete type depends on whether the internal format is 87// colour depth, stencil or packed depth/stencil. 88class RenderbufferStorage : public RenderbufferInterface 89{ 90public: 91 RenderbufferStorage(); 92 93 virtual ~RenderbufferStorage() = 0; 94 95 virtual egl::Image *getRenderTarget() = 0; 96 virtual egl::Image *createSharedImage() = 0; 97 virtual bool isShared() const = 0; 98 99 virtual GLsizei getWidth() const; 100 virtual GLsizei getHeight() const; 101 virtual GLint getFormat() const; 102 virtual GLsizei getSamples() const; 103 104protected: 105 GLsizei mWidth; 106 GLsizei mHeight; 107 GLenum format; 108 GLsizei mSamples; 109}; 110 111// Renderbuffer implements the GL renderbuffer object. 112// It's only a proxy for a RenderbufferInterface instance; the internal object 113// can change whenever glRenderbufferStorage is called. 114class Renderbuffer : public gl::NamedObject 115{ 116public: 117 Renderbuffer(GLuint name, RenderbufferInterface *storage); 118 119 virtual ~Renderbuffer(); 120 121 // These functions from Object are overloaded here because 122 // Textures need to maintain their own count of references to them via 123 // Renderbuffers/RenderbufferTextures. These functions invoke those 124 // reference counting functions on the RenderbufferInterface. 125 virtual void addRef(); 126 virtual void release(); 127 128 egl::Image *getRenderTarget(); 129 virtual egl::Image *createSharedImage(); 130 virtual bool isShared() const; 131 132 GLsizei getWidth() const; 133 GLsizei getHeight() const; 134 GLenum getFormat() const; 135 GLuint getRedSize() const; 136 GLuint getGreenSize() const; 137 GLuint getBlueSize() const; 138 GLuint getAlphaSize() const; 139 GLuint getDepthSize() const; 140 GLuint getStencilSize() const; 141 GLsizei getSamples() const; 142 143 void setStorage(RenderbufferStorage *newStorage); 144 145private: 146 RenderbufferInterface *mInstance; 147}; 148 149class Colorbuffer : public RenderbufferStorage 150{ 151public: 152 explicit Colorbuffer(egl::Image *renderTarget); 153 Colorbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); 154 155 virtual ~Colorbuffer(); 156 157 virtual egl::Image *getRenderTarget(); 158 virtual egl::Image *createSharedImage(); 159 virtual bool isShared() const; 160 161private: 162 egl::Image *mRenderTarget; 163}; 164 165class DepthStencilbuffer : public RenderbufferStorage 166{ 167public: 168 explicit DepthStencilbuffer(egl::Image *depthStencil); 169 DepthStencilbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); 170 171 ~DepthStencilbuffer(); 172 173 virtual egl::Image *getRenderTarget(); 174 virtual egl::Image *createSharedImage(); 175 virtual bool isShared() const; 176 177protected: 178 egl::Image *mDepthStencil; 179}; 180 181class Depthbuffer : public DepthStencilbuffer 182{ 183public: 184 explicit Depthbuffer(egl::Image *depthStencil); 185 Depthbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); 186 187 virtual ~Depthbuffer(); 188}; 189 190class Stencilbuffer : public DepthStencilbuffer 191{ 192public: 193 explicit Stencilbuffer(egl::Image *depthStencil); 194 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples); 195 196 virtual ~Stencilbuffer(); 197}; 198} 199 200#endif // LIBGLES_CM_RENDERBUFFER_H_ 201