1// 2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3// Use of this source code is governed by a BSD-style license that can be 4// found in the LICENSE file. 5// 6 7// Renderbuffer.h: Defines the wrapper class gl::Renderbuffer, as well as the 8// class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer, 9// DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer 10// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. 11 12#ifndef LIBGLESV2_RENDERBUFFER_H_ 13#define LIBGLESV2_RENDERBUFFER_H_ 14 15#define GL_APICALL 16#include <GLES2/gl2.h> 17#include <d3d9.h> 18 19#include "common/angleutils.h" 20#include "libGLESv2/RefCountObject.h" 21 22namespace gl 23{ 24 class Texture; 25 26// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage 27// is called. The specific concrete type depends on whether the internal format is 28// colour depth, stencil or packed depth/stencil. 29class RenderbufferStorage 30{ 31 public: 32 RenderbufferStorage(); 33 34 virtual ~RenderbufferStorage() = 0; 35 36 virtual bool isColorbuffer() const; 37 virtual bool isDepthbuffer() const; 38 virtual bool isStencilbuffer() const; 39 40 virtual IDirect3DSurface9 *getRenderTarget(); 41 virtual IDirect3DSurface9 *getDepthStencil(); 42 43 virtual int getWidth() const; 44 virtual int getHeight() const; 45 virtual GLenum getFormat() const; 46 virtual bool isFloatingPoint() const; 47 D3DFORMAT getD3DFormat() const; 48 GLsizei getSamples() const; 49 unsigned int getSerial() const; 50 51 static unsigned int issueSerial(); 52 53 protected: 54 void setSize(int width, int height); 55 GLenum mFormat; 56 D3DFORMAT mD3DFormat; 57 GLsizei mSamples; 58 const unsigned int mSerial; 59 60 private: 61 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage); 62 63 static unsigned int mCurrentSerial; 64 65 int mWidth; 66 int mHeight; 67}; 68 69// Renderbuffer implements the GL renderbuffer object. 70// It's only a wrapper for a RenderbufferStorage, but the internal object 71// can change whenever glRenderbufferStorage is called. 72class Renderbuffer : public RefCountObject 73{ 74 public: 75 Renderbuffer(GLuint id, RenderbufferStorage *storage); 76 77 ~Renderbuffer(); 78 79 bool isColorbuffer() const; 80 bool isDepthbuffer() const; 81 bool isStencilbuffer() const; 82 83 IDirect3DSurface9 *getRenderTarget(); 84 IDirect3DSurface9 *getDepthStencil(); 85 86 int getWidth() const; 87 int getHeight() const; 88 GLenum getFormat() const; 89 D3DFORMAT getD3DFormat() const; 90 unsigned int getSerial() const; 91 92 void setStorage(RenderbufferStorage *newStorage); 93 RenderbufferStorage *getStorage() { return mStorage; } 94 95 private: 96 DISALLOW_COPY_AND_ASSIGN(Renderbuffer); 97 98 RenderbufferStorage *mStorage; 99}; 100 101class Colorbuffer : public RenderbufferStorage 102{ 103 public: 104 explicit Colorbuffer(IDirect3DSurface9 *renderTarget); 105 explicit Colorbuffer(const Texture* texture); 106 Colorbuffer(int width, int height, GLenum format, GLsizei samples); 107 108 ~Colorbuffer(); 109 110 bool isColorbuffer() const; 111 112 GLuint getRedSize() const; 113 GLuint getGreenSize() const; 114 GLuint getBlueSize() const; 115 GLuint getAlphaSize() const; 116 117 IDirect3DSurface9 *getRenderTarget(); 118 119 protected: 120 IDirect3DSurface9 *mRenderTarget; 121 122 private: 123 DISALLOW_COPY_AND_ASSIGN(Colorbuffer); 124}; 125 126class DepthStencilbuffer : public RenderbufferStorage 127{ 128 public: 129 explicit DepthStencilbuffer(IDirect3DSurface9 *depthStencil); 130 DepthStencilbuffer(int width, int height, GLsizei samples); 131 132 ~DepthStencilbuffer(); 133 134 virtual bool isDepthbuffer() const; 135 virtual bool isStencilbuffer() const; 136 137 GLuint getDepthSize() const; 138 GLuint getStencilSize() const; 139 140 IDirect3DSurface9 *getDepthStencil(); 141 142 private: 143 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer); 144 IDirect3DSurface9 *mDepthStencil; 145}; 146 147class Depthbuffer : public DepthStencilbuffer 148{ 149 public: 150 explicit Depthbuffer(IDirect3DSurface9 *depthStencil); 151 Depthbuffer(int width, int height, GLsizei samples); 152 153 ~Depthbuffer(); 154 155 bool isDepthbuffer() const; 156 bool isStencilbuffer() const; 157 158 private: 159 DISALLOW_COPY_AND_ASSIGN(Depthbuffer); 160}; 161 162class Stencilbuffer : public DepthStencilbuffer 163{ 164 public: 165 explicit Stencilbuffer(IDirect3DSurface9 *depthStencil); 166 Stencilbuffer(int width, int height, GLsizei samples); 167 168 ~Stencilbuffer(); 169 170 bool isDepthbuffer() const; 171 bool isStencilbuffer() const; 172 173 private: 174 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer); 175}; 176} 177 178#endif // LIBGLESV2_RENDERBUFFER_H_ 179