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();