From 6b52e6ead90d718c2704590472d34adbbea86548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Br=C3=BCning?= Date: Wed, 27 Aug 2014 12:42:00 +0200 Subject: Let ANGLE use multithreaded devices if necessary. This is needed to prevent lock-ups in application that use ANGLE from multiple threads, as e.g. QtWebEngine based applications do. The environment variable QT_D3DCREATE_MULTITHREADED is used to communicate this from the QtWebEngine module. Change-Id: Ibd5a5c75eb68af567d420d9a35efb3490c93b27c Reviewed-by: Zeno Albisser --- src/3rdparty/angle/src/common/platform.h | 1 + .../libGLESv2/renderer/d3d/d3d11/Renderer11.cpp | 13 ++++ .../src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp | 4 ++ ...LE-use-multithreaded-devices-if-necessary.patch | 72 ++++++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 src/angle/patches/0014-Let-ANGLE-use-multithreaded-devices-if-necessary.patch diff --git a/src/3rdparty/angle/src/common/platform.h b/src/3rdparty/angle/src/common/platform.h index e16e7ac0c2..cedc6f2f22 100644 --- a/src/3rdparty/angle/src/common/platform.h +++ b/src/3rdparty/angle/src/common/platform.h @@ -56,6 +56,7 @@ # if defined(ANGLE_ENABLE_D3D11) # include +# include # include # include # include 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 17a13f97d6..651b065ca2 100644 --- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp +++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp @@ -305,6 +305,19 @@ EGLint Renderer11::initialize() mMaxSupportedSamples = std::max(mMaxSupportedSamples, support.maxSupportedSamples); } +#if !defined(ANGLE_PLATFORM_WINRT) + static wchar_t *qt_d3dcreate_multihreaded_var = _wgetenv(L"QT_D3DCREATE_MULTITHREADED"); + if (qt_d3dcreate_multihreaded_var && wcsstr(qt_d3dcreate_multihreaded_var, L"1")) + { + ID3D10Multithread *multithread; + result = mDevice->QueryInterface(IID_PPV_ARGS(&multithread)); + ASSERT(SUCCEEDED(result)); + result = multithread->SetMultithreadProtected(true); + ASSERT(SUCCEEDED(result)); + multithread->Release(); + } +#endif + initializeDevice(); return EGL_SUCCESS; diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp index 491c27a6ab..2c8a79f964 100644 --- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp +++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp @@ -319,6 +319,10 @@ EGLint Renderer9::initialize() D3DPRESENT_PARAMETERS presentParameters = getDefaultPresentParameters(); DWORD behaviorFlags = D3DCREATE_FPU_PRESERVE | D3DCREATE_NOWINDOWCHANGES; + static wchar_t *qt_d3dcreate_multihreaded_var = _wgetenv(L"QT_D3DCREATE_MULTITHREADED"); + if (qt_d3dcreate_multihreaded_var && wcsstr(qt_d3dcreate_multihreaded_var, L"1")) + behaviorFlags |= D3DCREATE_MULTITHREADED; + { TRACE_EVENT0("gpu", "D3d9_CreateDevice"); result = mD3d9->CreateDevice(mAdapter, mDeviceType, mDeviceWindow, behaviorFlags | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, &presentParameters, &mDevice); diff --git a/src/angle/patches/0014-Let-ANGLE-use-multithreaded-devices-if-necessary.patch b/src/angle/patches/0014-Let-ANGLE-use-multithreaded-devices-if-necessary.patch new file mode 100644 index 0000000000..1e60f0c54a --- /dev/null +++ b/src/angle/patches/0014-Let-ANGLE-use-multithreaded-devices-if-necessary.patch @@ -0,0 +1,72 @@ +From d52fac0c0b5d12cd117ae4b871f0ac6a202755ad Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20Br=C3=BCning?= +Date: Wed, 27 Aug 2014 12:42:00 +0200 +Subject: [PATCH] Let ANGLE use multithreaded devices if necessary. + +This is needed to prevent lock-ups in application that use ANGLE from +multiple threads, as e.g. QtWebEngine based applications do. + +The environment variable QT_D3DCREATE_MULTITHREADED is used to +communicate this from the QtWebEngine module. + +Change-Id: Ibd5a5c75eb68af567d420d9a35efb3490c93b27c +--- + src/3rdparty/angle/src/common/platform.h | 1 + + .../angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp | 13 +++++++++++++ + .../angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp | 4 ++++ + 3 files changed, 18 insertions(+) + +diff --git a/src/3rdparty/angle/src/common/platform.h b/src/3rdparty/angle/src/common/platform.h +index e16e7ac..cedc6f2 100644 +--- a/src/3rdparty/angle/src/common/platform.h ++++ b/src/3rdparty/angle/src/common/platform.h +@@ -56,6 +56,7 @@ + + # if defined(ANGLE_ENABLE_D3D11) + # include ++# include + # include + # include + # include +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 17a13f9..651b065 100644 +--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp ++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp +@@ -305,6 +305,19 @@ EGLint Renderer11::initialize() + mMaxSupportedSamples = std::max(mMaxSupportedSamples, support.maxSupportedSamples); + } + ++#if !defined(ANGLE_PLATFORM_WINRT) ++ static wchar_t *qt_d3dcreate_multihreaded_var = _wgetenv(L"QT_D3DCREATE_MULTITHREADED"); ++ if (qt_d3dcreate_multihreaded_var && wcsstr(qt_d3dcreate_multihreaded_var, L"1")) ++ { ++ ID3D10Multithread *multithread; ++ result = mDevice->QueryInterface(IID_PPV_ARGS(&multithread)); ++ ASSERT(SUCCEEDED(result)); ++ result = multithread->SetMultithreadProtected(true); ++ ASSERT(SUCCEEDED(result)); ++ multithread->Release(); ++ } ++#endif ++ + initializeDevice(); + + return EGL_SUCCESS; +diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp +index 491c27a..2c8a79f 100644 +--- a/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp ++++ b/src/3rdparty/angle/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp +@@ -319,6 +319,10 @@ EGLint Renderer9::initialize() + D3DPRESENT_PARAMETERS presentParameters = getDefaultPresentParameters(); + DWORD behaviorFlags = D3DCREATE_FPU_PRESERVE | D3DCREATE_NOWINDOWCHANGES; + ++ static wchar_t *qt_d3dcreate_multihreaded_var = _wgetenv(L"QT_D3DCREATE_MULTITHREADED"); ++ if (qt_d3dcreate_multihreaded_var && wcsstr(qt_d3dcreate_multihreaded_var, L"1")) ++ behaviorFlags |= D3DCREATE_MULTITHREADED; ++ + { + TRACE_EVENT0("gpu", "D3d9_CreateDevice"); + result = mD3d9->CreateDevice(mAdapter, mDeviceType, mDeviceWindow, behaviorFlags | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, &presentParameters, &mDevice); +-- +1.8.3.2 + -- cgit v1.2.3