1a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 2a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Use of this source code is governed by a BSD-style license that can be 4a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// found in the LICENSE file. 5a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 6a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 75abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Renderbuffer.h: Defines the wrapper class gl::Renderbuffer, as well as the 85abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer, 95abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer 10a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. 11a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 12a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#ifndef LIBGLESV2_RENDERBUFFER_H_ 13a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define LIBGLESV2_RENDERBUFFER_H_ 14a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 15a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define GL_APICALL 16a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <GLES2/gl2.h> 17a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <d3d9.h> 18a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 19a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "common/angleutils.h" 205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "libGLESv2/RefCountObject.h" 21a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 22a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocknamespace gl 23a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 24ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch class Texture; 255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage 275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// is called. The specific concrete type depends on whether the internal format is 285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// colour depth, stencil or packed depth/stencil. 295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass RenderbufferStorage 30a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 31a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block public: 325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick RenderbufferStorage(); 33a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual ~RenderbufferStorage() = 0; 35a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual bool isColorbuffer() const; 375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual bool isDepthbuffer() const; 385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual bool isStencilbuffer() const; 39a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 40a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block virtual IDirect3DSurface9 *getRenderTarget(); 41a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block virtual IDirect3DSurface9 *getDepthStencil(); 42a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual int getWidth() const; 445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual int getHeight() const; 455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual GLenum getFormat() const; 46ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch virtual bool isFloatingPoint() const; 475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick D3DFORMAT getD3DFormat() const; 485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick GLsizei getSamples() const; 49a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block unsigned int getSerial() const; 50a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 51a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block static unsigned int issueSerial(); 52a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 53a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block protected: 54a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block void setSize(int width, int height); 55a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block GLenum mFormat; 565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick D3DFORMAT mD3DFormat; 575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick GLsizei mSamples; 58ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch const unsigned int mSerial; 59a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 60a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block private: 615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage); 62a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 63a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block static unsigned int mCurrentSerial; 64a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 65a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block int mWidth; 66a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block int mHeight; 67a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}; 68a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Renderbuffer implements the GL renderbuffer object. 705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// It's only a wrapper for a RenderbufferStorage, but the internal object 715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// can change whenever glRenderbufferStorage is called. 725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass Renderbuffer : public RefCountObject 735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick public: 755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer(GLuint id, RenderbufferStorage *storage); 765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ~Renderbuffer(); 785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool isColorbuffer() const; 805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool isDepthbuffer() const; 815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool isStencilbuffer() const; 825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick IDirect3DSurface9 *getRenderTarget(); 845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick IDirect3DSurface9 *getDepthStencil(); 855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick int getWidth() const; 875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick int getHeight() const; 885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick GLenum getFormat() const; 895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick D3DFORMAT getD3DFormat() const; 905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick unsigned int getSerial() const; 915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void setStorage(RenderbufferStorage *newStorage); 935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick RenderbufferStorage *getStorage() { return mStorage; } 945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick private: 965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick DISALLOW_COPY_AND_ASSIGN(Renderbuffer); 975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick RenderbufferStorage *mStorage; 995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}; 1005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass Colorbuffer : public RenderbufferStorage 102a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 103a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block public: 104a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block explicit Colorbuffer(IDirect3DSurface9 *renderTarget); 105ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch explicit Colorbuffer(const Texture* texture); 1065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Colorbuffer(int width, int height, GLenum format, GLsizei samples); 107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block ~Colorbuffer(); 109a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool isColorbuffer() const; 111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick GLuint getRedSize() const; 1135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick GLuint getGreenSize() const; 1145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick GLuint getBlueSize() const; 1155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick GLuint getAlphaSize() const; 116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block IDirect3DSurface9 *getRenderTarget(); 118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block protected: 120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block IDirect3DSurface9 *mRenderTarget; 121a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block private: 123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block DISALLOW_COPY_AND_ASSIGN(Colorbuffer); 124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}; 125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass DepthStencilbuffer : public RenderbufferStorage 127a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 128a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block public: 1295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick explicit DepthStencilbuffer(IDirect3DSurface9 *depthStencil); 1305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick DepthStencilbuffer(int width, int height, GLsizei samples); 131a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ~DepthStencilbuffer(); 133a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual bool isDepthbuffer() const; 1355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick virtual bool isStencilbuffer() const; 136a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick GLuint getDepthSize() const; 1385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick GLuint getStencilSize() const; 139a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 140a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block IDirect3DSurface9 *getDepthStencil(); 141a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 142a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block private: 1435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer); 144a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block IDirect3DSurface9 *mDepthStencil; 145a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}; 146a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass Depthbuffer : public DepthStencilbuffer 148a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 149a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block public: 1505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick explicit Depthbuffer(IDirect3DSurface9 *depthStencil); 1515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Depthbuffer(int width, int height, GLsizei samples); 152a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ~Depthbuffer(); 1545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool isDepthbuffer() const; 1565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool isStencilbuffer() const; 1575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick private: 1595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick DISALLOW_COPY_AND_ASSIGN(Depthbuffer); 1605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}; 161a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass Stencilbuffer : public DepthStencilbuffer 1635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 1645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick public: 1655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick explicit Stencilbuffer(IDirect3DSurface9 *depthStencil); 1665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Stencilbuffer(int width, int height, GLsizei samples); 167a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick ~Stencilbuffer(); 169a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool isDepthbuffer() const; 1715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick bool isStencilbuffer() const; 172a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 173a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block private: 174a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block DISALLOW_COPY_AND_ASSIGN(Stencilbuffer); 175a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}; 176a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 177a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 178a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#endif // LIBGLESV2_RENDERBUFFER_H_ 179