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
parent 6c872174
......@@ -272,6 +272,8 @@
'libGLESv2/renderer/ShaderCache.h',
'libGLESv2/renderer/SwapChain.cpp',
'libGLESv2/renderer/SwapChain.h',
'libGLESv2/renderer/SwapChain9.cpp',
'libGLESv2/renderer/SwapChain9.h',
'libGLESv2/renderer/TextureStorage.cpp',
'libGLESv2/renderer/TextureStorage.h',
'libGLESv2/renderer/RenderStateCache.cpp',
......
......@@ -15,6 +15,7 @@
#include "libGLESv2/utilities.h"
#include "libGLESv2/renderer/RenderTarget9.h" // D3D9_REPLACE
#include "libGLESv2/renderer/SwapChain9.h" // D3D9_REPLACE
#include "libGLESv2/renderer/renderer9_utils.h" // D3D9_REPLACE
namespace gl
......@@ -384,7 +385,8 @@ unsigned int RenderbufferStorage::issueCubeSerials()
Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
{
mRenderTarget = new rx::RenderTarget9(renderer, swapChain->getRenderTarget());
rx::SwapChain9 *swapChain9 = static_cast<rx::SwapChain9*>(swapChain);
mRenderTarget = new rx::RenderTarget9(renderer, swapChain9->getRenderTarget());
if (mRenderTarget)
{
mWidth = mRenderTarget->getWidth();
......@@ -432,7 +434,8 @@ IDirect3DSurface9 *Colorbuffer::getRenderTarget()
DepthStencilbuffer::DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
{
mDepthStencil = new rx::RenderTarget9(renderer, swapChain->getDepthStencil());
rx::SwapChain9 *swapChain9 = static_cast<rx::SwapChain9*>(swapChain);
mDepthStencil = new rx::RenderTarget9(renderer, swapChain9->getDepthStencil());
if (mDepthStencil)
{
mWidth = mDepthStencil->getWidth();
......
......@@ -20,6 +20,7 @@
#include "libGLESv2/mathutil.h"
#include "libGLESv2/utilities.h"
#include "libGLESv2/renderer/Blit.h"
#include "libGLESv2/renderer/SwapChain9.h"
#include "libGLESv2/Framebuffer.h"
namespace gl
......@@ -441,7 +442,7 @@ void Texture2D::bindTexImage(egl::Surface *surface)
mImageArray[0].redefine(renderer9, internalformat, surface->getWidth(), surface->getHeight(), true);
delete mTexStorage;
rx::SwapChain *swapchain = surface->getSwapChain(); // D3D9_REPLACE
rx::SwapChain9 *swapchain = static_cast<rx::SwapChain9*>(surface->getSwapChain()); // D3D9_REPLACE
mTexStorage = new rx::TextureStorage2D(renderer9, swapchain);
mDirtyImages = true;
......
......@@ -251,10 +251,10 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\"
<ClCompile Include="renderer\renderer11_utils.cpp" />
<ClCompile Include="renderer\Renderer9.cpp" />
<ClCompile Include="renderer\Image.cpp" />
<ClCompile Include="renderer\renderer9_utils.cpp" />
<ClCompile Include="renderer\RenderTarget9.cpp" />
<ClCompile Include="renderer\RenderStateCache.cpp" />
<ClCompile Include="renderer\SwapChain.cpp" />
<ClCompile Include="renderer\renderer9_utils.cpp" />
<ClCompile Include="renderer\RenderTarget9.cpp" />
<ClCompile Include="renderer\RenderStateCache.cpp" />
<ClCompile Include="renderer\SwapChain9.cpp" />
<ClCompile Include="renderer\TextureStorage.cpp" />
<ClCompile Include="ResourceManager.cpp" />
<ClCompile Include="Shader.cpp" />
......@@ -290,12 +290,13 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\"
<ClInclude Include="renderer\Renderer11.h" />
<ClInclude Include="renderer\renderer11_utils.h" />
<ClInclude Include="renderer\Renderer9.h" />
<ClInclude Include="renderer\renderer9_utils.h" />
<ClInclude Include="renderer\renderer9_utils.h" />
<ClInclude Include="renderer\RenderTarget.h" />
<ClInclude Include="renderer\RenderTarget9.h" />
<ClInclude Include="renderer\RenderStateCache.h" />
<ClInclude Include="renderer\RenderTarget9.h" />
<ClInclude Include="renderer\RenderStateCache.h" />
<ClInclude Include="renderer\ShaderCache.h" />
<ClInclude Include="renderer\SwapChain.h" />
<ClInclude Include="renderer\SwapChain9.h" />
<ClInclude Include="renderer\TextureStorage.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="ResourceManager.h" />
......
......@@ -86,9 +86,6 @@
<ClCompile Include="VertexDataManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="renderer\SwapChain.cpp">
<Filter>Renderer</Filter>
</ClCompile>
<ClCompile Include="renderer\Renderer9.cpp">
<Filter>Renderer</Filter>
</ClCompile>
......@@ -111,16 +108,19 @@
<Filter>Renderer</Filter>
</ClCompile>
<ClCompile Include="renderer\Blit.cpp">
<Filter>Renderer</Filter>
</ClCompile>
<Filter>Renderer</Filter>
</ClCompile>
<ClCompile Include="renderer\SwapChain9.cpp">
<Filter>Renderer</Filter>
</ClCompile>
<ClCompile Include="renderer\RenderTarget9.cpp">
<Filter>Renderer</Filter>
<Filter>Renderer</Filter>
</ClCompile>
<ClCompile Include="renderer\RenderStateCache.cpp">
<Filter>Renderer</Filter>
</ClCompile>
</ClCompile>
<ClCompile Include="..\third_party\murmurhash\MurmurHash3.cpp">
<Filter>Third Party\MurmurHash</Filter>
<Filter>Third Party\MurmurHash</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
......@@ -234,18 +234,21 @@
</ClInclude>
<ClInclude Include="angletypes.h">
<Filter>Header Files</Filter>
</ClInclude>
</ClInclude>
<ClInclude Include="renderer\SwapChain9.h">
<Filter>Renderer</Filter>
</ClInclude>
<ClInclude Include="renderer\RenderTarget.h">
<Filter>Renderer</Filter>
</ClInclude>
</ClInclude>
<ClInclude Include="renderer\RenderTarget9.h">
<Filter>Renderer</Filter>
</ClInclude>
</ClInclude>
<ClInclude Include="renderer\RenderStateCache.h">
<Filter>Renderer</Filter>
</ClInclude>
</ClInclude>
<ClInclude Include="..\third_party\murmurhash\MurmurHash3.h">
<Filter>Third Party\MurmurHash</Filter>
<Filter>Third Party\MurmurHash</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
......@@ -256,4 +259,4 @@
<ItemGroup>
<ResourceCompile Include="libGLESv2.rc" />
</ItemGroup>
</Project>
</Project>
\ No newline at end of file
......@@ -15,6 +15,8 @@
#include "common/angleutils.h"
struct IDirect3DSurface9; // D3D9_REPLACE
namespace rx
{
class RenderTarget
......@@ -29,7 +31,7 @@ class RenderTarget
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;
......
......@@ -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 @@ void Renderer9::sync(bool block)
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
......
......@@ -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();
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();
HANDLE getShareHandle() { return mShareHandle; }
SwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
: mWindow(window), mShareHandle(shareHandle), mBackBufferFormat(backBufferFormat), mDepthBufferFormat(depthBufferFormat)
{
}
private:
DISALLOW_COPY_AND_ASSIGN(SwapChain);
virtual ~SwapChain() {};
void release();
virtual EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval) = 0;
virtual EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height) = 0;
Renderer9 *mRenderer; // D3D9_REPLACE
EGLint mHeight;
EGLint mWidth;
virtual HANDLE getShareHandle() {return mShareHandle;};
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;
};
......
......@@ -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 @@ SwapChain::SwapChain(Renderer9 *renderer, HWND window, HANDLE shareHandle,
mHeight = -1;
}
SwapChain::~SwapChain()
SwapChain9::~SwapChain9()
{
release();
}
void SwapChain::release()
void SwapChain9::release()
{
if (mSwapChain)
{
......@@ -89,8 +88,7 @@ static DWORD convertInterval(EGLint interval)
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 @@ EGLint SwapChain::reset(int backbufferWidth, int backbufferHeight, EGLint swapIn
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 @@ EGLint SwapChain::reset(int backbufferWidth, int backbufferHeight, EGLint swapIn
}
// 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 @@ EGLint SwapChain::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *SwapChain::getRenderTarget()
IDirect3DSurface9 *SwapChain9::getRenderTarget()
{
if (mRenderTarget)
{
......@@ -373,7 +371,7 @@ IDirect3DSurface9 *SwapChain::getRenderTarget()
// Increments refcount on surface.
// caller must Release() the returned surface
IDirect3DSurface9 *SwapChain::getDepthStencil()
IDirect3DSurface9 *SwapChain9::getDepthStencil()
{
if (mDepthStencil)
{
......@@ -385,7 +383,7 @@ IDirect3DSurface9 *SwapChain::getDepthStencil()
// Increments refcount on texture.
// caller must Release() the returned texture
IDirect3DTexture9 *SwapChain::getOffscreenTexture()
IDirect3DTexture9 *SwapChain9::getOffscreenTexture()
{
if (mOffscreenTexture)
{
......
//
// 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_
......@@ -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 @@ int TextureStorage::levelCount()
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;
......
......@@ -20,7 +20,7 @@
namespace rx
{
class Renderer9;
class SwapChain;
class SwapChain9;
class Blit;
class TextureStorage
......@@ -62,7 +62,7 @@ class TextureStorage
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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment