| // Copyright 2016 The SwiftShader Authors. All Rights Reserved. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //    http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | // Renderbuffer.h: Defines the wrapper class Renderbuffer, as well as the | 
 | // class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer, | 
 | // DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer | 
 | // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. | 
 |  | 
 | #ifndef LIBGLESV2_RENDERBUFFER_H_ | 
 | #define LIBGLESV2_RENDERBUFFER_H_ | 
 |  | 
 | #include "common/Object.hpp" | 
 | #include "common/Image.hpp" | 
 |  | 
 | #include <GLES2/gl2.h> | 
 |  | 
 | namespace es2 | 
 | { | 
 |  | 
 | class Texture2D; | 
 | class Texture3D; | 
 | class TextureCubeMap; | 
 | class Texture2DRect; | 
 | class Renderbuffer; | 
 | class Colorbuffer; | 
 | class DepthStencilbuffer; | 
 |  | 
 | class RenderbufferInterface | 
 | { | 
 | public: | 
 | 	RenderbufferInterface(); | 
 |  | 
 | 	virtual ~RenderbufferInterface() {}; | 
 |  | 
 | 	virtual void addProxyRef(const Renderbuffer *proxy); | 
 |     virtual void releaseProxy(const Renderbuffer *proxy); | 
 |  | 
 | 	virtual egl::Image *getRenderTarget() = 0; | 
 |     virtual egl::Image *createSharedImage() = 0; | 
 |     virtual bool isShared() const = 0; | 
 |  | 
 | 	virtual GLsizei getWidth() const = 0; | 
 | 	virtual GLsizei getHeight() const = 0; | 
 | 	virtual GLsizei getDepth() const { return 1; } | 
 | 	virtual GLint getLevel() const { return 0; } | 
 | 	virtual GLint getFormat() const = 0; | 
 | 	virtual GLsizei getSamples() const = 0; | 
 |  | 
 | 	virtual void setLevel(GLint) {} | 
 |  | 
 | 	GLuint getRedSize() const; | 
 | 	GLuint getGreenSize() const; | 
 | 	GLuint getBlueSize() const; | 
 | 	GLuint getAlphaSize() const; | 
 | 	GLuint getDepthSize() const; | 
 | 	GLuint getStencilSize() const; | 
 | }; | 
 |  | 
 | class RenderbufferTexture2D : public RenderbufferInterface | 
 | { | 
 | public: | 
 | 	RenderbufferTexture2D(Texture2D *texture, GLint level); | 
 |  | 
 | 	~RenderbufferTexture2D() override; | 
 |  | 
 | 	void addProxyRef(const Renderbuffer *proxy) override; | 
 |     void releaseProxy(const Renderbuffer *proxy) override; | 
 |  | 
 | 	egl::Image *getRenderTarget() override; | 
 |     egl::Image *createSharedImage() override; | 
 |     bool isShared() const override; | 
 |  | 
 | 	GLsizei getWidth() const override; | 
 | 	GLsizei getHeight() const override; | 
 | 	GLint getLevel() const override { return mLevel; } | 
 | 	GLint getFormat() const override; | 
 | 	GLsizei getSamples() const override; | 
 |  | 
 | 	void setLevel(GLint level) override { mLevel = level; } | 
 |  | 
 | private: | 
 | 	gl::BindingPointer<Texture2D> mTexture2D; | 
 | 	GLint mLevel; | 
 | }; | 
 |  | 
 | class RenderbufferTexture2DRect : public RenderbufferInterface | 
 | { | 
 | public: | 
 | 	RenderbufferTexture2DRect(Texture2DRect *texture); | 
 |  | 
 | 	~RenderbufferTexture2DRect() override; | 
 |  | 
 | 	void addProxyRef(const Renderbuffer *proxy) override; | 
 | 	void releaseProxy(const Renderbuffer *proxy) override; | 
 |  | 
 | 	egl::Image *getRenderTarget() override; | 
 | 	egl::Image *createSharedImage() override; | 
 | 	bool isShared() const override; | 
 |  | 
 | 	GLsizei getWidth() const override; | 
 | 	GLsizei getHeight() const override; | 
 | 	GLint getFormat() const override; | 
 | 	GLsizei getSamples() const override; | 
 |  | 
 | private: | 
 | 	gl::BindingPointer<Texture2DRect> mTexture2DRect; | 
 | }; | 
 |  | 
 | class RenderbufferTexture3D : public RenderbufferInterface | 
 | { | 
 | public: | 
 | 	RenderbufferTexture3D(Texture3D *texture, GLint level); | 
 |  | 
 | 	~RenderbufferTexture3D() override; | 
 |  | 
 | 	void addProxyRef(const Renderbuffer *proxy) override; | 
 | 	void releaseProxy(const Renderbuffer *proxy) override; | 
 |  | 
 | 	egl::Image *getRenderTarget() override; | 
 | 	egl::Image *createSharedImage() override; | 
 | 	bool isShared() const override; | 
 |  | 
 | 	GLsizei getWidth() const override; | 
 | 	GLsizei getHeight() const override; | 
 | 	GLsizei getDepth() const override; | 
 | 	GLint getLevel() const override { return mLevel; } | 
 | 	GLint getFormat() const override; | 
 | 	GLsizei getSamples() const override; | 
 |  | 
 | 	void setLevel(GLint level) override { mLevel = level; } | 
 |  | 
 | private: | 
 | 	gl::BindingPointer<Texture3D> mTexture3D; | 
 | 	GLint mLevel; | 
 | }; | 
 |  | 
 | class RenderbufferTextureCubeMap : public RenderbufferInterface | 
 | { | 
 | public: | 
 | 	RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target, GLint level); | 
 |  | 
 | 	~RenderbufferTextureCubeMap() override; | 
 |  | 
 | 	void addProxyRef(const Renderbuffer *proxy) override; | 
 |     void releaseProxy(const Renderbuffer *proxy) override; | 
 |  | 
 | 	egl::Image *getRenderTarget() override; | 
 |     egl::Image *createSharedImage() override; | 
 |     bool isShared() const override; | 
 |  | 
 | 	GLsizei getWidth() const override; | 
 | 	GLsizei getHeight() const override; | 
 | 	GLint getLevel() const override { return mLevel; } | 
 | 	GLint getFormat() const override; | 
 | 	GLsizei getSamples() const override; | 
 |  | 
 | 	void setLevel(GLint level) override { mLevel = level; } | 
 |  | 
 | private: | 
 | 	gl::BindingPointer<TextureCubeMap> mTextureCubeMap; | 
 | 	GLenum mTarget; | 
 | 	GLint mLevel; | 
 | }; | 
 |  | 
 | // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage | 
 | // is called. The specific concrete type depends on whether the internal format is | 
 | // colour depth, stencil or packed depth/stencil. | 
 | class RenderbufferStorage : public RenderbufferInterface | 
 | { | 
 | public: | 
 | 	RenderbufferStorage(); | 
 |  | 
 | 	~RenderbufferStorage() override = 0; | 
 |  | 
 | 	egl::Image *getRenderTarget() override = 0; | 
 |     egl::Image *createSharedImage() override = 0; | 
 |     bool isShared() const override = 0; | 
 |  | 
 | 	GLsizei getWidth() const override; | 
 | 	GLsizei getHeight() const override; | 
 | 	GLint getFormat() const override; | 
 | 	GLsizei getSamples() const override; | 
 |  | 
 | protected: | 
 | 	GLsizei mWidth; | 
 | 	GLsizei mHeight; | 
 | 	GLenum format; | 
 | 	GLsizei mSamples; | 
 | }; | 
 |  | 
 | // Renderbuffer implements the GL renderbuffer object. | 
 | // It's only a proxy for a RenderbufferInterface instance; the internal object | 
 | // can change whenever glRenderbufferStorage is called. | 
 | class Renderbuffer : public gl::NamedObject | 
 | { | 
 | public: | 
 | 	Renderbuffer(GLuint name, RenderbufferInterface *storage); | 
 |  | 
 | 	~Renderbuffer() override; | 
 |  | 
 | 	// These functions from Object are overloaded here because | 
 |     // Textures need to maintain their own count of references to them via | 
 |     // Renderbuffers/RenderbufferTextures. These functions invoke those | 
 |     // reference counting functions on the RenderbufferInterface. | 
 |     void addRef() override; | 
 |     void release() override; | 
 |  | 
 | 	egl::Image *getRenderTarget(); | 
 |     virtual egl::Image *createSharedImage(); | 
 |     virtual bool isShared() const; | 
 |  | 
 | 	GLsizei getWidth() const; | 
 | 	GLsizei getHeight() const; | 
 | 	GLsizei getDepth() const; | 
 | 	GLint getLevel() const; | 
 | 	GLint getFormat() const; | 
 | 	GLuint getRedSize() const; | 
 | 	GLuint getGreenSize() const; | 
 | 	GLuint getBlueSize() const; | 
 | 	GLuint getAlphaSize() const; | 
 | 	GLuint getDepthSize() const; | 
 | 	GLuint getStencilSize() const; | 
 | 	GLsizei getSamples() const; | 
 |  | 
 | 	void setLevel(GLint level); | 
 | 	void setStorage(RenderbufferStorage *newStorage); | 
 |  | 
 | private: | 
 | 	RenderbufferInterface *mInstance; | 
 | }; | 
 |  | 
 | class Colorbuffer : public RenderbufferStorage | 
 | { | 
 | public: | 
 | 	explicit Colorbuffer(egl::Image *renderTarget); | 
 | 	Colorbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); | 
 |  | 
 | 	~Colorbuffer() override; | 
 |  | 
 | 	egl::Image *getRenderTarget() override; | 
 |     egl::Image *createSharedImage() override; | 
 |     bool isShared() const override; | 
 |  | 
 | private: | 
 | 	egl::Image *mRenderTarget; | 
 | }; | 
 |  | 
 | class DepthStencilbuffer : public RenderbufferStorage | 
 | { | 
 | public: | 
 | 	explicit DepthStencilbuffer(egl::Image *depthStencil); | 
 | 	DepthStencilbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); | 
 |  | 
 | 	~DepthStencilbuffer(); | 
 |  | 
 | 	egl::Image *getRenderTarget() override; | 
 |     egl::Image *createSharedImage() override; | 
 |     bool isShared() const override; | 
 |  | 
 | protected: | 
 | 	egl::Image *mDepthStencil; | 
 | }; | 
 |  | 
 | class Depthbuffer : public DepthStencilbuffer | 
 | { | 
 | public: | 
 | 	explicit Depthbuffer(egl::Image *depthStencil); | 
 | 	Depthbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples); | 
 |  | 
 | 	~Depthbuffer() override; | 
 | }; | 
 |  | 
 | class Stencilbuffer : public DepthStencilbuffer | 
 | { | 
 | public: | 
 | 	explicit Stencilbuffer(egl::Image *depthStencil); | 
 | 	Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples); | 
 |  | 
 | 	~Stencilbuffer() override; | 
 | }; | 
 | } | 
 |  | 
 | #endif   // LIBGLESV2_RENDERBUFFER_H_ |