10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
20bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//
30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License.
50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at
60bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//
70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
80bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//
90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software
100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and
130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License.
140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Renderbuffer.h: Defines the wrapper class Renderbuffer, as well as the
160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer,
170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#ifndef LIBGLES_CM_RENDERBUFFER_H_
210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#define LIBGLES_CM_RENDERBUFFER_H_
220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "common/Object.hpp"
240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "common/Image.hpp"
250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <GLES/gl.h>
270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensnamespace es1
290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Texture2D;
310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Renderbuffer;
320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Colorbuffer;
330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass DepthStencilbuffer;
340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass RenderbufferInterface
360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	RenderbufferInterface();
390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual ~RenderbufferInterface() {};
410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual void addProxyRef(const Renderbuffer *proxy);
430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual void releaseProxy(const Renderbuffer *proxy);
440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual egl::Image *getRenderTarget() = 0;
460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual egl::Image *createSharedImage() = 0;
470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual bool isShared() const = 0;
480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getWidth() const = 0;
500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getHeight() const = 0;
513e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens	virtual GLint getFormat() const = 0;
520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getSamples() const = 0;
530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getRedSize() const;
550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getGreenSize() const;
560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getBlueSize() const;
570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getAlphaSize() const;
580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getDepthSize() const;
590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getStencilSize() const;
600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass RenderbufferTexture2D : public RenderbufferInterface
630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	RenderbufferTexture2D(Texture2D *texture);
660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual ~RenderbufferTexture2D();
680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual void addProxyRef(const Renderbuffer *proxy);
700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual void releaseProxy(const Renderbuffer *proxy);
710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual egl::Image *getRenderTarget();
730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual egl::Image *createSharedImage();
740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual bool isShared() const;
750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getWidth() const;
770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getHeight() const;
783e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens	virtual GLint getFormat() const;
790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getSamples() const;
800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensprivate:
820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	gl::BindingPointer<Texture2D> mTexture2D;
830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// is called. The specific concrete type depends on whether the internal format is
870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// colour depth, stencil or packed depth/stencil.
880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass RenderbufferStorage : public RenderbufferInterface
890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	RenderbufferStorage();
920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual ~RenderbufferStorage() = 0;
940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual egl::Image *getRenderTarget() = 0;
960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual egl::Image *createSharedImage() = 0;
970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual bool isShared() const = 0;
980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getWidth() const;
1000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getHeight() const;
1013e5f6fd5e3a17562a85df3b4b0efced78a5b2129Nicolas Capens	virtual GLint getFormat() const;
1020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual GLsizei getSamples() const;
1030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensprotected:
1050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLsizei mWidth;
1060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLsizei mHeight;
1070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLenum format;
1080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLsizei mSamples;
1090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
1100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Renderbuffer implements the GL renderbuffer object.
1120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// It's only a proxy for a RenderbufferInterface instance; the internal object
1130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// can change whenever glRenderbufferStorage is called.
1140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Renderbuffer : public gl::NamedObject
1150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
1160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
1170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	Renderbuffer(GLuint name, RenderbufferInterface *storage);
1180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual ~Renderbuffer();
1200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	// These functions from Object are overloaded here because
1220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    // Textures need to maintain their own count of references to them via
1230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    // Renderbuffers/RenderbufferTextures. These functions invoke those
1240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    // reference counting functions on the RenderbufferInterface.
1250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual void addRef();
1260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual void release();
1270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	egl::Image *getRenderTarget();
1290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual egl::Image *createSharedImage();
1300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual bool isShared() const;
1310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLsizei getWidth() const;
1330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLsizei getHeight() const;
1340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLenum getFormat() const;
1350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getRedSize() const;
1360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getGreenSize() const;
1370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getBlueSize() const;
1380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getAlphaSize() const;
1390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getDepthSize() const;
1400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLuint getStencilSize() const;
1410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	GLsizei getSamples() const;
1420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	void setStorage(RenderbufferStorage *newStorage);
1440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensprivate:
1460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	RenderbufferInterface *mInstance;
1470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
1480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Colorbuffer : public RenderbufferStorage
1500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
1510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
1520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	explicit Colorbuffer(egl::Image *renderTarget);
1533b4a25c5365486981157f8ba9a2aee539c162a0dNicolas Capens	Colorbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
1540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual ~Colorbuffer();
1560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual egl::Image *getRenderTarget();
1580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual egl::Image *createSharedImage();
1590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual bool isShared() const;
1600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensprivate:
1620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	egl::Image *mRenderTarget;
1630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
1640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass DepthStencilbuffer : public RenderbufferStorage
1660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
1670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
1680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	explicit DepthStencilbuffer(egl::Image *depthStencil);
1693b4a25c5365486981157f8ba9a2aee539c162a0dNicolas Capens	DepthStencilbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
1700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	~DepthStencilbuffer();
1720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual egl::Image *getRenderTarget();
1740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual egl::Image *createSharedImage();
1750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens    virtual bool isShared() const;
1760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensprotected:
1780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	egl::Image *mDepthStencil;
1790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
1800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Depthbuffer : public DepthStencilbuffer
1820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
1830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
1840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	explicit Depthbuffer(egl::Image *depthStencil);
1853b4a25c5365486981157f8ba9a2aee539c162a0dNicolas Capens	Depthbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
1860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual ~Depthbuffer();
1880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
1890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass Stencilbuffer : public DepthStencilbuffer
1910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
1920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic:
1930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	explicit Stencilbuffer(egl::Image *depthStencil);
1940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
1950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	virtual ~Stencilbuffer();
1970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens};
1980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens}
1990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
2000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#endif   // LIBGLES_CM_RENDERBUFFER_H_
201