Add renderer::SwapChain class and move functionality from egl::Surface

Trac #21810 Signed-off-by: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1351 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 3281f97d
...@@ -255,6 +255,8 @@ ...@@ -255,6 +255,8 @@
'libGLESv2/renderer/Renderer.cpp', 'libGLESv2/renderer/Renderer.cpp',
'libGLESv2/renderer/Renderer.h', 'libGLESv2/renderer/Renderer.h',
'libGLESv2/renderer/ShaderCache.h', 'libGLESv2/renderer/ShaderCache.h',
'libGLESv2/renderer/SwapChain.cpp',
'libGLESv2/renderer/SwapChain.h',
'libGLESv2/ResourceManager.cpp', 'libGLESv2/ResourceManager.cpp',
'libGLESv2/ResourceManager.h', 'libGLESv2/ResourceManager.h',
'libGLESv2/Shader.cpp', 'libGLESv2/Shader.cpp',
......
// //
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// //
...@@ -8,12 +8,11 @@ ...@@ -8,12 +8,11 @@
// such as the client area of a window, including any back buffers. // such as the client area of a window, including any back buffers.
// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3. // Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
#ifndef INCLUDE_SURFACE_H_ #ifndef LIBEGL_SURFACE_H_
#define INCLUDE_SURFACE_H_ #define LIBEGL_SURFACE_H_
#define EGLAPI #define EGLAPI
#include <EGL/egl.h> #include <EGL/egl.h>
#include <d3d9.h>
#include "common/angleutils.h" #include "common/angleutils.h"
...@@ -21,6 +20,10 @@ namespace gl ...@@ -21,6 +20,10 @@ namespace gl
{ {
class Texture2D; class Texture2D;
} }
namespace renderer
{
class SwapChain;
}
namespace egl namespace egl
{ {
...@@ -48,11 +51,7 @@ class Surface ...@@ -48,11 +51,7 @@ class Surface
virtual EGLint isPostSubBufferSupported() const; virtual EGLint isPostSubBufferSupported() const;
virtual IDirect3DSurface9 *getRenderTarget(); virtual renderer::SwapChain *getSwapChain() const;
virtual IDirect3DSurface9 *getDepthStencil();
virtual IDirect3DTexture9 *getOffscreenTexture();
HANDLE getShareHandle() { return mShareHandle; }
void setSwapInterval(EGLint interval); void setSwapInterval(EGLint interval);
bool checkForOutOfDateSwapChain(); // Returns true if swapchain changed due to resize or interval update bool checkForOutOfDateSwapChain(); // Returns true if swapchain changed due to resize or interval update
...@@ -68,19 +67,14 @@ private: ...@@ -68,19 +67,14 @@ private:
DISALLOW_COPY_AND_ASSIGN(Surface); DISALLOW_COPY_AND_ASSIGN(Surface);
Display *const mDisplay; Display *const mDisplay;
IDirect3DSwapChain9 *mSwapChain;
IDirect3DSurface9 *mBackBuffer;
IDirect3DSurface9 *mDepthStencil;
IDirect3DSurface9* mRenderTarget;
IDirect3DTexture9* mOffscreenTexture;
HANDLE mShareHandle; HANDLE mShareHandle;
renderer::SwapChain *mSwapChain;
void subclassWindow(); void subclassWindow();
void unsubclassWindow(); void unsubclassWindow();
bool resetSwapChain(int backbufferWidth, int backbufferHeight); bool resetSwapChain(int backbufferWidth, int backbufferHeight);
bool swapRect(EGLint x, EGLint y, EGLint width, EGLint height); bool swapRect(EGLint x, EGLint y, EGLint width, EGLint height);
static DWORD convertInterval(EGLint interval);
const HWND mWindow; // Window that the surface is created for. const HWND mWindow; // Window that the surface is created for.
bool mWindowSubclassed; // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking bool mWindowSubclassed; // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking
...@@ -103,10 +97,9 @@ private: ...@@ -103,10 +97,9 @@ private:
EGLint mSwapInterval; EGLint mSwapInterval;
EGLint mPostSubBufferSupported; EGLint mPostSubBufferSupported;
DWORD mPresentInterval; bool mSwapIntervalDirty;
bool mPresentIntervalDirty;
gl::Texture2D *mTexture; gl::Texture2D *mTexture;
}; };
} }
#endif // INCLUDE_SURFACE_H_ #endif // LIBEGL_SURFACE_H_
...@@ -504,7 +504,10 @@ EGLBoolean __stdcall eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surf ...@@ -504,7 +504,10 @@ EGLBoolean __stdcall eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surf
switch (attribute) switch (attribute)
{ {
case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE: case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
*value = (void*) eglSurface->getShareHandle(); {
renderer::SwapChain *swapchain = eglSurface->getSwapChain();
*value = (void*) (swapchain ? swapchain->getShareHandle() : NULL);
}
break; break;
default: default:
return error(EGL_BAD_ATTRIBUTE, EGL_FALSE); return error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
......
...@@ -317,8 +317,10 @@ void Context::makeCurrent(egl::Display *display, egl::Surface *surface) ...@@ -317,8 +317,10 @@ void Context::makeCurrent(egl::Display *display, egl::Surface *surface)
} }
// Wrap the existing Direct3D 9 resources into GL objects and assign them to the '0' names // Wrap the existing Direct3D 9 resources into GL objects and assign them to the '0' names
IDirect3DSurface9 *defaultRenderTarget = surface->getRenderTarget(); // D3D9_REPLACE
IDirect3DSurface9 *depthStencil = surface->getDepthStencil(); renderer::SwapChain *swapchain = surface->getSwapChain();
IDirect3DSurface9 *defaultRenderTarget = swapchain->getRenderTarget();
IDirect3DSurface9 *depthStencil = swapchain->getDepthStencil();
Colorbuffer *colorbufferZero = new Colorbuffer(defaultRenderTarget); Colorbuffer *colorbufferZero = new Colorbuffer(defaultRenderTarget);
DepthStencilbuffer *depthStencilbufferZero = new DepthStencilbuffer(depthStencil); DepthStencilbuffer *depthStencilbufferZero = new DepthStencilbuffer(depthStencil);
...@@ -4429,4 +4431,16 @@ void glDestroyRenderer(renderer::Renderer *renderer) ...@@ -4429,4 +4431,16 @@ void glDestroyRenderer(renderer::Renderer *renderer)
delete renderer; delete renderer;
} }
renderer::SwapChain *glCreateSwapChain(renderer::Renderer *renderer, HWND window, HANDLE shareHandle,
GLenum backBufferFormat, GLenum depthBufferFormat)
{
return new renderer::SwapChain(renderer, window, shareHandle, backBufferFormat, depthBufferFormat);
}
void glDestroySwapChain(renderer::SwapChain *swapChain)
{
delete swapChain;
}
} }
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "libGLESv2/ResourceManager.h" #include "libGLESv2/ResourceManager.h"
#include "libGLESv2/HandleAllocator.h" #include "libGLESv2/HandleAllocator.h"
#include "libGLESv2/renderer/Renderer.h" #include "libGLESv2/renderer/Renderer.h"
#include "libGLESv2/renderer/SwapChain.h"
namespace egl namespace egl
{ {
...@@ -670,6 +671,9 @@ void glMakeCurrent(gl::Context *context, egl::Display *display, egl::Surface *su ...@@ -670,6 +671,9 @@ void glMakeCurrent(gl::Context *context, egl::Display *display, egl::Surface *su
gl::Context *glGetCurrentContext(); gl::Context *glGetCurrentContext();
renderer::Renderer *glCreateRenderer(egl::Display *display, HMODULE hModule, HDC hDc); renderer::Renderer *glCreateRenderer(egl::Display *display, HMODULE hModule, HDC hDc);
void glDestroyRenderer(renderer::Renderer *renderer); void glDestroyRenderer(renderer::Renderer *renderer);
renderer::SwapChain *glCreateSwapChain(renderer::Renderer *renderer, HWND window, HANDLE shareHandle,
GLenum backBufferFormat, GLenum depthBufferFormat);
void glDestroySwapChain(renderer::SwapChain *swapChain);
__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname); __eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname);
bool __stdcall glBindTexImage(egl::Surface *surface); bool __stdcall glBindTexImage(egl::Surface *surface);
......
...@@ -1840,7 +1840,8 @@ void Texture2D::bindTexImage(egl::Surface *surface) ...@@ -1840,7 +1840,8 @@ void Texture2D::bindTexImage(egl::Surface *surface)
mImageArray[0].redefine(internalformat, surface->getWidth(), surface->getHeight(), true); mImageArray[0].redefine(internalformat, surface->getWidth(), surface->getHeight(), true);
delete mTexStorage; delete mTexStorage;
mTexStorage = new TextureStorage2D(surface->getOffscreenTexture()); renderer::SwapChain *swapchain = surface->getSwapChain(); // D3D9_REPLACE
mTexStorage = new TextureStorage2D(swapchain->getOffscreenTexture());
mDirtyImages = true; mDirtyImages = true;
mSurface = surface; mSurface = surface;
......
...@@ -182,3 +182,5 @@ EXPORTS ...@@ -182,3 +182,5 @@ EXPORTS
glBindTexImage @158 NONAME glBindTexImage @158 NONAME
glCreateRenderer @177 NONAME glCreateRenderer @177 NONAME
glDestroyRenderer @178 NONAME glDestroyRenderer @178 NONAME
glCreateSwapChain @179 NONAME
glDestroySwapChain @180 NONAME
...@@ -246,6 +246,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\" ...@@ -246,6 +246,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\"
<ClCompile Include="..\common\RefCountObject.cpp" /> <ClCompile Include="..\common\RefCountObject.cpp" />
<ClCompile Include="Renderbuffer.cpp" /> <ClCompile Include="Renderbuffer.cpp" />
<ClCompile Include="renderer\Renderer.cpp" /> <ClCompile Include="renderer\Renderer.cpp" />
<ClCompile Include="renderer\SwapChain.cpp" />
<ClCompile Include="ResourceManager.cpp" /> <ClCompile Include="ResourceManager.cpp" />
<ClCompile Include="Shader.cpp" /> <ClCompile Include="Shader.cpp" />
<ClCompile Include="Texture.cpp" /> <ClCompile Include="Texture.cpp" />
...@@ -276,6 +277,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\" ...@@ -276,6 +277,7 @@ copy "$(OutDir)libGLESv2.lib" "$(ProjectDir)..\..\lib\$(Configuration)\"
<ClInclude Include="Renderbuffer.h" /> <ClInclude Include="Renderbuffer.h" />
<ClInclude Include="renderer\Renderer.h" /> <ClInclude Include="renderer\Renderer.h" />
<ClInclude Include="renderer\ShaderCache.h" /> <ClInclude Include="renderer\ShaderCache.h" />
<ClInclude Include="renderer\SwapChain.h" />
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />
<ClInclude Include="ResourceManager.h" /> <ClInclude Include="ResourceManager.h" />
<ClInclude Include="Shader.h" /> <ClInclude Include="Shader.h" />
......
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter> </Filter>
<Filter Include="Renderer">
<UniqueIdentifier>{93a76964-77a3-4b20-a6f5-e14e762d4e14}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Blit.cpp"> <ClCompile Include="Blit.cpp">
...@@ -81,7 +84,10 @@ ...@@ -81,7 +84,10 @@
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="renderer\Renderer.cpp"> <ClCompile Include="renderer\Renderer.cpp">
<Filter>Source Files</Filter> <Filter>Renderer</Filter>
</ClCompile>
<ClCompile Include="renderer\SwapChain.cpp">
<Filter>Renderer</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
...@@ -166,11 +172,17 @@ ...@@ -166,11 +172,17 @@
<ClInclude Include="VertexDataManager.h"> <ClInclude Include="VertexDataManager.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="renderer\Renderer.h"> <ClInclude Include="EnumTypes.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="renderer\ShaderCache.h"> <ClInclude Include="renderer\ShaderCache.h">
<Filter>Header Files</Filter> <Filter>Renderer</Filter>
</ClInclude>
<ClInclude Include="renderer\Renderer.h">
<Filter>Renderer</Filter>
</ClInclude>
<ClInclude Include="renderer\SwapChain.h">
<Filter>Renderer</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
......
//
// 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.
//
// SwapChain.h: Defines a back-end specific class that hides the details of the
// implementation-specific swapchain.
#ifndef LIBGLESV2_RENDERER_SWAPCHAIN_H_
#define LIBGLESV2_RENDERER_SWAPCHAIN_H_
#define GL_APICALL
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#define EGLAPI
#include <EGL/egl.h>
#include "common/angleutils.h"
#include <d3d9.h> // D3D9_REPLACE
namespace renderer
{
class Renderer;
class SwapChain
{
public:
SwapChain(Renderer *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; }
private:
DISALLOW_COPY_AND_ASSIGN(SwapChain);
void release();
Renderer *mRenderer;
EGLint mHeight;
EGLint mWidth;
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;
};
}
#endif // LIBGLESV2_RENDERER_SWAPCHAIN_H_
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