diff options
author | Andrew Knight <andrew.knight@digia.com> | 2013-09-18 11:51:20 +0300 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-19 08:53:35 +0200 |
commit | 1a334f8135d4be7b73b39ac736af0e722c864e83 (patch) | |
tree | cc0b7703b815e9fca858e8eecd7eb556e186998c /src/3rdparty/angle/src/libEGL | |
parent | d84ed9a92ae0ce96b843c9dd5c263c6a0925405b (diff) |
ANGLE: Update to version 2446
Update ANGLE and reapply patches.
Patch changes:
"Dynamically resolve functions of dwmapi.dll"
Removed; ANGLE no longer uses DWM API
"Make it possible to link ANGLE statically for single-thread use"
Avoid name collision by using ANGLE-style getCurrent()
"Fix build when SSE2 is not available."
Added guard for __cpuid(), which is not available on ARM
"Make DX9/DX11 mutually exclusive"
Adjustments due to underlying code changes
"ANGLE: Avoid memory copies on buffers when data is null"
Removed; fixed upstream
"Add missing intrin.h include for __cpuid"
Removed; fixed upstream
Change-Id: I4f3d850fc555d3194ddc05e0b51c4966d33f7eaf
Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/3rdparty/angle/src/libEGL')
-rw-r--r-- | src/3rdparty/angle/src/libEGL/Display.cpp | 45 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/Display.h | 7 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/Surface.cpp | 37 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/libEGL.cpp | 21 | ||||
-rw-r--r-- | src/3rdparty/angle/src/libEGL/main.cpp | 61 |
5 files changed, 81 insertions, 90 deletions
diff --git a/src/3rdparty/angle/src/libEGL/Display.cpp b/src/3rdparty/angle/src/libEGL/Display.cpp index d5d0f0f831..a382c3b1eb 100644 --- a/src/3rdparty/angle/src/libEGL/Display.cpp +++ b/src/3rdparty/angle/src/libEGL/Display.cpp @@ -1,5 +1,5 @@ // -// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. +// 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 // found in the LICENSE file. // @@ -38,31 +38,16 @@ egl::Display *Display::getDisplay(EGLNativeDisplayType displayId) return displays[displayId]; } - egl::Display *display = NULL; + // FIXME: Check if displayId is a valid display device context - if (displayId == EGL_DEFAULT_DISPLAY) - { - display = new egl::Display(displayId, (HDC)NULL, false); - } - else if (displayId == EGL_SOFTWARE_DISPLAY_ANGLE) - { - display = new egl::Display(displayId, (HDC)NULL, true); - } - else - { - // FIXME: Check if displayId is a valid display device context - - display = new egl::Display(displayId, (HDC)displayId, false); - } + egl::Display *display = new egl::Display(displayId, (HDC)displayId); displays[displayId] = display; return display; } -Display::Display(EGLNativeDisplayType displayId, HDC deviceContext, bool software) : mDc(deviceContext) +Display::Display(EGLNativeDisplayType displayId, HDC deviceContext) : mDc(deviceContext) { - - mSoftwareDevice = software; mDisplayId = displayId; mRenderer = NULL; } @@ -86,7 +71,7 @@ bool Display::initialize() return true; } - mRenderer = glCreateRenderer(this, mDc, mSoftwareDevice); + mRenderer = glCreateRenderer(this, mDc, mDisplayId); if (!mRenderer) { @@ -128,6 +113,7 @@ bool Display::initialize() } initExtensionString(); + initVendorString(); return true; } @@ -528,5 +514,24 @@ const char *Display::getExtensionString() const return mExtensionString.c_str(); } +void Display::initVendorString() +{ + mVendorString = "Google Inc."; + + LUID adapterLuid = {0}; + + if (mRenderer && mRenderer->getLUID(&adapterLuid)) + { + char adapterLuidString[64]; + sprintf_s(adapterLuidString, sizeof(adapterLuidString), " (adapter LUID: %08x%08x)", adapterLuid.HighPart, adapterLuid.LowPart); + + mVendorString += adapterLuidString; + } +} + +const char *Display::getVendorString() const +{ + return mVendorString.c_str(); +} } diff --git a/src/3rdparty/angle/src/libEGL/Display.h b/src/3rdparty/angle/src/libEGL/Display.h index 8c71e51b7a..58c3940331 100644 --- a/src/3rdparty/angle/src/libEGL/Display.h +++ b/src/3rdparty/angle/src/libEGL/Display.h @@ -1,5 +1,5 @@ // -// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. +// 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 // found in the LICENSE file. // @@ -60,11 +60,12 @@ class Display virtual void recreateSwapChains(); const char *getExtensionString() const; + const char *getVendorString() const; private: DISALLOW_COPY_AND_ASSIGN(Display); - Display(EGLNativeDisplayType displayId, HDC deviceContext, bool software); + Display(EGLNativeDisplayType displayId, HDC deviceContext); bool restoreLostDevice(); @@ -84,7 +85,9 @@ class Display rx::Renderer *mRenderer; void initExtensionString(); + void initVendorString(); std::string mExtensionString; + std::string mVendorString; }; } diff --git a/src/3rdparty/angle/src/libEGL/Surface.cpp b/src/3rdparty/angle/src/libEGL/Surface.cpp index a430a3530f..b47a7bcc20 100644 --- a/src/3rdparty/angle/src/libEGL/Surface.cpp +++ b/src/3rdparty/angle/src/libEGL/Surface.cpp @@ -20,8 +20,6 @@ #include "libEGL/main.h" #include "libEGL/Display.h" -#include <dwmapi.h> - namespace egl { @@ -71,44 +69,9 @@ Surface::~Surface() bool Surface::initialize() { - typedef HRESULT (STDAPICALLTYPE *PtrDwmIsCompositionEnabled)(BOOL*); - typedef HRESULT (STDAPICALLTYPE *PtrDwmSetPresentParameters)(HWND, DWM_PRESENT_PARAMETERS *); - if (!resetSwapChain()) return false; - // Modify present parameters for this window, if we are composited, - // to minimize the amount of queuing done by DWM between our calls to - // present and the actual screen. - if (mWindow && (getComparableOSVersion() >= versionWindowsVista)) { - // 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); - } - } - } - return true; } diff --git a/src/3rdparty/angle/src/libEGL/libEGL.cpp b/src/3rdparty/angle/src/libEGL/libEGL.cpp index 7fca456cf5..6e10c3926d 100644 --- a/src/3rdparty/angle/src/libEGL/libEGL.cpp +++ b/src/3rdparty/angle/src/libEGL/libEGL.cpp @@ -180,9 +180,9 @@ const char *__stdcall eglQueryString(EGLDisplay dpy, EGLint name) case EGL_CLIENT_APIS: return egl::success("OpenGL_ES"); case EGL_EXTENSIONS: - return display->getExtensionString(); + return egl::success(display->getExtensionString()); case EGL_VENDOR: - return egl::success("Google Inc."); + return egl::success(display->getVendorString()); case EGL_VERSION: return egl::success("1.4 (ANGLE " VERSION_STRING ")"); } @@ -888,15 +888,18 @@ EGLBoolean __stdcall eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface return EGL_FALSE; } - rx::Renderer *renderer = display->getRenderer(); - if (renderer->testDeviceLost(true)) + if (dpy != EGL_NO_DISPLAY) { - return EGL_FALSE; - } + rx::Renderer *renderer = display->getRenderer(); + if (renderer->testDeviceLost(true)) + { + return EGL_FALSE; + } - if (renderer->isDeviceLost()) - { - return egl::error(EGL_CONTEXT_LOST, EGL_FALSE); + if (renderer->isDeviceLost()) + { + return egl::error(EGL_CONTEXT_LOST, EGL_FALSE); + } } if ((draw != EGL_NO_SURFACE && !validateSurface(display, static_cast<egl::Surface*>(draw))) || diff --git a/src/3rdparty/angle/src/libEGL/main.cpp b/src/3rdparty/angle/src/libEGL/main.cpp index 7ba77f08d1..7dea5fc74b 100644 --- a/src/3rdparty/angle/src/libEGL/main.cpp +++ b/src/3rdparty/angle/src/libEGL/main.cpp @@ -88,72 +88,89 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved return TRUE; } -static inline egl::Current *current() -{ - return (egl::Current*)TlsGetValue(currentTLS); -} - -#else // !QT_OPENGL_ES_2_ANGLE_STATIC +#endif // !QT_OPENGL_ES_2_ANGLE_STATIC -static egl::Current *current() +namespace egl +{ +Current *getCurrent() { +#ifndef QT_OPENGL_ES_2_ANGLE_STATIC + return (Current*)TlsGetValue(currentTLS); +#else // No precautions for thread safety taken as ANGLE is used single-threaded in Qt. - static egl::Current curr = { EGL_SUCCESS, EGL_OPENGL_ES_API, EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE }; + static Current curr = { EGL_SUCCESS, EGL_OPENGL_ES_API, EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE }; return &curr; +#endif } -#endif // QT_OPENGL_ES_2_ANGLE_STATIC - -namespace egl -{ void setCurrentError(EGLint error) { - current()->error = error; + Current *current = getCurrent(); + + current->error = error; } EGLint getCurrentError() { - return current()->error; + Current *current = getCurrent(); + + return current->error; } void setCurrentAPI(EGLenum API) { - current()->API = API; + Current *current = getCurrent(); + + current->API = API; } EGLenum getCurrentAPI() { - return current()->API; + Current *current = getCurrent(); + + return current->API; } void setCurrentDisplay(EGLDisplay dpy) { - current()->display = dpy; + Current *current = getCurrent(); + + current->display = dpy; } EGLDisplay getCurrentDisplay() { - return current()->display; + Current *current = getCurrent(); + + return current->display; } void setCurrentDrawSurface(EGLSurface surface) { - current()->drawSurface = surface; + Current *current = getCurrent(); + + current->drawSurface = surface; } EGLSurface getCurrentDrawSurface() { - return current()->drawSurface; + Current *current = getCurrent(); + + return current->drawSurface; } void setCurrentReadSurface(EGLSurface surface) { - current()->readSurface = surface; + Current *current = getCurrent(); + + current->readSurface = surface; } EGLSurface getCurrentReadSurface() { - return current()->readSurface; + Current *current = getCurrent(); + + return current->readSurface; } void error(EGLint errorCode) |