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