diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2012-11-06 09:25:13 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-11-06 16:35:11 +0100 |
commit | 92cd94ed1d468554da9e3378a6ce5920b2cfc3c7 (patch) | |
tree | 1f4de01735f4f012dee03d0ad5069057ab3dd2a3 /src/3rdparty/angle/src | |
parent | 15fc255c7c0a6a693c754734c39c37bd50b0634b (diff) |
Dynamically resolve functions of dwmapi.dll.
The library is not present on Windows XP, for which /DELAYLOAD
is used in ANGLE. However, as this causes problems with MinGW,
use dynamic resolution.
Task-number: QTBUG-27741
Change-Id: Ie4a2706d57b751fbb6fc6f3e76ef2e8ddac3b892
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/3rdparty/angle/src')
-rw-r--r-- | src/3rdparty/angle/src/libEGL/Surface.cpp | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/src/3rdparty/angle/src/libEGL/Surface.cpp b/src/3rdparty/angle/src/libEGL/Surface.cpp index 732c404b10..34df14cbb2 100644 --- a/src/3rdparty/angle/src/libEGL/Surface.cpp +++ b/src/3rdparty/angle/src/libEGL/Surface.cpp @@ -73,6 +73,9 @@ Surface::~Surface() bool Surface::initialize() { + typedef HRESULT (STDAPICALLTYPE *PtrDwmIsCompositionEnabled)(BOOL*); + typedef HRESULT (STDAPICALLTYPE *PtrDwmSetPresentParameters)(HWND, DWM_PRESENT_PARAMETERS *); + ASSERT(!mSwapChain && !mOffscreenTexture && !mDepthStencil); if (!resetSwapChain()) @@ -82,17 +85,31 @@ bool Surface::initialize() // to minimize the amount of queuing done by DWM between our calls to // present and the actual screen. if (mWindow && (getComparableOSVersion() >= versionWindowsVista)) { - BOOL isComposited; - HRESULT result = DwmIsCompositionEnabled(&isComposited); - if (SUCCEEDED(result) && isComposited) { - DWM_PRESENT_PARAMETERS presentParams; - memset(&presentParams, 0, sizeof(presentParams)); - presentParams.cbSize = sizeof(DWM_PRESENT_PARAMETERS); - presentParams.cBuffer = 2; - - result = DwmSetPresentParameters(mWindow, &presentParams); - if (FAILED(result)) - ERR("Unable to set present parameters: 0x%08X", result); + // Resolve dwmapi.dll functions dynamically as the Library is + // not present on Windows XP. Alternatively, /DELAYLOAD could be used. + static PtrDwmIsCompositionEnabled dwmIsCompositionEnabled = 0; + static PtrDwmSetPresentParameters dwmSetPresentParameters = 0; + if (!dwmIsCompositionEnabled) { + if (const HMODULE dwmLibrary = LoadLibraryW(L"dwmapi.dll")) { + dwmIsCompositionEnabled = + (PtrDwmIsCompositionEnabled)GetProcAddress(dwmLibrary, "DwmIsCompositionEnabled"); + dwmSetPresentParameters = + (PtrDwmSetPresentParameters)GetProcAddress(dwmLibrary, "DwmSetPresentParameters"); + } + } + if (dwmIsCompositionEnabled && dwmSetPresentParameters) { + BOOL isComposited; + HRESULT result = dwmIsCompositionEnabled(&isComposited); + if (SUCCEEDED(result) && isComposited) { + DWM_PRESENT_PARAMETERS presentParams; + memset(&presentParams, 0, sizeof(presentParams)); + presentParams.cbSize = sizeof(DWM_PRESENT_PARAMETERS); + presentParams.cBuffer = 2; + + result = dwmSetPresentParameters(mWindow, &presentParams); + if (FAILED(result)) + ERR("Unable to set present parameters: 0x%08X", result); + } } } |