//
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// Renderbuffer.h: Defines the virtual gl::Renderbuffer class and its derived
// classes Colorbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.

#ifndef LIBGLESV2_RENDERBUFFER_H_
#define LIBGLESV2_RENDERBUFFER_H_

#define GL_APICALL
#include <GLES2/gl2.h>
#include <d3d9.h>

#include "common/angleutils.h"

namespace gl
{
class Renderbuffer
{
  public:
    Renderbuffer();

    virtual ~Renderbuffer();

    virtual bool isColorbuffer();
    virtual bool isDepthbuffer();
    virtual bool isStencilbuffer();

    virtual IDirect3DSurface9 *getRenderTarget();
    virtual IDirect3DSurface9 *getDepthStencil();

    int getWidth();
    int getHeight();
    GLenum getFormat();

  protected:
    int mWidth;
    int mHeight;
    GLenum mFormat;

  private:
    DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
};

class Colorbuffer : public Renderbuffer
{
  public:
    explicit Colorbuffer(IDirect3DSurface9 *renderTarget);
    Colorbuffer(int width, int height, GLenum format);

    ~Colorbuffer();

    bool isColorbuffer();

    GLuint getRedSize();
    GLuint getGreenSize();
    GLuint getBlueSize();
    GLuint getAlphaSize();

    IDirect3DSurface9 *getRenderTarget();

  protected:
    IDirect3DSurface9 *mRenderTarget;

  private:
    DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
};

class Depthbuffer : public Renderbuffer
{
  public:
    explicit Depthbuffer(IDirect3DSurface9 *depthStencil);
    Depthbuffer(int width, int height);

    ~Depthbuffer();

    bool isDepthbuffer();

    GLuint getDepthSize();

    IDirect3DSurface9 *getDepthStencil();

  private:
    DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
    IDirect3DSurface9 *mDepthStencil;
};

class Stencilbuffer : public Renderbuffer
{
  public:
    explicit Stencilbuffer(IDirect3DSurface9 *depthStencil);
    Stencilbuffer(int width, int height);

    ~Stencilbuffer();

    bool isStencilbuffer();

    GLuint getStencilSize();

    IDirect3DSurface9 *getDepthStencil();

  private:
    DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
    IDirect3DSurface9 *mDepthStencil;
};
}

#endif   // LIBGLESV2_RENDERBUFFER_H_
