//
// Copyright (c) 2012 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.
//

// SwapChain9.h: Defines a back-end specific class for the D3D9 swap chain.

#ifndef LIBGLESV2_RENDERER_SWAPCHAIN9_H_
#define LIBGLESV2_RENDERER_SWAPCHAIN9_H_

#include "common/angleutils.h"
#include "libGLESv2/renderer/SwapChain.h"

namespace rx
{
class Renderer9;

class SwapChain9 : public SwapChain
{
  public:
    SwapChain9(Renderer9 *renderer, EGLNativeWindowType window, HANDLE shareHandle,
               GLenum backBufferFormat, GLenum depthBufferFormat);
    virtual ~SwapChain9();

    EGLint resize(EGLint backbufferWidth, EGLint backbufferHeight);
    virtual EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval);
    virtual EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height);
    virtual void recreate();

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

    static SwapChain9 *makeSwapChain9(SwapChain *swapChain);

  private:
    DISALLOW_COPY_AND_ASSIGN(SwapChain9);

    void release();

    Renderer9 *mRenderer;
    EGLint mHeight;
    EGLint mWidth;
    EGLint mSwapInterval;

    IDirect3DSwapChain9 *mSwapChain;
    IDirect3DSurface9 *mBackBuffer;
    IDirect3DSurface9 *mRenderTarget;
    IDirect3DSurface9 *mDepthStencil;
    IDirect3DTexture9* mOffscreenTexture;
};

}
#endif // LIBGLESV2_RENDERER_SWAPCHAIN9_H_
