Split the swap chain into an abstract interface and a D3D9 implementation.

TRAC #21926
Signed-off-by: Daniel Koch
Signed-off-by: Geoff Lang
Author: Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1445 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/RenderTarget.h b/src/libGLESv2/renderer/RenderTarget.h
index 62c684c..5827607 100644
--- a/src/libGLESv2/renderer/RenderTarget.h
+++ b/src/libGLESv2/renderer/RenderTarget.h
@@ -15,6 +15,8 @@
 
 #include "common/angleutils.h"
 
+struct IDirect3DSurface9;   // D3D9_REPLACE
+
 namespace rx
 {
 class RenderTarget
@@ -29,7 +31,7 @@
     GLenum getActualFormat() { return mActualFormat; }
     GLsizei getSamples() { return mSamples; }
 
-    virtual IDirect3DSurface9 *getSurface() = 0; // D3D9_REPLACE - temporary pass-through function
+    virtual IDirect3DSurface9 *getSurface() = 0;   // D3D9_REPLACE - temporary pass-through function
 
     struct Desc {
         GLsizei width;
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp
index ab8f510..8bf6d17 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -13,6 +13,7 @@
 #include "libGLESv2/Framebuffer.h"
 #include "libGLESv2/renderer/Renderer9.h"
 #include "libGLESv2/renderer/renderer9_utils.h"
+#include "libGLESv2/renderer/SwapChain9.h"
 #include "libGLESv2/renderer/TextureStorage.h"
 #include "libGLESv2/renderer/Image.h"
 #include "libGLESv2/renderer/Blit.h"
@@ -504,7 +505,7 @@
 
 SwapChain *Renderer9::createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
 {
-    return new rx::SwapChain(this, window, shareHandle, backBufferFormat, depthBufferFormat);
+    return new rx::SwapChain9(this, window, shareHandle, backBufferFormat, depthBufferFormat);
 }
 
 // D3D9_REPLACE
diff --git a/src/libGLESv2/renderer/SwapChain.h b/src/libGLESv2/renderer/SwapChain.h
index acc4fbe..6e54ff3 100644
--- a/src/libGLESv2/renderer/SwapChain.h
+++ b/src/libGLESv2/renderer/SwapChain.h
@@ -16,47 +16,30 @@
 #define EGLAPI
 #include <EGL/egl.h>
 
-#include <d3d9.h>  // D3D9_REPLACE
-
 #include "common/angleutils.h"
 
 namespace rx
 {
-class Renderer9;   // D3D9_REPLACE
 
 class SwapChain
 {
   public:
-    SwapChain(Renderer9 *renderer, HWND window, HANDLE shareHandle,
-              GLenum backBufferFormat, GLenum depthBufferFormat);
-    virtual ~SwapChain();
+    SwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
+        : mWindow(window), mShareHandle(shareHandle), mBackBufferFormat(backBufferFormat), mDepthBufferFormat(depthBufferFormat)
+    {
+    }
 
-    virtual EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval);
-    virtual EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height);
+    virtual ~SwapChain() {};
 
-    virtual IDirect3DSurface9 *getRenderTarget();
-    virtual IDirect3DSurface9 *getDepthStencil();
-    virtual IDirect3DTexture9 *getOffscreenTexture();
+    virtual EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval) = 0;
+    virtual EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height) = 0;
 
-    HANDLE getShareHandle() { return mShareHandle; }
+    virtual HANDLE getShareHandle() {return mShareHandle;};
 
-  private:
-    DISALLOW_COPY_AND_ASSIGN(SwapChain);
-
-    void release();
-
-    Renderer9 *mRenderer;   // D3D9_REPLACE
-    EGLint mHeight;
-    EGLint mWidth;
-
+  protected:
     const HWND mWindow;            // Window that the surface is created for.
     const GLenum mBackBufferFormat;
     const GLenum mDepthBufferFormat;
-    IDirect3DSwapChain9 *mSwapChain;
-    IDirect3DSurface9 *mBackBuffer;
-    IDirect3DSurface9 *mDepthStencil;
-    IDirect3DSurface9* mRenderTarget;
-    IDirect3DTexture9* mOffscreenTexture;
 
     HANDLE mShareHandle;
 };
diff --git a/src/libGLESv2/renderer/SwapChain.cpp b/src/libGLESv2/renderer/SwapChain9.cpp
similarity index 91%
rename from src/libGLESv2/renderer/SwapChain.cpp
rename to src/libGLESv2/renderer/SwapChain9.cpp
index 62e76ba..8d3ad0c 100644
--- a/src/libGLESv2/renderer/SwapChain.cpp
+++ b/src/libGLESv2/renderer/SwapChain9.cpp
@@ -4,25 +4,24 @@
 // found in the LICENSE file.
 //
 
-// SwapChain.cpp: Implements a back-end specific class that hides the details of the
-// implementation-specific swapchain.
+// SwapChain9.cpp: Implements a back-end specific class for the D3D9 swap chain.
 
-#include "libGLESv2/renderer/SwapChain.h"
+#include "libGLESv2/renderer/SwapChain9.h"
 
 #include "common/debug.h"
 #include "libGLESv2/utilities.h"
-#include "libGLESv2/renderer/renderer9_utils.h" // D3D9_REPLACE
-#include "libGLESv2/renderer/Renderer9.h"   // D3D9_REPLACE
+#include "libGLESv2/renderer/renderer9_utils.h"
+#include "libGLESv2/renderer/Renderer9.h"
+#include "libGLESv2/renderer/RenderTarget9.h"
 #include "libGLESv2/Context.h"
 #include "libGLESv2/main.h"
 
 namespace rx
 {
 
-SwapChain::SwapChain(Renderer9 *renderer, HWND window, HANDLE shareHandle,
-                     GLenum backBufferFormat, GLenum depthBufferFormat)
-    : mRenderer(renderer), mWindow(window), mShareHandle(shareHandle),
-      mBackBufferFormat(backBufferFormat), mDepthBufferFormat(depthBufferFormat)
+SwapChain9::SwapChain9(Renderer9 *renderer, HWND window, HANDLE shareHandle,
+                       GLenum backBufferFormat, GLenum depthBufferFormat)
+    : mRenderer(renderer), SwapChain(window, shareHandle, backBufferFormat, depthBufferFormat)
 {
     mSwapChain = NULL;
     mBackBuffer = NULL;
@@ -33,12 +32,12 @@
     mHeight = -1;
 }
 
-SwapChain::~SwapChain()
+SwapChain9::~SwapChain9()
 {
     release();
 }
 
-void SwapChain::release()
+void SwapChain9::release()
 {
     if (mSwapChain)
     {
@@ -89,8 +88,7 @@
     return D3DPRESENT_INTERVAL_DEFAULT;
 }
 
-// D3D9_REPLACE
-EGLint SwapChain::reset(int backbufferWidth, int backbufferHeight, EGLint swapInterval)
+EGLint SwapChain9::reset(int backbufferWidth, int backbufferHeight, EGLint swapInterval)
 {
     IDirect3DDevice9 *device = mRenderer->getDevice();
 
@@ -252,7 +250,7 @@
             ERR("Could not create depthstencil surface for new swap chain: 0x%08X", result);
             release();
 
-            if(isDeviceLostError(result))
+            if (isDeviceLostError(result))
             {
                 return EGL_CONTEXT_LOST;
             }
@@ -270,7 +268,7 @@
 }
 
 // parameters should be validated/clamped by caller
-EGLint SwapChain::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
+EGLint SwapChain9::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
 {
     if (!mSwapChain)
     {
@@ -361,7 +359,7 @@
 
 // Increments refcount on surface.
 // caller must Release() the returned surface
-IDirect3DSurface9 *SwapChain::getRenderTarget()
+IDirect3DSurface9 *SwapChain9::getRenderTarget()
 {
     if (mRenderTarget)
     {
@@ -373,7 +371,7 @@
 
 // Increments refcount on surface.
 // caller must Release() the returned surface
-IDirect3DSurface9 *SwapChain::getDepthStencil()
+IDirect3DSurface9 *SwapChain9::getDepthStencil()
 {
     if (mDepthStencil)
     {
@@ -385,7 +383,7 @@
 
 // Increments refcount on texture.
 // caller must Release() the returned texture
-IDirect3DTexture9 *SwapChain::getOffscreenTexture()
+IDirect3DTexture9 *SwapChain9::getOffscreenTexture()
 {
     if (mOffscreenTexture)
     {
diff --git a/src/libGLESv2/renderer/SwapChain9.h b/src/libGLESv2/renderer/SwapChain9.h
new file mode 100644
index 0000000..5d1f2c4
--- /dev/null
+++ b/src/libGLESv2/renderer/SwapChain9.h
@@ -0,0 +1,52 @@
+//

+// 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 <d3d9.h>

+

+#include "common/angleutils.h"

+#include "libGLESv2/renderer/SwapChain.h"

+

+namespace rx

+{

+class Renderer9;

+

+class SwapChain9 : public SwapChain

+{

+  public:

+    SwapChain9(Renderer9 *renderer, HWND window, HANDLE shareHandle,

+               GLenum backBufferFormat, GLenum depthBufferFormat);

+    virtual ~SwapChain9();

+

+    virtual EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval);

+    virtual EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height);

+

+    virtual IDirect3DSurface9 *getRenderTarget();

+    virtual IDirect3DSurface9 *getDepthStencil();

+    virtual IDirect3DTexture9 *getOffscreenTexture();

+

+  private:

+    DISALLOW_COPY_AND_ASSIGN(SwapChain9);

+

+    void release();

+

+    Renderer9 *mRenderer;

+    EGLint mHeight;

+    EGLint mWidth;

+

+    IDirect3DSwapChain9 *mSwapChain;

+    IDirect3DSurface9 *mBackBuffer;

+    IDirect3DSurface9 *mRenderTarget;

+    IDirect3DSurface9 *mDepthStencil;

+    IDirect3DTexture9* mOffscreenTexture;

+};

+

+}

+#endif // LIBGLESV2_RENDERER_SWAPCHAIN9_H_

diff --git a/src/libGLESv2/renderer/TextureStorage.cpp b/src/libGLESv2/renderer/TextureStorage.cpp
index 2c1e8a7..cc969f6 100644
--- a/src/libGLESv2/renderer/TextureStorage.cpp
+++ b/src/libGLESv2/renderer/TextureStorage.cpp
@@ -10,7 +10,7 @@
 
 #include "libGLESv2/main.h"
 #include "libGLESv2/renderer/TextureStorage.h"
-#include "libGLESv2/renderer/SwapChain.h"
+#include "libGLESv2/renderer/SwapChain9.h"
 #include "libGLESv2/renderer/Blit.h"
 
 #include "libGLESv2/renderer/renderer9_utils.h"
@@ -115,7 +115,7 @@
     return getBaseTexture() ? getBaseTexture()->GetLevelCount() - getLodOffset() : 0;
 }
 
-TextureStorage2D::TextureStorage2D(Renderer9 *renderer, rx::SwapChain *swapchain) : TextureStorage(renderer, D3DUSAGE_RENDERTARGET), mRenderTargetSerial(gl::RenderbufferStorage::issueSerial())
+TextureStorage2D::TextureStorage2D(Renderer9 *renderer, rx::SwapChain9 *swapchain) : TextureStorage(renderer, D3DUSAGE_RENDERTARGET), mRenderTargetSerial(gl::RenderbufferStorage::issueSerial())
 {
     IDirect3DTexture9 *surfaceTexture = swapchain->getOffscreenTexture();
     mTexture = surfaceTexture;
diff --git a/src/libGLESv2/renderer/TextureStorage.h b/src/libGLESv2/renderer/TextureStorage.h
index 440bac9..3266a1e 100644
--- a/src/libGLESv2/renderer/TextureStorage.h
+++ b/src/libGLESv2/renderer/TextureStorage.h
@@ -20,7 +20,7 @@
 namespace rx
 {
 class Renderer9;
-class SwapChain;
+class SwapChain9;
 class Blit;
 
 class TextureStorage
@@ -62,7 +62,7 @@
 class TextureStorage2D : public TextureStorage
 {
   public:
-    explicit TextureStorage2D(rx::Renderer9 *renderer, rx::SwapChain *swapchain);
+    explicit TextureStorage2D(rx::Renderer9 *renderer, rx::SwapChain9 *swapchain);
     TextureStorage2D(rx::Renderer9 *renderer, int levels, GLenum internalformat, GLenum usage, bool forceRenderable, GLsizei width, GLsizei height);
 
     virtual ~TextureStorage2D();