summaryrefslogtreecommitdiffstats
path: root/src/angle/patches/0009-ANGLE-Support-WinRT.patch
diff options
context:
space:
mode:
Diffstat (limited to 'src/angle/patches/0009-ANGLE-Support-WinRT.patch')
-rw-r--r--src/angle/patches/0009-ANGLE-Support-WinRT.patch1766
1 files changed, 946 insertions, 820 deletions
diff --git a/src/angle/patches/0009-ANGLE-Support-WinRT.patch b/src/angle/patches/0009-ANGLE-Support-WinRT.patch
index 92909d37d8..5630f7f9ce 100644
--- a/src/angle/patches/0009-ANGLE-Support-WinRT.patch
+++ b/src/angle/patches/0009-ANGLE-Support-WinRT.patch
@@ -1,7 +1,7 @@
-From 46b8b123ada1787c68525cd07dcdbfdbc003bcc5 Mon Sep 17 00:00:00 2001
+From be5e9dcf8a4cb23368b30f743082630bdccc7376 Mon Sep 17 00:00:00 2001
From: Andrew Knight <andrew.knight@digia.com>
-Date: Thu, 20 Feb 2014 16:49:13 +0200
-Subject: [PATCH] ANGLE: Support WinRT
+Date: Tue, 5 Aug 2014 09:31:32 +0300
+Subject: [PATCH 09/12] ANGLE: Support WinRT
This enables EGL for WinRT's native types, and adjusts some codepaths
to accommodate differences between desktop Windows and WinRT.
@@ -15,36 +15,32 @@ to accommodate differences between desktop Windows and WinRT.
Change-Id: Ia90377e700d335a1c569c2145008dd4b0dfd84d3
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
---
- src/3rdparty/angle/include/EGL/eglplatform.h | 10 ++-
- .../angle/src/compiler/translator/osinclude.h | 20 +++---
- .../src/compiler/translator/ossource_posix.cpp | 8 +++
- .../angle/src/compiler/translator/ossource_win.cpp | 8 +++
- .../src/compiler/translator/ossource_winrt.cpp | 75 ++++++++++++++++++++++
- src/3rdparty/angle/src/libEGL/Display.cpp | 11 ++--
- src/3rdparty/angle/src/libEGL/Display.h | 7 +-
- src/3rdparty/angle/src/libEGL/Surface.cpp | 42 +++++++++++-
- src/3rdparty/angle/src/libEGL/Surface.h | 6 +-
- src/3rdparty/angle/src/libEGL/libEGL.cpp | 4 +-
- src/3rdparty/angle/src/libEGL/main.cpp | 29 ++++++++-
- src/3rdparty/angle/src/libGLESv2/Context.cpp | 1 +
- src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp | 1 +
- src/3rdparty/angle/src/libGLESv2/main.cpp | 27 ++++++++
- src/3rdparty/angle/src/libGLESv2/main.h | 2 +-
- src/3rdparty/angle/src/libGLESv2/precompiled.h | 45 ++++++++++++-
- .../angle/src/libGLESv2/renderer/Renderer.cpp | 15 +++--
- .../angle/src/libGLESv2/renderer/Renderer.h | 3 +-
- .../angle/src/libGLESv2/renderer/SwapChain.h | 5 +-
- .../src/libGLESv2/renderer/d3d11/Renderer11.cpp | 13 +++-
- .../src/libGLESv2/renderer/d3d11/Renderer11.h | 5 +-
- .../src/libGLESv2/renderer/d3d11/SwapChain11.cpp | 37 +++++++++--
- .../src/libGLESv2/renderer/d3d11/SwapChain11.h | 2 +-
- .../libGLESv2/renderer/d3d11/shaders/Clear11.hlsl | 4 ++
- src/3rdparty/angle/src/libGLESv2/utilities.cpp | 48 ++++++++++++++
- 25 files changed, 378 insertions(+), 50 deletions(-)
- create mode 100644 src/3rdparty/angle/src/compiler/translator/ossource_winrt.cpp
+ src/3rdparty/angle/include/EGL/eglplatform.h | 10 +-
+ src/3rdparty/angle/src/common/platform.h | 3 +
+ src/3rdparty/angle/src/common/tls.cpp | 37 ++++-
+ src/3rdparty/angle/src/common/tls.h | 6 +-
+ src/3rdparty/angle/src/common/utilities.cpp | 51 +++++-
+ src/3rdparty/angle/src/libEGL/Display.cpp | 13 +-
+ src/3rdparty/angle/src/libEGL/Display.h | 6 +-
+ src/3rdparty/angle/src/libEGL/Surface.cpp | 185 ++++++++++++++++++++-
+ src/3rdparty/angle/src/libEGL/Surface.h | 39 ++++-
+ src/3rdparty/angle/src/libEGL/libEGL.cpp | 8 +-
+ src/3rdparty/angle/src/libEGL/main.cpp | 21 +++
+ src/3rdparty/angle/src/libGLESv2/main.cpp | 20 +++
+ src/3rdparty/angle/src/libGLESv2/main.h | 4 +
+ .../angle/src/libGLESv2/renderer/Renderer.h | 2 +-
+ .../angle/src/libGLESv2/renderer/SwapChain.h | 15 +-
+ .../src/libGLESv2/renderer/d3d/HLSLCompiler.cpp | 12 +-
+ .../libGLESv2/renderer/d3d/d3d11/Renderer11.cpp | 13 +-
+ .../src/libGLESv2/renderer/d3d/d3d11/Renderer11.h | 4 +-
+ .../libGLESv2/renderer/d3d/d3d11/SwapChain11.cpp | 76 +++++++--
+ .../src/libGLESv2/renderer/d3d/d3d11/SwapChain11.h | 6 +-
+ .../src/libGLESv2/renderer/d3d/d3d9/SwapChain9.cpp | 2 +-
+ .../src/libGLESv2/renderer/d3d/d3d9/SwapChain9.h | 2 +-
+ 22 files changed, 486 insertions(+), 49 deletions(-)
diff --git a/src/3rdparty/angle/include/EGL/eglplatform.h b/src/3rdparty/angle/include/EGL/eglplatform.h
-index 34283f2..eb15ae5 100644
+index 3ab8844..ea9f577 100644
--- a/src/3rdparty/angle/include/EGL/eglplatform.h
+++ b/src/3rdparty/angle/include/EGL/eglplatform.h
@@ -67,7 +67,15 @@
@@ -52,11 +48,11 @@ index 34283f2..eb15ae5 100644
*/
-#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */
-+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) /* Windows Runtime */
++#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) /* Windows Runtime */
+
+struct IUnknown;
+
-+typedef int EGLNativeDisplayType;
++typedef IUnknown *EGLNativeDisplayType;
+typedef void *EGLNativePixmapType;
+typedef IUnknown *EGLNativeWindowType;
+
@@ -64,213 +60,213 @@ index 34283f2..eb15ae5 100644
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN 1
#endif
-diff --git a/src/3rdparty/angle/src/compiler/translator/osinclude.h b/src/3rdparty/angle/src/compiler/translator/osinclude.h
-index c3063d6..cccfa63 100644
---- a/src/3rdparty/angle/src/compiler/translator/osinclude.h
-+++ b/src/3rdparty/angle/src/compiler/translator/osinclude.h
-@@ -13,7 +13,11 @@
- //
+diff --git a/src/3rdparty/angle/src/common/platform.h b/src/3rdparty/angle/src/common/platform.h
+index aa0b985..e16e7ac 100644
+--- a/src/3rdparty/angle/src/common/platform.h
++++ b/src/3rdparty/angle/src/common/platform.h
+@@ -11,6 +11,9 @@
#if defined(_WIN32) || defined(_WIN64)
-+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
-+#define ANGLE_OS_WINRT
-+#else
- #define ANGLE_OS_WIN
+ # define ANGLE_PLATFORM_WINDOWS 1
++# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
++# define ANGLE_PLATFORM_WINRT 1
++# endif
+ #elif defined(__APPLE__)
+ # define ANGLE_PLATFORM_APPLE 1
+ # define ANGLE_PLATFORM_POSIX 1
+diff --git a/src/3rdparty/angle/src/common/tls.cpp b/src/3rdparty/angle/src/common/tls.cpp
+index 6b78219..c46fab5 100644
+--- a/src/3rdparty/angle/src/common/tls.cpp
++++ b/src/3rdparty/angle/src/common/tls.cpp
+@@ -10,11 +10,28 @@
+
+ #include <assert.h>
+
++#if defined(ANGLE_PLATFORM_WINRT)
++#include <vector>
++std::vector<void *> *tls = nullptr;
++std::vector<TLSIndex> *freeIndices = nullptr;
+#endif
- #elif defined(__APPLE__) || defined(__linux__) || \
- defined(__FreeBSD__) || defined(__OpenBSD__) || \
- defined(__NetBSD__) || defined(__DragonFly__) || \
-@@ -25,7 +29,7 @@
- #error Unsupported platform.
- #endif
-
--#if defined(ANGLE_OS_WIN)
-+#if defined(ANGLE_OS_WIN) || defined(ANGLE_OS_WINRT)
- #define STRICT
- #define VC_EXTRALEAN 1
- #include <windows.h>
-@@ -44,23 +48,17 @@
- #if defined(ANGLE_OS_WIN)
- typedef DWORD OS_TLSIndex;
- #define OS_INVALID_TLS_INDEX (TLS_OUT_OF_INDEXES)
-+#elif defined(ANGLE_OS_WINRT)
-+typedef size_t OS_TLSIndex;
-+#define OS_INVALID_TLS_INDEX ((DWORD)0xFFFFFF)
- #elif defined(ANGLE_OS_POSIX)
- typedef pthread_key_t OS_TLSIndex;
- #define OS_INVALID_TLS_INDEX (static_cast<OS_TLSIndex>(-1))
- #endif // ANGLE_OS_WIN
-
- OS_TLSIndex OS_AllocTLSIndex();
-+void *OS_GetTLSValue(OS_TLSIndex nIndex);
- bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue);
- bool OS_FreeTLSIndex(OS_TLSIndex nIndex);
-
--inline void* OS_GetTLSValue(OS_TLSIndex nIndex)
--{
-- ASSERT(nIndex != OS_INVALID_TLS_INDEX);
--#if defined(ANGLE_OS_WIN)
-- return TlsGetValue(nIndex);
--#elif defined(ANGLE_OS_POSIX)
-- return pthread_getspecific(nIndex);
--#endif // ANGLE_OS_WIN
--}
--
- #endif // __OSINCLUDE_H
-diff --git a/src/3rdparty/angle/src/compiler/translator/ossource_posix.cpp b/src/3rdparty/angle/src/compiler/translator/ossource_posix.cpp
-index 90a3757..d4bba4c 100644
---- a/src/3rdparty/angle/src/compiler/translator/ossource_posix.cpp
-+++ b/src/3rdparty/angle/src/compiler/translator/ossource_posix.cpp
-@@ -33,6 +33,14 @@ OS_TLSIndex OS_AllocTLSIndex()
- }
-
-
-+void *OS_GetTLSValue(OS_TLSIndex nIndex)
-+{
-+ ASSERT(nIndex != OS_INVALID_TLS_INDEX);
-+
-+ return pthread_getspecific(nIndex);
-+}
-+
+
- bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue)
+ TLSIndex CreateTLSIndex()
{
- if (nIndex == OS_INVALID_TLS_INDEX) {
-diff --git a/src/3rdparty/angle/src/compiler/translator/ossource_win.cpp b/src/3rdparty/angle/src/compiler/translator/ossource_win.cpp
-index 2cc5871..abd8bc7 100644
---- a/src/3rdparty/angle/src/compiler/translator/ossource_win.cpp
-+++ b/src/3rdparty/angle/src/compiler/translator/ossource_win.cpp
-@@ -29,6 +29,14 @@ OS_TLSIndex OS_AllocTLSIndex()
- }
-
+ TLSIndex index;
-+void *OS_GetTLSValue(OS_TLSIndex nIndex)
-+{
-+ ASSERT(nIndex != OS_INVALID_TLS_INDEX);
-+
-+ return TlsGetValue(nIndex);
-+}
-+
-+
- bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue)
- {
- if (nIndex == OS_INVALID_TLS_INDEX) {
-diff --git a/src/3rdparty/angle/src/compiler/translator/ossource_winrt.cpp b/src/3rdparty/angle/src/compiler/translator/ossource_winrt.cpp
-new file mode 100644
-index 0000000..bb061ca
---- /dev/null
-+++ b/src/3rdparty/angle/src/compiler/translator/ossource_winrt.cpp
-@@ -0,0 +1,75 @@
-+//
-+// Copyright (c) 2002-2010 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.
-+//
-+
-+#include "compiler/translator/osinclude.h"
-+//
-+// This file contains contains Windows Runtime specific functions
-+//
-+
-+#if !defined(ANGLE_OS_WINRT)
-+#error Trying to build a WinRT specific file in a non-WinRT build.
-+#endif
-+
-+#include <vector>
-+
-+
-+//
-+// Thread Local Storage Operations
-+//
-+__declspec(thread) std::vector<void *> *tls = nullptr;
-+__declspec(thread) std::vector<OS_TLSIndex> *freeIndices = nullptr;
-+
-+OS_TLSIndex OS_AllocTLSIndex()
-+{
+-#ifdef ANGLE_PLATFORM_WINDOWS
++#if defined(ANGLE_PLATFORM_WINRT)
+ if (!tls)
-+ tls = new std::vector<void*>;
-+
++ tls = new std::vector<void *>;
+ if (freeIndices && !freeIndices->empty()) {
-+ OS_TLSIndex index = freeIndices->back();
++ index = freeIndices->back();
+ freeIndices->pop_back();
+ return index;
+ } else {
+ tls->push_back(nullptr);
+ return tls->size() - 1;
+ }
-+}
-+
-+
-+void *OS_GetTLSValue(OS_TLSIndex nIndex)
-+{
-+ ASSERT(nIndex != OS_INVALID_TLS_INDEX);
-+ ASSERT(tls);
++#elif defined(ANGLE_PLATFORM_WINDOWS)
+ index = TlsAlloc();
+ #elif defined(ANGLE_PLATFORM_POSIX)
+ // Create global pool key
+@@ -36,7 +53,12 @@ bool DestroyTLSIndex(TLSIndex index)
+ return false;
+ }
+
+-#ifdef ANGLE_PLATFORM_WINDOWS
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (!freeIndices)
++ freeIndices = new std::vector<TLSIndex>;
++ freeIndices->push_back(index);
++ return true;
++#elif ANGLE_PLATFORM_WINDOWS
+ return (TlsFree(index) == TRUE);
+ #elif defined(ANGLE_PLATFORM_POSIX)
+ return (pthread_key_delete(index) == 0);
+@@ -51,7 +73,10 @@ bool SetTLSValue(TLSIndex index, void *value)
+ return false;
+ }
+
+-#ifdef ANGLE_PLATFORM_WINDOWS
++#if defined(ANGLE_PLATFORM_WINRT)
++ tls->at(index) = value;
++ return true;
++#elif defined(ANGLE_PLATFORM_WINDOWS)
+ return (TlsSetValue(index, value) == TRUE);
+ #elif defined(ANGLE_PLATFORM_POSIX)
+ return (pthread_setspecific(index, value) == 0);
+@@ -60,13 +85,17 @@ bool SetTLSValue(TLSIndex index, void *value)
+
+ void *GetTLSValue(TLSIndex index)
+ {
++#if !defined(ANGLE_PLATFORM_WINRT) // Valid on WinRT, as Alloc handles the index creation
+ assert(index != TLS_INVALID_INDEX && "GetTLSValue(): Invalid TLS Index");
++#endif
+ if (index == TLS_INVALID_INDEX)
+ {
+ return NULL;
+ }
+
+-#ifdef ANGLE_PLATFORM_WINDOWS
++#if defined(ANGLE_PLATFORM_WINRT)
++ return tls->at(index);
++#elif defined(ANGLE_PLATFORM_WINDOWS)
+ return TlsGetValue(index);
+ #elif defined(ANGLE_PLATFORM_POSIX)
+ return pthread_getspecific(index);
+diff --git a/src/3rdparty/angle/src/common/tls.h b/src/3rdparty/angle/src/common/tls.h
+index 4b25fbc..c40ae1a 100644
+--- a/src/3rdparty/angle/src/common/tls.h
++++ b/src/3rdparty/angle/src/common/tls.h
+@@ -11,7 +11,11 @@
+
+ #include "common/platform.h"
+
+-#ifdef ANGLE_PLATFORM_WINDOWS
++#if defined(ANGLE_PLATFORM_WINRT)
++ typedef size_t TLSIndex;
++# define TLS_OUT_OF_INDEXES (static_cast<TLSIndex>(-1))
++# define TLS_INVALID_INDEX TLS_OUT_OF_INDEXES
++#elif defined(ANGLE_PLATFORM_WINDOWS)
+ typedef DWORD TLSIndex;
+ # define TLS_INVALID_INDEX (TLS_OUT_OF_INDEXES)
+ #elif defined(ANGLE_PLATFORM_POSIX)
+diff --git a/src/3rdparty/angle/src/common/utilities.cpp b/src/3rdparty/angle/src/common/utilities.cpp
+index 405f119..4b8e325 100644
+--- a/src/3rdparty/angle/src/common/utilities.cpp
++++ b/src/3rdparty/angle/src/common/utilities.cpp
+@@ -9,6 +9,14 @@
+ #include "common/utilities.h"
+ #include "common/mathutil.h"
+ #include "common/platform.h"
++#if defined(ANGLE_PLATFORM_WINRT)
++# include <locale>
++# include <codecvt>
++# include <wrl.h>
++# include <windows.storage.h>
++ using namespace Microsoft::WRL;
++ using namespace ABI::Windows::Storage;
++#endif
+
+ #include <set>
+
+@@ -441,7 +449,48 @@ int VariableSortOrder(GLenum type)
+
+ std::string getTempPath()
+ {
+-#ifdef ANGLE_PLATFORM_WINDOWS
++#if defined(ANGLE_PLATFORM_WINRT)
++ static std::string path;
+
-+ return tls->at(nIndex);
-+}
++ while (path.empty())
++ {
++ ComPtr<IApplicationDataStatics> factory;
++ Wrappers::HStringReference classId(RuntimeClass_Windows_Storage_ApplicationData);
++ HRESULT result = RoGetActivationFactory(classId.Get(), IID_PPV_ARGS(&factory));
++ if (FAILED(result))
++ break;
+
++ ComPtr<IApplicationData> applicationData;
++ result = factory->get_Current(&applicationData);
++ if (FAILED(result))
++ break;
+
-+bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue)
-+{
-+ if (!tls || nIndex >= tls->size() || nIndex == OS_INVALID_TLS_INDEX) {
-+ ASSERT(0 && "OS_SetTLSValue(): Invalid TLS Index");
-+ return false;
-+ }
++ ComPtr<IStorageFolder> storageFolder;
++ result = applicationData->get_LocalFolder(&storageFolder);
++ if (FAILED(result))
++ break;
+
-+ tls->at(nIndex) = lpvValue;
-+ return true;
-+}
++ ComPtr<IStorageItem> localFolder;
++ result = storageFolder.As(&localFolder);
++ if (FAILED(result))
++ break;
+
++ HSTRING localFolderPath;
++ result = localFolder->get_Path(&localFolderPath);
++ if (FAILED(result))
++ break;
+
-+bool OS_FreeTLSIndex(OS_TLSIndex nIndex)
-+{
-+ if (!tls || nIndex >= tls->size() || nIndex == OS_INVALID_TLS_INDEX) {
-+ ASSERT(0 && "OS_SetTLSValue(): Invalid TLS Index");
-+ return false;
++ std::wstring_convert< std::codecvt_utf8<wchar_t> > converter;
++ path = converter.to_bytes(WindowsGetStringRawBuffer(localFolderPath, NULL));
++ if (path.empty())
++ {
++ UNREACHABLE();
++ break;
++ }
+ }
+
-+ if (!freeIndices)
-+ freeIndices = new std::vector<OS_TLSIndex>;
-+
-+ freeIndices->push_back(nIndex);
-+
-+ return true;
-+}
++ return path;
++#elif defined(ANGLE_PLATFORM_WINDOWS)
+ char path[MAX_PATH];
+ DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
+ if (pathLen == 0)
diff --git a/src/3rdparty/angle/src/libEGL/Display.cpp b/src/3rdparty/angle/src/libEGL/Display.cpp
-index a7f5f5a..e75a4b6 100644
+index a87bfe8..7cd83c3 100644
--- a/src/3rdparty/angle/src/libEGL/Display.cpp
+++ b/src/3rdparty/angle/src/libEGL/Display.cpp
-@@ -1,3 +1,4 @@
-+#include "../libGLESv2/precompiled.h"
- //
- // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
-@@ -40,13 +41,13 @@ egl::Display *Display::getDisplay(EGLNativeDisplayType displayId)
-
- // FIXME: Check if displayId is a valid display device context
-
-- egl::Display *display = new egl::Display(displayId, (HDC)displayId);
-+ egl::Display *display = new egl::Display(displayId);
-
- displays[displayId] = display;
- return display;
+@@ -57,6 +57,10 @@ Display::Display(EGLNativeDisplayType displayId, EGLint displayType)
+ mRequestedDisplayType(displayType),
+ mRenderer(NULL)
+ {
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (mDisplayId)
++ mDisplayId->AddRef();
++#endif
}
--Display::Display(EGLNativeDisplayType displayId, HDC deviceContext) : mDc(deviceContext)
-+Display::Display(EGLNativeDisplayType displayId)
- {
- mDisplayId = displayId;
- mRenderer = NULL;
-@@ -71,7 +72,7 @@ bool Display::initialize()
- return true;
+ Display::~Display()
+@@ -69,6 +73,11 @@ Display::~Display()
+ {
+ displays->erase(iter);
}
++
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (mDisplayId)
++ mDisplayId->Release();
++#endif
+ }
-- mRenderer = glCreateRenderer(this, mDc, mDisplayId);
-+ mRenderer = glCreateRenderer(this, mDisplayId);
-
- if (!mRenderer)
- {
-@@ -186,7 +187,7 @@ bool Display::getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value)
+ bool Display::initialize()
+@@ -193,7 +202,7 @@ bool Display::getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value)
@@ -279,7 +275,7 @@ index a7f5f5a..e75a4b6 100644
{
const Config *configuration = mConfigSet.get(config);
EGLint postSubBufferSupported = EGL_FALSE;
-@@ -456,7 +457,7 @@ bool Display::isValidSurface(egl::Surface *surface)
+@@ -494,7 +503,7 @@ bool Display::isValidSurface(egl::Surface *surface)
return mSurfaceSet.find(surface) != mSurfaceSet.end();
}
@@ -289,19 +285,19 @@ index a7f5f5a..e75a4b6 100644
for (SurfaceSet::iterator surface = mSurfaceSet.begin(); surface != mSurfaceSet.end(); surface++)
{
diff --git a/src/3rdparty/angle/src/libEGL/Display.h b/src/3rdparty/angle/src/libEGL/Display.h
-index c816e4e..cd07bb3 100644
+index 250878f..73ba767 100644
--- a/src/3rdparty/angle/src/libEGL/Display.h
+++ b/src/3rdparty/angle/src/libEGL/Display.h
-@@ -38,7 +38,7 @@ class Display
+@@ -43,7 +43,7 @@ class Display
bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig);
bool getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value);
- EGLSurface createWindowSurface(HWND window, EGLConfig config, const EGLint *attribList);
+ EGLSurface createWindowSurface(EGLNativeWindowType window, EGLConfig config, const EGLint *attribList);
EGLSurface createOffscreenSurface(EGLConfig config, HANDLE shareHandle, const EGLint *attribList);
- EGLContext createContext(EGLConfig configHandle, const gl::Context *shareContext, bool notifyResets, bool robustAccess);
+ EGLContext createContext(EGLConfig configHandle, EGLint clientVersion, const gl::Context *shareContext, bool notifyResets, bool robustAccess);
-@@ -49,7 +49,7 @@ class Display
+@@ -54,7 +54,7 @@ class Display
bool isValidConfig(EGLConfig config);
bool isValidContext(gl::Context *context);
bool isValidSurface(egl::Surface *surface);
@@ -310,72 +306,184 @@ index c816e4e..cd07bb3 100644
rx::Renderer *getRenderer() { return mRenderer; };
-@@ -63,12 +63,11 @@ class Display
+@@ -65,6 +65,8 @@ class Display
+ const char *getExtensionString() const;
+ const char *getVendorString() const;
+
++ EGLNativeDisplayType getDisplayId() const { return mDisplayId; }
++
private:
DISALLOW_COPY_AND_ASSIGN(Display);
-- Display(EGLNativeDisplayType displayId, HDC deviceContext);
-+ Display(EGLNativeDisplayType displayId);
-
- bool restoreLostDevice();
-
- EGLNativeDisplayType mDisplayId;
-- const HDC mDc;
-
- bool mSoftwareDevice;
-
diff --git a/src/3rdparty/angle/src/libEGL/Surface.cpp b/src/3rdparty/angle/src/libEGL/Surface.cpp
-index 12f8dfd..3443355 100644
+index 13b0f20..fa79961 100644
--- a/src/3rdparty/angle/src/libEGL/Surface.cpp
+++ b/src/3rdparty/angle/src/libEGL/Surface.cpp
-@@ -1,3 +1,4 @@
-+#include "../libGLESv2/precompiled.h"
- //
- // 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
-@@ -22,10 +23,15 @@
+@@ -22,10 +22,20 @@
#include "libEGL/main.h"
#include "libEGL/Display.h"
-+#if defined(ANGLE_OS_WINRT)
-+#include <windows.foundation.h>
-+#include <windows.ui.core.h>
++#if defined(ANGLE_PLATFORM_WINRT)
++# include "wrl.h"
++# include "windows.graphics.display.h"
++# include "windows.ui.core.h"
++using namespace ABI::Windows::Graphics::Display;
++using namespace ABI::Windows::Foundation;
++using namespace ABI::Windows::UI::Core;
++using namespace Microsoft::WRL;
+#endif
+
namespace egl
{
--Surface::Surface(Display *display, const Config *config, HWND window, EGLint postSubBufferSupported)
-+Surface::Surface(Display *display, const Config *config, EGLNativeWindowType window, EGLint postSubBufferSupported)
+-Surface::Surface(Display *display, const Config *config, HWND window, EGLint fixedSize, EGLint width, EGLint height, EGLint postSubBufferSupported)
++Surface::Surface(Display *display, const Config *config, EGLNativeWindowType window, EGLint fixedSize, EGLint width, EGLint height, EGLint postSubBufferSupported)
: mDisplay(display), mConfig(config), mWindow(window), mPostSubBufferSupported(postSubBufferSupported)
{
mRenderer = mDisplay->getRenderer();
-@@ -98,6 +104,7 @@ bool Surface::resetSwapChain()
+@@ -43,6 +53,17 @@ Surface::Surface(Display *display, const Config *config, HWND window, EGLint fix
+ mHeight = height;
+ setSwapInterval(1);
+ mFixedSize = fixedSize;
++ mSwapFlags = rx::SWAP_NORMAL;
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (mWindow)
++ mWindow->AddRef();
++ mScaleFactor = 1.0;
++ mSizeToken.value = 0;
++ mDpiToken.value = 0;
++# if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
++ mOrientationToken.value = 0;
++# endif
++#endif
- if (mWindow)
+ subclassWindow();
+ }
+@@ -64,16 +85,86 @@ Surface::Surface(Display *display, const Config *config, HANDLE shareHandle, EGL
+ setSwapInterval(1);
+ // This constructor is for offscreen surfaces, which are always fixed-size.
+ mFixedSize = EGL_TRUE;
++ mSwapFlags = rx::SWAP_NORMAL;
++#if defined(ANGLE_PLATFORM_WINRT)
++ mScaleFactor = 1.0;
++ mSizeToken.value = 0;
++ mDpiToken.value = 0;
++# if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
++ mOrientationToken.value = 0;
++# endif
++#endif
+ }
+
+ Surface::~Surface()
+ {
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (mSizeToken.value) {
++ ComPtr<ICoreWindow> coreWindow;
++ HRESULT hr = mWindow->QueryInterface(coreWindow.GetAddressOf());
++ ASSERT(SUCCEEDED(hr));
++
++ hr = coreWindow->remove_SizeChanged(mSizeToken);
++ ASSERT(SUCCEEDED(hr));
++ }
++ if (mDpiToken.value) {
++ ComPtr<IDisplayInformation> displayInformation;
++ HRESULT hr = mDisplay->getDisplayId()->QueryInterface(displayInformation.GetAddressOf());
++ ASSERT(SUCCEEDED(hr));
++
++ hr = displayInformation->remove_DpiChanged(mDpiToken);
++ ASSERT(SUCCEEDED(hr));
++ }
++# if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
++ if (mOrientationToken.value) {
++ ComPtr<IDisplayInformation> displayInformation;
++ HRESULT hr = mDisplay->getDisplayId()->QueryInterface(displayInformation.GetAddressOf());
++ ASSERT(SUCCEEDED(hr));
++
++ hr = displayInformation->remove_OrientationChanged(mOrientationToken);
++ ASSERT(SUCCEEDED(hr));
++ }
++# endif
++#endif
+ unsubclassWindow();
+ release();
+ }
+
+ bool Surface::initialize()
+ {
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (!mFixedSize) {
++ HRESULT hr;
++ ComPtr<IDisplayInformation> displayInformation;
++ hr = mDisplay->getDisplayId()->QueryInterface(displayInformation.GetAddressOf());
++ ASSERT(SUCCEEDED(hr));
++ onDpiChanged(displayInformation.Get(), 0);
++ hr = displayInformation->add_DpiChanged(Callback<ITypedEventHandler<DisplayInformation *, IInspectable *>>(this, &Surface::onDpiChanged).Get(),
++ &mDpiToken);
++ ASSERT(SUCCEEDED(hr));
++
++# if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
++ onOrientationChanged(displayInformation.Get(), 0);
++ hr = displayInformation->add_OrientationChanged(Callback<ITypedEventHandler<DisplayInformation *, IInspectable *>>(this, &Surface::onOrientationChanged).Get(),
++ &mOrientationToken);
++ ASSERT(SUCCEEDED(hr));
++# endif
++
++ ComPtr<ICoreWindow> coreWindow;
++ hr = mWindow->QueryInterface(coreWindow.GetAddressOf());
++ ASSERT(SUCCEEDED(hr));
++
++ Rect rect;
++ hr = coreWindow->get_Bounds(&rect);
++ ASSERT(SUCCEEDED(hr));
++ mWidth = rect.Width * mScaleFactor;
++ mHeight = rect.Height * mScaleFactor;
++ hr = coreWindow->add_SizeChanged(Callback<ITypedEventHandler<CoreWindow *, WindowSizeChangedEventArgs *>>(this, &Surface::onSizeChanged).Get(),
++ &mSizeToken);
++ ASSERT(SUCCEEDED(hr));
++ }
++#endif
++
+ if (!resetSwapChain())
+ return false;
+
+@@ -90,6 +181,11 @@ void Surface::release()
+ mTexture->releaseTexImage();
+ mTexture = NULL;
+ }
++
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (mWindow)
++ mWindow->Release();
++#endif
+ }
+
+ bool Surface::resetSwapChain()
+@@ -99,6 +195,7 @@ bool Surface::resetSwapChain()
+ int width;
+ int height;
+
++#if !defined(ANGLE_PLATFORM_WINRT)
+ if (!mFixedSize)
{
-+#if !defined(ANGLE_OS_WINRT)
RECT windowRect;
- if (!GetClientRect(getWindowHandle(), &windowRect))
- {
-@@ -109,6 +116,16 @@ bool Surface::resetSwapChain()
-
- width = windowRect.right - windowRect.left;
+@@ -114,6 +211,7 @@ bool Surface::resetSwapChain()
height = windowRect.bottom - windowRect.top;
-+#else
-+ ABI::Windows::Foundation::Rect windowRect;
-+ ABI::Windows::UI::Core::ICoreWindow *window;
-+ HRESULT hr = mWindow->QueryInterface(IID_PPV_ARGS(&window));
-+ if (FAILED(hr))
-+ return false;
-+ window->get_Bounds(&windowRect);
-+ width = windowRect.Width;
-+ height = windowRect.Height;
-+#endif
}
else
++#endif
{
-@@ -221,7 +238,7 @@ bool Surface::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
+ // non-window surface - size is determined at creation
+ width = mWidth;
+@@ -207,7 +305,7 @@ bool Surface::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
+ return true;
+ }
+
+- EGLint status = mSwapChain->swapRect(x, y, width, height);
++ EGLint status = mSwapChain->swapRect(x, y, width, height, mSwapFlags);
+
+ if (status == EGL_CONTEXT_LOST)
+ {
+@@ -224,7 +322,7 @@ bool Surface::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
return true;
}
@@ -384,15 +492,15 @@ index 12f8dfd..3443355 100644
{
return mWindow;
}
-@@ -230,6 +247,7 @@ HWND Surface::getWindowHandle()
+@@ -233,6 +331,7 @@ HWND Surface::getWindowHandle()
#define kSurfaceProperty _TEXT("Egl::SurfaceOwner")
#define kParentWndProc _TEXT("Egl::SurfaceParentWndProc")
-+#if !defined(ANGLE_OS_WINRT)
++#if !defined(ANGLE_PLATFORM_WINRT)
static LRESULT CALLBACK SurfaceWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
if (message == WM_SIZE)
-@@ -243,9 +261,13 @@ static LRESULT CALLBACK SurfaceWindowProc(HWND hwnd, UINT message, WPARAM wparam
+@@ -246,9 +345,11 @@ static LRESULT CALLBACK SurfaceWindowProc(HWND hwnd, UINT message, WPARAM wparam
WNDPROC prevWndFunc = reinterpret_cast<WNDPROC >(GetProp(hwnd, kParentWndProc));
return CallWindowProc(prevWndFunc, hwnd, message, wparam, lparam);
}
@@ -400,26 +508,26 @@ index 12f8dfd..3443355 100644
void Surface::subclassWindow()
{
-+#if defined(ANGLE_OS_WINRT)
-+ mWindowSubclassed = false;
-+#else
++#if !defined(ANGLE_PLATFORM_WINRT)
if (!mWindow)
{
return;
-@@ -269,10 +291,12 @@ void Surface::subclassWindow()
+@@ -272,10 +373,14 @@ void Surface::subclassWindow()
SetProp(mWindow, kSurfaceProperty, reinterpret_cast<HANDLE>(this));
SetProp(mWindow, kParentWndProc, reinterpret_cast<HANDLE>(oldWndProc));
mWindowSubclassed = true;
++#else
++ mWindowSubclassed = false;
+#endif
}
void Surface::unsubclassWindow()
{
-+#if !defined(ANGLE_OS_WINRT)
++#if !defined(ANGLE_PLATFORM_WINRT)
if(!mWindowSubclassed)
{
return;
-@@ -295,10 +319,12 @@ void Surface::unsubclassWindow()
+@@ -299,16 +404,18 @@ void Surface::unsubclassWindow()
RemoveProp(mWindow, kSurfaceProperty);
RemoveProp(mWindow, kParentWndProc);
mWindowSubclassed = false;
@@ -428,51 +536,134 @@ index 12f8dfd..3443355 100644
bool Surface::checkForOutOfDateSwapChain()
{
-+#if !defined(ANGLE_OS_WINRT)
- RECT client;
- if (!GetClientRect(getWindowHandle(), &client))
- {
-@@ -309,14 +335,26 @@ bool Surface::checkForOutOfDateSwapChain()
- // Grow the buffer now, if the window has grown. We need to grow now to avoid losing information.
- int clientWidth = client.right - client.left;
- int clientHeight = client.bottom - client.top;
-+#else
-+ ABI::Windows::Foundation::Rect windowRect;
-+ ABI::Windows::UI::Core::ICoreWindow *window;
-+ HRESULT hr = mWindow->QueryInterface(IID_PPV_ARGS(&window));
-+ if (FAILED(hr))
-+ return false;
-+ window->get_Bounds(&windowRect);
-+ int clientWidth = windowRect.Width;
-+ int clientHeight = windowRect.Height;
-+#endif
- bool sizeDirty = clientWidth != getWidth() || clientHeight != getHeight();
-
-+#if !defined(ANGLE_OS_WINRT)
- if (IsIconic(getWindowHandle()))
+- RECT client;
+ int clientWidth = getWidth();
+ int clientHeight = getHeight();
+ bool sizeDirty = false;
++#if !defined(ANGLE_PLATFORM_WINRT)
+ if (!mFixedSize && !IsIconic(getWindowHandle()))
{
++ RECT client;
// The window is automatically resized to 150x22 when it's minimized, but the swapchain shouldn't be resized
// because that's not a useful size to render to.
- sizeDirty = false;
+ if (!GetClientRect(getWindowHandle(), &client))
+@@ -322,6 +429,7 @@ bool Surface::checkForOutOfDateSwapChain()
+ clientHeight = client.bottom - client.top;
+ sizeDirty = clientWidth != getWidth() || clientHeight != getHeight();
}
+#endif
bool wasDirty = (mSwapIntervalDirty || sizeDirty);
+@@ -446,4 +554,73 @@ EGLenum Surface::getFormat() const
+ {
+ return mConfig->mRenderTargetFormat;
+ }
++
++#if defined(ANGLE_PLATFORM_WINRT)
++
++HRESULT Surface::onSizeChanged(ICoreWindow *, IWindowSizeChangedEventArgs *args)
++{
++ HRESULT hr;
++ Size size;
++ hr = args->get_Size(&size);
++ ASSERT(SUCCEEDED(hr));
++
++ resizeSwapChain(std::floor(size.Width * mScaleFactor + 0.5),
++ std::floor(size.Height * mScaleFactor + 0.5));
++
++ if (static_cast<egl::Surface*>(getCurrentDrawSurface()) == this)
++ {
++ glMakeCurrent(glGetCurrentContext(), static_cast<egl::Display*>(getCurrentDisplay()), this);
++ }
++
++ return S_OK;
++}
++
++HRESULT Surface::onDpiChanged(IDisplayInformation *displayInformation, IInspectable *)
++{
++ HRESULT hr;
++# if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
++ ComPtr<IDisplayInformation2> displayInformation2;
++ hr = displayInformation->QueryInterface(displayInformation2.GetAddressOf());
++ ASSERT(SUCCEEDED(hr));
++
++ hr = displayInformation2->get_RawPixelsPerViewPixel(&mScaleFactor);
++ ASSERT(SUCCEEDED(hr));
++# else
++ ResolutionScale resolutionScale;
++ hr = displayInformation->get_ResolutionScale(&resolutionScale);
++ ASSERT(SUCCEEDED(hr));
++
++ mScaleFactor = double(resolutionScale) / 100.0;
++# endif
++ return S_OK;
++}
++
++# if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
++HRESULT Surface::onOrientationChanged(IDisplayInformation *displayInformation, IInspectable *)
++{
++ HRESULT hr;
++ DisplayOrientations orientation;
++ hr = displayInformation->get_CurrentOrientation(&orientation);
++ ASSERT(SUCCEEDED(hr));
++ switch (orientation) {
++ default:
++ case DisplayOrientations_Portrait:
++ mSwapFlags = rx::SWAP_NORMAL;
++ break;
++ case DisplayOrientations_Landscape:
++ mSwapFlags = rx::SWAP_ROTATE_90;
++ break;
++ case DisplayOrientations_LandscapeFlipped:
++ mSwapFlags = rx::SWAP_ROTATE_270;
++ break;
++ case DisplayOrientations_PortraitFlipped:
++ mSwapFlags = rx::SWAP_ROTATE_180;
++ break;
++ }
++ return S_OK;
++}
++# endif
++
++#endif
++
+ }
diff --git a/src/3rdparty/angle/src/libEGL/Surface.h b/src/3rdparty/angle/src/libEGL/Surface.h
-index 938b800..1d2303c 100644
+index 3caf620..ebffce8 100644
--- a/src/3rdparty/angle/src/libEGL/Surface.h
+++ b/src/3rdparty/angle/src/libEGL/Surface.h
-@@ -34,7 +34,7 @@ class Config;
+@@ -15,6 +15,20 @@
+
+ #include "common/angleutils.h"
+
++#if defined(ANGLE_PLATFORM_WINRT)
++#include <EventToken.h>
++namespace ABI { namespace Windows {
++ namespace UI { namespace Core {
++ struct ICoreWindow;
++ struct IWindowSizeChangedEventArgs;
++ } }
++ namespace Graphics { namespace Display {
++ struct IDisplayInformation;
++ } }
++} }
++struct IInspectable;
++#endif
++
+ namespace gl
+ {
+ class Texture2D;
+@@ -33,7 +47,7 @@ class Config;
class Surface
{
public:
-- Surface(Display *display, const egl::Config *config, HWND window, EGLint postSubBufferSupported);
-+ Surface(Display *display, const egl::Config *config, EGLNativeWindowType window, EGLint postSubBufferSupported);
+- Surface(Display *display, const egl::Config *config, HWND window, EGLint fixedSize, EGLint width, EGLint height, EGLint postSubBufferSupported);
++ Surface(Display *display, const egl::Config *config, EGLNativeWindowType window, EGLint fixedSize, EGLint width, EGLint height, EGLint postSubBufferSupported);
Surface(Display *display, const egl::Config *config, HANDLE shareHandle, EGLint width, EGLint height, EGLenum textureFormat, EGLenum textureTarget);
- ~Surface();
-@@ -43,7 +43,7 @@ class Surface
+ virtual ~Surface();
+@@ -42,7 +56,7 @@ class Surface
void release();
bool resetSwapChain();
@@ -481,422 +672,270 @@ index 938b800..1d2303c 100644
bool swap();
bool postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height);
-@@ -79,7 +79,7 @@ private:
+@@ -71,6 +85,14 @@ class Surface
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Surface);
+
++#if defined(ANGLE_PLATFORM_WINRT)
++ HRESULT onSizeChanged(ABI::Windows::UI::Core::ICoreWindow *, ABI::Windows::UI::Core::IWindowSizeChangedEventArgs *);
++ HRESULT onDpiChanged(ABI::Windows::Graphics::Display::IDisplayInformation *, IInspectable *);
++# if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
++ HRESULT onOrientationChanged(ABI::Windows::Graphics::Display::IDisplayInformation *, IInspectable *);
++# endif
++#endif
++
+ Display *const mDisplay;
+ rx::Renderer *mRenderer;
+
+@@ -83,7 +105,7 @@ private:
bool resetSwapChain(int backbufferWidth, int backbufferHeight);
bool swapRect(EGLint x, EGLint y, EGLint width, EGLint height);
- const HWND mWindow; // Window that the surface is created for.
-+ const EGLNativeWindowType mWindow; // Window that the surface is created for.
++ const EGLNativeWindowType mWindow; // Window that the surface is created for.
bool mWindowSubclassed; // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking
const egl::Config *mConfig; // EGL config surface was created with
EGLint mHeight; // Height of surface
+@@ -104,9 +126,18 @@ private:
+ EGLint mSwapInterval;
+ EGLint mPostSubBufferSupported;
+ EGLint mFixedSize;
+-
++ EGLint mSwapFlags;
++
+ bool mSwapIntervalDirty;
+ gl::Texture2D *mTexture;
++#if defined(ANGLE_PLATFORM_WINRT)
++ double mScaleFactor;
++ EventRegistrationToken mSizeToken;
++ EventRegistrationToken mDpiToken;
++# if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
++ EventRegistrationToken mOrientationToken;
++# endif
++#endif
+ };
+ }
+
diff --git a/src/3rdparty/angle/src/libEGL/libEGL.cpp b/src/3rdparty/angle/src/libEGL/libEGL.cpp
-index 0ea46d4..b2944d5 100644
+index 23df448..a08e1ed 100644
--- a/src/3rdparty/angle/src/libEGL/libEGL.cpp
+++ b/src/3rdparty/angle/src/libEGL/libEGL.cpp
-@@ -308,14 +308,16 @@ EGLSurface __stdcall eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EG
- return EGL_NO_SURFACE;
- }
+@@ -10,6 +10,7 @@
-+#if !defined(ANGLE_OS_WINRT)
- HWND window = (HWND)win;
+ #include "common/debug.h"
+ #include "common/version.h"
++#include "common/platform.h"
+ #include "libGLESv2/Context.h"
+ #include "libGLESv2/Texture.h"
+ #include "libGLESv2/main.h"
+@@ -117,12 +118,13 @@ EGLDisplay __stdcall eglGetPlatformDisplayEXT(EGLenum platform, void *native_dis
+ }
- if (!IsWindow(window))
- {
- return egl::error(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
- }
+ EGLNativeDisplayType displayId = static_cast<EGLNativeDisplayType>(native_display);
+-
++#if !defined(ANGLE_PLATFORM_WINRT)
+ // Validate the display device context
+ if (WindowFromDC(displayId) == NULL)
+ {
+ return egl::success(EGL_NO_DISPLAY);
+ }
+#endif
-- return display->createWindowSurface(window, config, attrib_list);
-+ return display->createWindowSurface(win, config, attrib_list);
+ EGLint requestedDisplayType = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;
+ if (attrib_list)
+@@ -324,14 +326,16 @@ EGLSurface __stdcall eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EG
+ return EGL_NO_SURFACE;
}
- catch(std::bad_alloc&)
+
++#if !defined(ANGLE_PLATFORM_WINRT)
+ HWND window = (HWND)win;
+
+ if (!IsWindow(window))
{
+ return egl::error(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
+ }
++#endif
+
+- return display->createWindowSurface(window, config, attrib_list);
++ return display->createWindowSurface(win, config, attrib_list);
+ }
+
+ EGLSurface __stdcall eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
diff --git a/src/3rdparty/angle/src/libEGL/main.cpp b/src/3rdparty/angle/src/libEGL/main.cpp
-index 772b8eb..e972691 100644
+index 8a1baef..5788af7 100644
--- a/src/3rdparty/angle/src/libEGL/main.cpp
+++ b/src/3rdparty/angle/src/libEGL/main.cpp
-@@ -1,3 +1,4 @@
-+#include "../libGLESv2/precompiled.h"
- //
- // 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
-@@ -10,14 +11,23 @@
-
+@@ -11,6 +11,9 @@
#include "common/debug.h"
+ #include "common/tls.h"
-+#if !defined(ANGLE_OS_WINRT)
- static DWORD currentTLS = TLS_OUT_OF_INDEXES;
-+#else
-+static __declspec(thread) void *currentTLS = 0;
++#if defined(ANGLE_PLATFORM_WINRT)
++__declspec(thread)
+#endif
+ static TLSIndex currentTLS = TLS_OUT_OF_INDEXES;
namespace egl
- {
+@@ -18,6 +21,12 @@ namespace egl
Current *AllocateCurrent()
{
-+#if !defined(ANGLE_OS_WINRT)
- Current *current = (egl::Current*)LocalAlloc(LPTR, sizeof(egl::Current));
-+#else
-+ currentTLS = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Current));
-+ Current *current = (egl::Current*)currentTLS;
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (currentTLS == TLS_OUT_OF_INDEXES)
++ {
++ currentTLS = CreateTLSIndex();
++ }
+#endif
-
- if (!current)
- {
-@@ -25,8 +35,10 @@ Current *AllocateCurrent()
- return NULL;
- }
-
-+#if !defined(ANGLE_OS_WINRT)
ASSERT(currentTLS != TLS_OUT_OF_INDEXES);
- TlsSetValue(currentTLS, current);
-+#endif
-
- current->error = EGL_SUCCESS;
- current->API = EGL_OPENGL_ES_API;
-@@ -39,12 +51,20 @@ Current *AllocateCurrent()
+ if (currentTLS == TLS_OUT_OF_INDEXES)
+ {
+@@ -42,6 +51,12 @@ Current *AllocateCurrent()
void DeallocateCurrent()
{
-+#if !defined(ANGLE_OS_WINRT)
- void *current = TlsGetValue(currentTLS);
-
- if (current)
- {
- LocalFree((HLOCAL)current);
- }
-+#else
-+ if (currentTLS)
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (currentTLS == TLS_OUT_OF_INDEXES)
+ {
-+ HeapFree(GetProcessHeap(), 0, currentTLS);
-+ currentTLS = 0;
++ return;
+ }
+#endif
- }
-
- }
-@@ -69,13 +89,14 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
- }
+ Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS));
+ SafeDelete(current);
+ SetTLSValue(currentTLS, NULL);
+@@ -72,6 +87,10 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
}
#endif
--
-+#if !defined(ANGLE_OS_WINRT)
- currentTLS = TlsAlloc();
++#if defined(ANGLE_PLATFORM_WINRT) // On WinRT, don't handle TLS from DllMain
++ return DisableThreadLibraryCalls(instance);
++#endif
++
+ currentTLS = CreateTLSIndex();
if (currentTLS == TLS_OUT_OF_INDEXES)
{
- return FALSE;
- }
-+#endif
- }
- // Fall throught to initialize index
- case DLL_THREAD_ATTACH:
-@@ -91,7 +112,9 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
+@@ -91,8 +110,10 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
+ break;
case DLL_PROCESS_DETACH:
{
++#if !defined(ANGLE_PLATFORM_WINRT)
egl::DeallocateCurrent();
-+#if !defined(ANGLE_OS_WINRT)
- TlsFree(currentTLS);
+ DestroyTLSIndex(currentTLS);
+#endif
}
break;
default:
-@@ -107,8 +130,12 @@ namespace egl
- Current *GetCurrentData()
- {
- #ifndef QT_OPENGL_ES_2_ANGLE_STATIC
-+#if !defined(ANGLE_OS_WINRT)
- Current *current = (Current*)TlsGetValue(currentTLS);
- #else
-+ Current *current = (Current*)currentTLS;
-+#endif
-+#else
- // No precautions for thread safety taken as ANGLE is used single-threaded in Qt.
- static Current s_current = { EGL_SUCCESS, EGL_OPENGL_ES_API, EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE };
- Current *current = &s_current;
-diff --git a/src/3rdparty/angle/src/libGLESv2/Context.cpp b/src/3rdparty/angle/src/libGLESv2/Context.cpp
-index 1a058b6..e651785 100644
---- a/src/3rdparty/angle/src/libGLESv2/Context.cpp
-+++ b/src/3rdparty/angle/src/libGLESv2/Context.cpp
-@@ -1076,6 +1076,7 @@ void Context::setRenderbufferStorage(GLsizei width, GLsizei height, GLenum inter
- case GL_RGB565:
- case GL_RGB8_OES:
- case GL_RGBA8_OES:
-+ case GL_BGRA8_EXT:
- renderbuffer = new gl::Colorbuffer(mRenderer,width, height, internalformat, samples);
- break;
- case GL_STENCIL_INDEX8:
-diff --git a/src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp b/src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp
-index a33481e..814dfbf 100644
---- a/src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp
-+++ b/src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp
-@@ -4895,6 +4895,7 @@ void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samp
- case GL_RGBA8_OES:
- case GL_STENCIL_INDEX8:
- case GL_DEPTH24_STENCIL8_OES:
-+ case GL_BGRA8_EXT:
- context->setRenderbufferStorage(width, height, internalformat, samples);
- break;
- default:
diff --git a/src/3rdparty/angle/src/libGLESv2/main.cpp b/src/3rdparty/angle/src/libGLESv2/main.cpp
-index 6b459d3..95f4b8d 100644
+index 5a45ec3..8820700 100644
--- a/src/3rdparty/angle/src/libGLESv2/main.cpp
+++ b/src/3rdparty/angle/src/libGLESv2/main.cpp
-@@ -11,14 +11,23 @@
+@@ -12,6 +12,9 @@
- #include "libGLESv2/Context.h"
+ #include "common/tls.h"
-+#if !defined(ANGLE_OS_WINRT)
- static DWORD currentTLS = TLS_OUT_OF_INDEXES;
-+#else
-+static __declspec(thread) void *currentTLS = 0;
++#if defined(ANGLE_PLATFORM_WINRT)
++__declspec(thread)
+#endif
+ static TLSIndex currentTLS = TLS_OUT_OF_INDEXES;
namespace gl
- {
+@@ -19,6 +22,12 @@ namespace gl
Current *AllocateCurrent()
{
-+#if !defined(ANGLE_OS_WINRT)
- Current *current = (Current*)LocalAlloc(LPTR, sizeof(Current));
-+#else
-+ currentTLS = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Current));
-+ Current *current = (Current*)currentTLS;
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (currentTLS == TLS_OUT_OF_INDEXES)
++ {
++ currentTLS = CreateTLSIndex();
++ }
+#endif
-
- if (!current)
- {
-@@ -26,8 +35,10 @@ Current *AllocateCurrent()
- return NULL;
- }
-
-+#if !defined(ANGLE_OS_WINRT)
ASSERT(currentTLS != TLS_OUT_OF_INDEXES);
- TlsSetValue(currentTLS, current);
-+#endif
-
- current->context = NULL;
- current->display = NULL;
-@@ -37,12 +48,20 @@ Current *AllocateCurrent()
+ if (currentTLS == TLS_OUT_OF_INDEXES)
+ {
+@@ -40,6 +49,12 @@ Current *AllocateCurrent()
void DeallocateCurrent()
{
-+#if !defined(ANGLE_OS_WINRT)
- void *current = TlsGetValue(currentTLS);
-
- if (current)
- {
- LocalFree((HLOCAL)current);
- }
-+#else
-+ if (currentTLS)
++#if defined(ANGLE_PLATFORM_WINRT)
++ if (currentTLS == TLS_OUT_OF_INDEXES)
+ {
-+ HeapFree(GetProcessHeap(), 0, currentTLS);
-+ currentTLS = 0;
++ return;
+ }
+#endif
- }
-
- }
-@@ -53,12 +72,14 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
+ Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS));
+ SafeDelete(current);
+ SetTLSValue(currentTLS, NULL);
+@@ -55,6 +70,9 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
{
case DLL_PROCESS_ATTACH:
{
-+#if !defined(ANGLE_OS_WINRT)
- currentTLS = TlsAlloc();
-
++#if defined(ANGLE_PLATFORM_WINRT) // On WinRT, don't handle TLS from DllMain
++ return DisableThreadLibraryCalls(instance);
++#endif
+ currentTLS = CreateTLSIndex();
if (currentTLS == TLS_OUT_OF_INDEXES)
{
- return FALSE;
- }
-+#endif
- }
- // Fall throught to initialize index
- case DLL_THREAD_ATTACH:
-@@ -74,7 +95,9 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
+@@ -74,8 +92,10 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
+ break;
case DLL_PROCESS_DETACH:
{
++#if !defined(ANGLE_PLATFORM_WINRT)
gl::DeallocateCurrent();
-+#if !defined(ANGLE_OS_WINRT)
- TlsFree(currentTLS);
+ DestroyTLSIndex(currentTLS);
+#endif
}
break;
default:
-@@ -90,8 +113,12 @@ namespace gl
- Current *GetCurrentData()
- {
- #ifndef QT_OPENGL_ES_2_ANGLE_STATIC
-+#if !defined(ANGLE_OS_WINRT)
- Current *current = (Current*)TlsGetValue(currentTLS);
- #else
-+ Current *current = (Current*)currentTLS;
-+#endif
-+#else
- // No precautions for thread safety taken as ANGLE is used single-threaded in Qt.
- static Current s_current = { 0, 0 };
- Current *current = &s_current;
diff --git a/src/3rdparty/angle/src/libGLESv2/main.h b/src/3rdparty/angle/src/libGLESv2/main.h
-index b413f23..69465c9 100644
+index c117039..df28ea4 100644
--- a/src/3rdparty/angle/src/libGLESv2/main.h
+++ b/src/3rdparty/angle/src/libGLESv2/main.h
-@@ -57,7 +57,7 @@ gl::Context *glCreateContext(const gl::Context *shareContext, rx::Renderer *rend
- void glDestroyContext(gl::Context *context);
- void glMakeCurrent(gl::Context *context, egl::Display *display, egl::Surface *surface);
- gl::Context *glGetCurrentContext();
--rx::Renderer *glCreateRenderer(egl::Display *display, HDC hDc, EGLNativeDisplayType displayId);
-+rx::Renderer *glCreateRenderer(egl::Display *display, EGLNativeDisplayType displayId);
- void glDestroyRenderer(rx::Renderer *renderer);
-
- __eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname);
-diff --git a/src/3rdparty/angle/src/libGLESv2/precompiled.h b/src/3rdparty/angle/src/libGLESv2/precompiled.h
-index 79490b1..2ff09f5 100644
---- a/src/3rdparty/angle/src/libGLESv2/precompiled.h
-+++ b/src/3rdparty/angle/src/libGLESv2/precompiled.h
-@@ -32,14 +32,55 @@
- #include <unordered_map>
- #include <vector>
-
-+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
-+# define ANGLE_OS_WINRT
-+# if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
-+# define ANGLE_OS_WINPHONE
-+# endif
-+#endif
-+
- #if defined(ANGLE_ENABLE_D3D9)
- # include <d3d9.h>
- #endif
- #if defined(ANGLE_ENABLE_D3D11)
--# include <d3d11.h>
-+# if !defined(ANGLE_OS_WINRT)
-+# include <d3d11.h>
-+# else
-+# include <d3d11_1.h>
-+# define Sleep(x) WaitForSingleObjectEx(GetCurrentThread(), x, FALSE)
-+# define GetVersion() WINVER
-+# define LoadLibrary(x) LoadPackagedLibrary(x, NULL)
-+# endif
- # include <dxgi.h>
- #endif
--#include <d3dcompiler.h>
-+#if !defined(ANGLE_OS_WINPHONE)
-+# include <d3dcompiler.h>
-+#endif
-+
-+#ifndef D3DCOMPILE_OPTIMIZATION_LEVEL0
-+#define D3DCOMPILE_OPTIMIZATION_LEVEL0 (1 << 14)
-+#endif
-+#ifndef D3DCOMPILE_OPTIMIZATION_LEVEL1
-+#define D3DCOMPILE_OPTIMIZATION_LEVEL1 0
-+#endif
-+#ifndef D3DCOMPILE_OPTIMIZATION_LEVEL2
-+#define D3DCOMPILE_OPTIMIZATION_LEVEL2 ((1 << 14) | (1 << 15))
-+#endif
-+#ifndef D3DCOMPILE_OPTIMIZATION_LEVEL3
-+#define D3DCOMPILE_OPTIMIZATION_LEVEL3 (1 << 15)
-+#endif
-+#ifndef D3DCOMPILE_DEBUG
-+#define D3DCOMPILE_DEBUG (1 << 0)
-+#endif
-+#ifndef D3DCOMPILE_SKIP_OPTIMIZATION
-+#define D3DCOMPILE_SKIP_OPTIMIZATION (1 << 2)
-+#endif
-+#ifndef D3DCOMPILE_AVOID_FLOW_CONTROL
-+#define D3DCOMPILE_AVOID_FLOW_CONTROL (1 << 9)
-+#endif
-+#ifndef D3DCOMPILE_PREFER_FLOW_CONTROL
-+#define D3DCOMPILE_PREFER_FLOW_CONTROL (1 << 10)
-+#endif
-
- #ifdef _MSC_VER
- #include <hash_map>
-diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/Renderer.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/Renderer.cpp
-index 94cbc0e..5278113 100644
---- a/src/3rdparty/angle/src/libGLESv2/renderer/Renderer.cpp
-+++ b/src/3rdparty/angle/src/libGLESv2/renderer/Renderer.cpp
-@@ -24,7 +24,7 @@
- #define D3DERR_OUTOFVIDEOMEMORY MAKE_HRESULT(1, 0x876, 380)
- #endif
-
--#ifdef __MINGW32__
-+#if defined(__MINGW32__) || defined(ANGLE_OS_WINPHONE)
-
- #ifndef D3DCOMPILER_DLL
-
-@@ -41,7 +41,7 @@ typedef HRESULT (WINAPI *pD3DCompile)(const void *data, SIZE_T data_size, const
-
- #endif // D3DCOMPILER_DLL
+@@ -14,6 +14,10 @@
+ #define EGLAPI
+ #include <EGL/egl.h>
--#endif // __MINGW32__
-+#endif // __MINGW32__ || ANGLE_OS_WINPHONE
-
- #ifndef QT_D3DCOMPILER_DLL
- #define QT_D3DCOMPILER_DLL D3DCOMPILER_DLL
-@@ -224,17 +224,22 @@ ShaderBlob *Renderer::compileToBinary(gl::InfoLog &infoLog, const char *hlsl, co
- extern "C"
- {
-
--rx::Renderer *glCreateRenderer(egl::Display *display, HDC hDc, EGLNativeDisplayType displayId)
-+rx::Renderer *glCreateRenderer(egl::Display *display, EGLNativeDisplayType displayId)
- {
- rx::Renderer *renderer = NULL;
- EGLint status = EGL_BAD_ALLOC;
-
-+#if defined(ANGLE_OS_WINRT)
-+ if (displayId == EGL_DEFAULT_DISPLAY)
-+ displayId = EGL_D3D11_ONLY_DISPLAY_ANGLE;
++#ifndef Sleep
++#define Sleep(ms) WaitForSingleObjectEx(GetCurrentThread(), ms, FALSE)
+#endif
+
- #if defined(ANGLE_ENABLE_D3D11)
- if (displayId == EGL_DEFAULT_DISPLAY ||
- displayId == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
- displayId == EGL_D3D11_ONLY_DISPLAY_ANGLE)
- {
-- renderer = new rx::Renderer11(display, hDc);
-+ renderer = new rx::Renderer11(display);
-
- if (renderer)
- {
-@@ -257,7 +262,7 @@ rx::Renderer *glCreateRenderer(egl::Display *display, HDC hDc, EGLNativeDisplayT
-
- #if defined(ANGLE_ENABLE_D3D9)
- bool softwareDevice = (displayId == EGL_SOFTWARE_DISPLAY_ANGLE);
-- renderer = new rx::Renderer9(display, hDc, softwareDevice);
-+ renderer = new rx::Renderer9(display, displayId, softwareDevice);
-
- if (renderer)
- {
+ namespace egl
+ {
+ class Display;
diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/Renderer.h b/src/3rdparty/angle/src/libGLESv2/renderer/Renderer.h
-index 7244a0a..79578b2 100644
+index be3ba29..f1e0fd2 100644
--- a/src/3rdparty/angle/src/libGLESv2/renderer/Renderer.h
+++ b/src/3rdparty/angle/src/libGLESv2/renderer/Renderer.h
-@@ -1,3 +1,4 @@
-+#include "../precompiled.h"
- //
- // Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
-@@ -113,7 +114,7 @@ class Renderer
+@@ -106,7 +106,7 @@ class Renderer
virtual void sync(bool block) = 0;
- virtual SwapChain *createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat) = 0;
+ virtual SwapChain *createSwapChain(EGLNativeWindowType window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat) = 0;
+ virtual void generateSwizzle(gl::Texture *texture) = 0;
virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler) = 0;
- virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture) = 0;
diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/SwapChain.h b/src/3rdparty/angle/src/libGLESv2/renderer/SwapChain.h
-index f09f19b..8231fbc 100644
+index f09f19b..77546f8 100644
--- a/src/3rdparty/angle/src/libGLESv2/renderer/SwapChain.h
+++ b/src/3rdparty/angle/src/libGLESv2/renderer/SwapChain.h
-@@ -1,3 +1,4 @@
-+#include "../precompiled.h"
- //
- // 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
-@@ -22,7 +23,7 @@ namespace rx
+@@ -10,6 +10,7 @@
+ #ifndef LIBGLESV2_RENDERER_SWAPCHAIN_H_
+ #define LIBGLESV2_RENDERER_SWAPCHAIN_H_
+
++#include <EGL/eglplatform.h>
+ #include "common/angleutils.h"
+
+ #if !defined(ANGLE_FORCE_VSYNC_OFF)
+@@ -19,10 +20,18 @@
+ namespace rx
+ {
+
++enum SwapFlags
++{
++ SWAP_NORMAL = 0,
++ SWAP_ROTATE_90 = 1,
++ SWAP_ROTATE_270 = 2,
++ SWAP_ROTATE_180 = SWAP_ROTATE_90|SWAP_ROTATE_270,
++};
++
class SwapChain
{
public:
@@ -905,45 +944,95 @@ index f09f19b..8231fbc 100644
: mWindow(window), mShareHandle(shareHandle), mBackBufferFormat(backBufferFormat), mDepthBufferFormat(depthBufferFormat)
{
}
-@@ -37,7 +38,7 @@ class SwapChain
+@@ -31,13 +40,13 @@ class SwapChain
+
+ virtual EGLint resize(EGLint backbufferWidth, EGLint backbufferSize) = 0;
+ virtual EGLint reset(EGLint backbufferWidth, EGLint backbufferHeight, EGLint swapInterval) = 0;
+- virtual EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height) = 0;
++ virtual EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height, EGLint flags) = 0;
+ virtual void recreate() = 0;
+
virtual HANDLE getShareHandle() {return mShareHandle;};
protected:
- const HWND mWindow; // Window that the surface is created for.
-+ const EGLNativeWindowType mWindow; // Window that the surface is created for.
++ const EGLNativeWindowType mWindow; // Window that the surface is created for.
const GLenum mBackBufferFormat;
const GLenum mDepthBufferFormat;
-diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/Renderer11.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/Renderer11.cpp
-index d9fcb7a..7f166fd 100644
---- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/Renderer11.cpp
-+++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/Renderer11.cpp
-@@ -66,7 +66,7 @@ enum
- MAX_TEXTURE_IMAGE_UNITS_VTF_SM4 = 16
- };
+diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/HLSLCompiler.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/HLSLCompiler.cpp
+index 31942e6..e3b88d5 100644
+--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/HLSLCompiler.cpp
++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/HLSLCompiler.cpp
+@@ -4,6 +4,7 @@
+ #include "libGLESv2/main.h"
+
+ #include "common/utilities.h"
++#include "common/platform.h"
--Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc(hDc)
-+Renderer11::Renderer11(egl::Display *display) : Renderer(display)
+ #include "third_party/trace_event/trace_event.h"
+
+@@ -49,6 +50,7 @@ HLSLCompiler::~HLSLCompiler()
+ bool HLSLCompiler::initialize()
{
- mVertexDataManager = NULL;
- mIndexDataManager = NULL;
-@@ -137,6 +137,7 @@ EGLint Renderer11::initialize()
- return EGL_NOT_INITIALIZED;
+ TRACE_EVENT0("gpu", "initializeCompiler");
++#if !defined(ANGLE_PLATFORM_WINRT)
+ #if defined(ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES)
+ // Find a D3DCompiler module that had already been loaded based on a predefined list of versions.
+ static const char *d3dCompilerNames[] = ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES;
+@@ -80,8 +82,8 @@ bool HLSLCompiler::initialize()
+ // Load the first available known compiler DLL
+ for (int i = 0; compilerDlls[i]; ++i)
+ {
+- mD3dCompilerModule = LoadLibrary(compilerDlls[i]);
+- if (mD3dCompilerModule)
++ mD3DCompilerModule = LoadLibrary(compilerDlls[i]);
++ if (mD3DCompilerModule)
+ break;
}
-+#if !defined(ANGLE_OS_WINRT)
- mDxgiModule = LoadLibrary(TEXT("dxgi.dll"));
- mD3d11Module = LoadLibrary(TEXT("d3d11.dll"));
+@@ -93,7 +95,9 @@ bool HLSLCompiler::initialize()
-@@ -146,6 +147,7 @@ EGLint Renderer11::initialize()
+ mD3DCompileFunc = reinterpret_cast<CompileFuncPtr>(GetProcAddress(mD3DCompilerModule, "D3DCompile"));
+ ASSERT(mD3DCompileFunc);
+-
++#else
++ mD3DCompileFunc = reinterpret_cast<CompileFuncPtr>(&D3DCompile);
++#endif
+ return mD3DCompileFunc != NULL;
+ }
+
+@@ -110,7 +114,9 @@ void HLSLCompiler::release()
+ ShaderBlob *HLSLCompiler::compileToBinary(gl::InfoLog &infoLog, const char *hlsl, const char *profile,
+ const UINT optimizationFlags[], const char *flagNames[], int attempts) const
+ {
++#if !defined(ANGLE_PLATFORM_WINRT)
+ ASSERT(mD3DCompilerModule && mD3DCompileFunc);
++#endif
+
+ if (!hlsl)
+ {
+diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
+index a48a2cd..36d9a8f 100644
+--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
+@@ -9,6 +9,7 @@
+
+ #include "libGLESv2/main.h"
+ #include "common/utilities.h"
++#include "common/platform.h"
+ #include "libGLESv2/Buffer.h"
+ #include "libGLESv2/FramebufferAttachment.h"
+ #include "libGLESv2/ProgramBinary.h"
+@@ -129,6 +130,7 @@ EGLint Renderer11::initialize()
return EGL_NOT_INITIALIZED;
}
-+
- // create the D3D11 device
- ASSERT(mDevice == NULL);
- PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE)GetProcAddress(mD3d11Module, "D3D11CreateDevice");
-@@ -155,6 +157,7 @@ EGLint Renderer11::initialize()
++#if !defined(ANGLE_PLATFORM_WINRT)
+ mDxgiModule = LoadLibrary(TEXT("dxgi.dll"));
+ mD3d11Module = LoadLibrary(TEXT("d3d11.dll"));
+
+@@ -147,6 +149,7 @@ EGLint Renderer11::initialize()
ERR("Could not retrieve D3D11CreateDevice address - aborting!\n");
return EGL_NOT_INITIALIZED;
}
@@ -951,11 +1040,20 @@ index d9fcb7a..7f166fd 100644
D3D_FEATURE_LEVEL featureLevels[] =
{
-@@ -203,8 +206,12 @@ EGLint Renderer11::initialize()
+@@ -201,7 +204,7 @@ EGLint Renderer11::initialize()
}
}
-+#if !defined(ANGLE_OS_WINRT)
+-#if !ANGLE_SKIP_DXGI_1_2_CHECK
++#if !ANGLE_SKIP_DXGI_1_2_CHECK && !defined(ANGLE_PLATFORM_WINRT)
+ // In order to create a swap chain for an HWND owned by another process, DXGI 1.2 is required.
+ // The easiest way to check is to query for a IDXGIDevice2.
+ bool requireDXGI1_2 = false;
+@@ -231,8 +234,12 @@ EGLint Renderer11::initialize()
+ }
+ #endif
+
++#if !defined(ANGLE_PLATFORM_WINRT)
IDXGIDevice *dxgiDevice = NULL;
- result = mDevice->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice);
+#else
@@ -965,7 +1063,7 @@ index d9fcb7a..7f166fd 100644
if (FAILED(result))
{
-@@ -522,7 +529,7 @@ void Renderer11::sync(bool block)
+@@ -413,7 +420,7 @@ void Renderer11::sync(bool block)
}
}
@@ -974,41 +1072,41 @@ index d9fcb7a..7f166fd 100644
{
return new rx::SwapChain11(this, window, shareHandle, backBufferFormat, depthBufferFormat);
}
-diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/Renderer11.h b/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/Renderer11.h
-index 1b6760b..ba3f0c6 100644
---- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/Renderer11.h
-+++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/Renderer11.h
-@@ -39,7 +39,7 @@ enum
- class Renderer11 : public Renderer
- {
- public:
-- Renderer11(egl::Display *display, HDC hDc);
-+ Renderer11(egl::Display *display);
- virtual ~Renderer11();
-
- static Renderer11 *makeRenderer11(Renderer *renderer);
-@@ -52,7 +52,7 @@ class Renderer11 : public Renderer
+diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h
+index 73a3fc2..618972d 100644
+--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h
++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h
+@@ -57,7 +57,7 @@ class Renderer11 : public Renderer
virtual void sync(bool block);
- virtual SwapChain *createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
+ virtual SwapChain *createSwapChain(EGLNativeWindowType window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
+ virtual void generateSwizzle(gl::Texture *texture);
virtual void setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &sampler);
- virtual void setTexture(gl::SamplerType type, int index, gl::Texture *texture);
-@@ -203,7 +203,6 @@ class Renderer11 : public Renderer
+@@ -238,7 +238,7 @@ class Renderer11 : public Renderer
HMODULE mD3d11Module;
HMODULE mDxgiModule;
- HDC mDc;
-
- bool mDeviceLost;
-
-diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/SwapChain11.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/SwapChain11.cpp
-index d2b53a7..bd97d5c 100644
---- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/SwapChain11.cpp
-+++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/SwapChain11.cpp
-@@ -18,7 +18,7 @@
++ EGLNativeDisplayType mDc;
+ EGLint mRequestedDisplay;
+
+ HLSLCompiler mCompiler;
+diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.cpp
+index 98166f0..0341df1 100644
+--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.cpp
++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.cpp
+@@ -9,6 +9,7 @@
+
+ #include "libGLESv2/renderer/d3d/d3d11/SwapChain11.h"
+
++#include "common/platform.h"
+ #include "libGLESv2/renderer/d3d/d3d11/renderer11_utils.h"
+ #include "libGLESv2/renderer/d3d/d3d11/formatutils11.h"
+ #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
+@@ -18,7 +19,7 @@
namespace rx
{
@@ -1017,83 +1115,172 @@ index d2b53a7..bd97d5c 100644
GLenum backBufferFormat, GLenum depthBufferFormat)
: mRenderer(renderer), SwapChain(window, shareHandle, backBufferFormat, depthBufferFormat)
{
-@@ -361,25 +361,50 @@ EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swap
+@@ -38,6 +39,8 @@ SwapChain11::SwapChain11(Renderer11 *renderer, HWND window, HANDLE shareHandle,
+ mPassThroughPS = NULL;
+ mWidth = -1;
+ mHeight = -1;
++ mViewportWidth = -1;
++ mViewportHeight = -1;
+ mSwapInterval = 0;
+ mAppCreatedShareHandle = mShareHandle != NULL;
+ mPassThroughResourcesInit = false;
+@@ -91,6 +94,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
+ ASSERT(backbufferWidth >= 1);
+ ASSERT(backbufferHeight >= 1);
+
++#if !defined(ANGLE_PLATFORM_WINRT)
+ // Preserve the render target content
+ ID3D11Texture2D *previousOffscreenTexture = mOffscreenTexture;
+ if (previousOffscreenTexture)
+@@ -99,6 +103,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
+ }
+ const int previousWidth = mWidth;
+ const int previousHeight = mHeight;
++#endif
+
+ releaseOffscreenTexture();
+
+@@ -277,7 +282,12 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
+
+ mWidth = backbufferWidth;
+ mHeight = backbufferHeight;
++#if !defined(ANGLE_PLATFORM_WINRT) || WINAPI_FAMILY==WINAPI_FAMILY_PC_APP
++ mViewportWidth = backbufferWidth;
++ mViewportHeight = backbufferHeight;
++#endif
+
++#if !defined(ANGLE_PLATFORM_WINRT)
+ if (previousOffscreenTexture != NULL)
+ {
+ D3D11_BOX sourceBox = {0};
+@@ -296,9 +306,10 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
+ if (mSwapChain)
+ {
+- swapRect(0, 0, mWidth, mHeight);
++ swapRect(0, 0, mWidth, mHeight, SWAP_NORMAL);
+ }
+ }
++#endif
+
+ return EGL_SUCCESS;
+ }
+@@ -325,8 +336,15 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
+ SafeRelease(mBackBufferRTView);
+
+ // Resize swap chain
++ HRESULT result;
++#if !defined(ANGLE_PLATFORM_WINRT) || WINAPI_FAMILY==WINAPI_FAMILY_PC_APP // Windows phone swap chain is never resized, only the texture is
++#if !defined(ANGLE_PLATFORM_WINRT)
++ const int bufferCount = 1;
++#else
++ const int bufferCount = 2;
++#endif
+ DXGI_FORMAT backbufferDXGIFormat = gl_d3d11::GetTexFormat(mBackBufferFormat);
+- HRESULT result = mSwapChain->ResizeBuffers(1, backbufferWidth, backbufferHeight, backbufferDXGIFormat, 0);
++ result = mSwapChain->ResizeBuffers(bufferCount, backbufferWidth, backbufferHeight, backbufferDXGIFormat, 0);
+
+ if (FAILED(result))
+ {
+@@ -342,7 +360,7 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
+ return EGL_BAD_ALLOC;
+ }
+ }
+-
++#endif
+ result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mBackBufferTexture);
+ ASSERT(SUCCEEDED(result));
+ if (SUCCEEDED(result))
+@@ -392,7 +410,7 @@ EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swap
if (mWindow)
{
-+#if !defined(ANGLE_OS_WINRT)
IDXGIFactory *factory = mRenderer->getDxgiFactory();
-
+-
++#if !defined(ANGLE_PLATFORM_WINRT)
DXGI_SWAP_CHAIN_DESC swapChainDesc = {0};
-- swapChainDesc.BufferCount = 2;
- swapChainDesc.BufferDesc.Format = gl_d3d11::ConvertRenderbufferFormat(mBackBufferFormat);
swapChainDesc.BufferDesc.Width = backbufferWidth;
swapChainDesc.BufferDesc.Height = backbufferHeight;
-+ swapChainDesc.BufferCount = 2;
- swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
- swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
- swapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
- swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
-+ swapChainDesc.Windowed = TRUE;
-+ swapChainDesc.OutputWindow = mWindow;
+@@ -411,6 +429,37 @@ EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swap
+ swapChainDesc.Flags = 0;
+
+ HRESULT result = factory->CreateSwapChain(device, &swapChainDesc, &mSwapChain);
+#else
-+ IDXGIFactory2 *factory;
-+ HRESULT result = mRenderer->getDxgiFactory()->QueryInterface(IID_PPV_ARGS(&factory));
++ IDXGIFactory2 *factory2;
++ HRESULT result = factory->QueryInterface(IID_PPV_ARGS(&factory2));
+ ASSERT(SUCCEEDED(result));
+
+ DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
-+ swapChainDesc.Format = gl_d3d11::ConvertRenderbufferFormat(mBackBufferFormat);
-+ swapChainDesc.Width = backbufferWidth;
-+ swapChainDesc.Height = backbufferHeight;
++ swapChainDesc.Width = 0;
++ swapChainDesc.Height = 0;
++ swapChainDesc.Format = gl_d3d11::GetTexFormat(mBackBufferFormat);
++ swapChainDesc.SampleDesc.Count = 1;
++ swapChainDesc.SampleDesc.Quality = 0;
++ swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+ swapChainDesc.Stereo = FALSE;
-+#if !defined(ANGLE_OS_WINPHONE)
++ swapChainDesc.Flags = 0;
++#if WINAPI_FAMILY==WINAPI_FAMILY_PC_APP
++ swapChainDesc.Scaling = DXGI_SCALING_NONE;
+ swapChainDesc.BufferCount = 2;
+ swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
-+#else
++#elif WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
+ swapChainDesc.BufferCount = 1;
+ swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
+#endif
-+#endif
- swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
- swapChainDesc.Flags = 0;
-- swapChainDesc.OutputWindow = mWindow;
- swapChainDesc.SampleDesc.Count = 1;
- swapChainDesc.SampleDesc.Quality = 0;
-- swapChainDesc.Windowed = TRUE;
-
-+#if !defined(ANGLE_OS_WINRT)
- HRESULT result = factory->CreateSwapChain(device, &swapChainDesc, &mSwapChain);
-+#else
++
+ IDXGISwapChain1 *swapChain;
-+ result = factory->CreateSwapChainForCoreWindow(device, mWindow, &swapChainDesc, NULL, &swapChain);
++ result = factory2->CreateSwapChainForCoreWindow(device, mWindow, &swapChainDesc, NULL, &swapChain);
+ mSwapChain = swapChain;
++ HRESULT hr = swapChain->GetDesc1(&swapChainDesc);
++ ASSERT(SUCCEEDED(hr));
++ mViewportWidth = swapChainDesc.Width;
++ mViewportHeight = swapChainDesc.Height;
+#endif
if (FAILED(result))
{
-@@ -390,6 +415,7 @@ EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swap
- {
- return EGL_CONTEXT_LOST;
- }
-+#if !defined(ANGLE_OS_WINRT)
- else
- {
- // We cannot create a swap chain for an HWND that is owned by a different process on some versions of
-@@ -408,6 +434,9 @@ EGLint SwapChain11::reset(int backbufferWidth, int backbufferHeight, EGLint swap
- return EGL_BAD_ALLOC;
- }
- }
-+#else
-+ return EGL_BAD_ALLOC;
-+#endif
- }
+@@ -507,7 +556,7 @@ void SwapChain11::initPassThroughResources()
+ }
- result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mBackBufferTexture);
-diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/SwapChain11.h b/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/SwapChain11.h
-index 8001046..2a030c8 100644
---- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/SwapChain11.h
-+++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/SwapChain11.h
-@@ -19,7 +19,7 @@ class Renderer11;
+ // parameters should be validated/clamped by caller
+-EGLint SwapChain11::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
++EGLint SwapChain11::swapRect(EGLint x, EGLint y, EGLint width, EGLint height, EGLint flags)
+ {
+ if (!mSwapChain)
+ {
+@@ -538,10 +587,13 @@ EGLint SwapChain11::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
+ float u2 = (x + width) / float(mWidth);
+ float v2 = (y + height) / float(mHeight);
+
+- d3d11::SetPositionTexCoordVertex(&vertices[0], x1, y1, u1, v1);
+- d3d11::SetPositionTexCoordVertex(&vertices[1], x1, y2, u1, v2);
+- d3d11::SetPositionTexCoordVertex(&vertices[2], x2, y1, u2, v1);
+- d3d11::SetPositionTexCoordVertex(&vertices[3], x2, y2, u2, v2);
++ const int rotateL = flags & SWAP_ROTATE_90;
++ const int rotateR = flags & SWAP_ROTATE_270;
++
++ d3d11::SetPositionTexCoordVertex(&vertices[0], x1, y1, rotateL ? u2 : u1, rotateR ? v2 : v1);
++ d3d11::SetPositionTexCoordVertex(&vertices[1], x1, y2, rotateR ? u2 : u1, rotateL ? v1 : v2);
++ d3d11::SetPositionTexCoordVertex(&vertices[2], x2, y1, rotateR ? u1 : u2, rotateL ? v2 : v1);
++ d3d11::SetPositionTexCoordVertex(&vertices[3], x2, y2, rotateL ? u1 : u2, rotateR ? v1 : v2);
+
+ deviceContext->Unmap(mQuadVB, 0);
+
+@@ -571,8 +623,8 @@ EGLint SwapChain11::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
+ D3D11_VIEWPORT viewport;
+ viewport.TopLeftX = 0;
+ viewport.TopLeftY = 0;
+- viewport.Width = mWidth;
+- viewport.Height = mHeight;
++ viewport.Width = mViewportWidth;
++ viewport.Height = mViewportHeight;
+ viewport.MinDepth = 0.0f;
+ viewport.MaxDepth = 1.0f;
+ deviceContext->RSSetViewports(1, &viewport);
+diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.h b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.h
+index fb0afd7..b30b785 100644
+--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.h
++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.h
+@@ -19,13 +19,13 @@ class Renderer11;
class SwapChain11 : public SwapChain
{
public:
@@ -1102,109 +1289,48 @@ index 8001046..2a030c8 100644
GLenum backBufferFormat, GLenum depthBufferFormat);
virtual ~SwapChain11();
-diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/shaders/Clear11.hlsl b/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/shaders/Clear11.hlsl
-index 042ac69..cb132dc 100644
---- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/shaders/Clear11.hlsl
-+++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d11/shaders/Clear11.hlsl
-@@ -12,10 +12,12 @@ struct PS_OutputMultiple
- float4 color1 : SV_TARGET1;
- float4 color2 : SV_TARGET2;
- float4 color3 : SV_TARGET3;
-+#ifdef SM4
- float4 color4 : SV_TARGET4;
- float4 color5 : SV_TARGET5;
- float4 color6 : SV_TARGET6;
- float4 color7 : SV_TARGET7;
-+#endif
- };
-
- PS_OutputMultiple PS_ClearMultiple(in float4 inPosition : SV_POSITION, in float4 inColor : COLOR)
-@@ -25,10 +27,12 @@ PS_OutputMultiple PS_ClearMultiple(in float4 inPosition : SV_POSITION, in float4
- outColor.color1 = inColor;
- outColor.color2 = inColor;
- outColor.color3 = inColor;
-+#ifdef SM4
- outColor.color4 = inColor;
- outColor.color5 = inColor;
- outColor.color6 = inColor;
- outColor.color7 = inColor;
-+#endif
- return outColor;
+ 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 EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height, EGLint flags);
+ virtual void recreate();
+
+ virtual ID3D11Texture2D *getOffscreenTexture();
+@@ -52,6 +52,8 @@ class SwapChain11 : public SwapChain
+ Renderer11 *mRenderer;
+ EGLint mHeight;
+ EGLint mWidth;
++ EGLint mViewportWidth;
++ EGLint mViewportHeight;
+ bool mAppCreatedShareHandle;
+ unsigned int mSwapInterval;
+ bool mPassThroughResourcesInit;
+diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/SwapChain9.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/SwapChain9.cpp
+index 4a17acf..c6567b6 100644
+--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/SwapChain9.cpp
++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/SwapChain9.cpp
+@@ -236,7 +236,7 @@ EGLint SwapChain9::reset(int backbufferWidth, int backbufferHeight, EGLint swapI
}
-diff --git a/src/3rdparty/angle/src/libGLESv2/utilities.cpp b/src/3rdparty/angle/src/libGLESv2/utilities.cpp
-index 32df49e..30765ff 100644
---- a/src/3rdparty/angle/src/libGLESv2/utilities.cpp
-+++ b/src/3rdparty/angle/src/libGLESv2/utilities.cpp
-@@ -9,6 +9,14 @@
-
- #include "libGLESv2/utilities.h"
- #include "libGLESv2/mathutil.h"
-+#if defined(ANGLE_OS_WINRT)
-+# include <locale>
-+# include <codecvt>
-+# include <wrl.h>
-+# include <windows.storage.h>
-+ using namespace Microsoft::WRL;
-+ using namespace ABI::Windows::Storage;
-+#endif
-
- namespace gl
+ // parameters should be validated/clamped by caller
+-EGLint SwapChain9::swapRect(EGLint x, EGLint y, EGLint width, EGLint height)
++EGLint SwapChain9::swapRect(EGLint x, EGLint y, EGLint width, EGLint height, EGLint)
{
-@@ -737,6 +745,7 @@ bool IsTriangleMode(GLenum drawMode)
-
- std::string getTempPath()
- {
-+#if !defined(ANGLE_OS_WINRT)
- char path[MAX_PATH];
- DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
- if (pathLen == 0)
-@@ -751,6 +760,45 @@ std::string getTempPath()
- UNREACHABLE();
- return std::string();
- }
-+#else
-+ static std::string path;
-+
-+ while (path.empty()) {
-+ ComPtr<IApplicationDataStatics> factory;
-+ Wrappers::HStringReference classId(RuntimeClass_Windows_Storage_ApplicationData);
-+ HRESULT result = RoGetActivationFactory(classId.Get(), IID_PPV_ARGS(&factory));
-+ if (FAILED(result))
-+ break;
-+
-+ ComPtr<IApplicationData> applicationData;
-+ result = factory->get_Current(&applicationData);
-+ if (FAILED(result))
-+ break;
-+
-+ ComPtr<IStorageFolder> storageFolder;
-+ result = applicationData->get_LocalFolder(&storageFolder);
-+ if (FAILED(result))
-+ break;
-+
-+ ComPtr<IStorageItem> localFolder;
-+ result = storageFolder.As(&localFolder);
-+ if (FAILED(result))
-+ break;
-+
-+ HSTRING localFolderPath;
-+ result = localFolder->get_Path(&localFolderPath);
-+ if (FAILED(result))
-+ break;
-+
-+ std::wstring_convert< std::codecvt_utf8<wchar_t> > converter;
-+ path = converter.to_bytes(WindowsGetStringRawBuffer(localFolderPath, NULL));
-+ if (path.empty())
-+ {
-+ UNREACHABLE();
-+ break;
-+ }
-+ }
-+#endif
-
- return path;
- }
+ if (!mSwapChain)
+ {
+diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/SwapChain9.h b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/SwapChain9.h
+index 16a62bd..4d756f8 100644
+--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/SwapChain9.h
++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/SwapChain9.h
+@@ -25,7 +25,7 @@ class SwapChain9 : public SwapChain
+
+ 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 EGLint swapRect(EGLint x, EGLint y, EGLint width, EGLint height, EGLint);
+ virtual void recreate();
+
+ virtual IDirect3DSurface9 *getRenderTarget();
--
-1.8.4.msysgit.0
+1.9.0.msysgit.0