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