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