summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/3rdparty/angle/src/libEGL/libEGL.cpp47
-rw-r--r--src/angle/patches/0013-ANGLE-Add-support-for-querying-platform-device.patch97
2 files changed, 134 insertions, 10 deletions
diff --git a/src/3rdparty/angle/src/libEGL/libEGL.cpp b/src/3rdparty/angle/src/libEGL/libEGL.cpp
index a08e1edeab..c236d52a4f 100644
--- a/src/3rdparty/angle/src/libEGL/libEGL.cpp
+++ b/src/3rdparty/angle/src/libEGL/libEGL.cpp
@@ -15,6 +15,9 @@
#include "libGLESv2/Texture.h"
#include "libGLESv2/main.h"
#include "libGLESv2/renderer/SwapChain.h"
+#if defined(ANGLE_ENABLE_D3D11)
+# include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
+#endif
#include "libEGL/main.h"
#include "libEGL/Display.h"
@@ -481,24 +484,48 @@ EGLBoolean __stdcall eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surf
egl::Display *display = static_cast<egl::Display*>(dpy);
egl::Surface *eglSurface = (egl::Surface*)surface;
- if (!validateSurface(display, eglSurface))
- {
- return EGL_FALSE;
- }
-
- if (surface == EGL_NO_SURFACE)
- {
- return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
- }
-
switch (attribute)
{
case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
{
+ if (!validateSurface(display, eglSurface))
+ {
+ return EGL_FALSE;
+ }
+
+ if (surface == EGL_NO_SURFACE)
+ {
+ return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
+ }
+
rx::SwapChain *swapchain = eglSurface->getSwapChain();
*value = (void*) (swapchain ? swapchain->getShareHandle() : NULL);
}
break;
+#if defined(ANGLE_ENABLE_D3D11)
+ case EGL_DEVICE_EXT:
+ {
+ if (!validateDisplay(display))
+ {
+ return EGL_FALSE;
+ }
+
+ rx::Renderer *renderer = display->getRenderer();
+ if (!renderer)
+ {
+ *value = NULL;
+ break;
+ }
+
+ if (renderer->getMajorShaderModel() < 4)
+ {
+ return egl::error(EGL_BAD_CONTEXT, EGL_FALSE);
+ }
+
+ *value = static_cast<rx::Renderer11*>(renderer)->getDevice();
+ }
+ break;
+#endif
default:
return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
}
diff --git a/src/angle/patches/0013-ANGLE-Add-support-for-querying-platform-device.patch b/src/angle/patches/0013-ANGLE-Add-support-for-querying-platform-device.patch
new file mode 100644
index 0000000000..7079b464a9
--- /dev/null
+++ b/src/angle/patches/0013-ANGLE-Add-support-for-querying-platform-device.patch
@@ -0,0 +1,97 @@
+From f506d5b7f03110fd31466ca20e46375f1316ac41 Mon Sep 17 00:00:00 2001
+From: Andrew Knight <andrew.knight@digia.com>
+Date: Mon, 28 Jul 2014 10:14:09 +0300
+Subject: [PATCH] ANGLE: Add support for querying platform device
+
+The EGL_EXT_device_base extension allows for querying the platform
+device of the graphics hardware via eglQueryDisplayAttribEXT().
+As that extension is not supported by ANGLE, this patch adds similar
+functionality to the existing eglQuerySurfacePointerANGLE API. When
+EGL_DEVICE_EXT is passed as the queried attribute, the underlying
+D3D/DXGI device pointer is passed back to the caller via the value
+argument.
+
+The D3D device is needed for video support in QtMultimedia as well as
+the IDXGIDevice3::Trim() calls required by the Windows Store.
+
+Change-Id: Ibdf228d81d6604e56db9dd8597d7cd2983ebc428
+---
+ src/3rdparty/angle/src/libEGL/libEGL.cpp | 47 +++++++++++++++++++++++++-------
+ 1 file changed, 37 insertions(+), 10 deletions(-)
+
+diff --git a/src/3rdparty/angle/src/libEGL/libEGL.cpp b/src/3rdparty/angle/src/libEGL/libEGL.cpp
+index a08e1ed..c236d52 100644
+--- a/src/3rdparty/angle/src/libEGL/libEGL.cpp
++++ b/src/3rdparty/angle/src/libEGL/libEGL.cpp
+@@ -15,6 +15,9 @@
+ #include "libGLESv2/Texture.h"
+ #include "libGLESv2/main.h"
+ #include "libGLESv2/renderer/SwapChain.h"
++#if defined(ANGLE_ENABLE_D3D11)
++# include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
++#endif
+
+ #include "libEGL/main.h"
+ #include "libEGL/Display.h"
+@@ -481,24 +484,48 @@ EGLBoolean __stdcall eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surf
+ egl::Display *display = static_cast<egl::Display*>(dpy);
+ egl::Surface *eglSurface = (egl::Surface*)surface;
+
+- if (!validateSurface(display, eglSurface))
+- {
+- return EGL_FALSE;
+- }
+-
+- if (surface == EGL_NO_SURFACE)
+- {
+- return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
+- }
+-
+ switch (attribute)
+ {
+ case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
+ {
++ if (!validateSurface(display, eglSurface))
++ {
++ return EGL_FALSE;
++ }
++
++ if (surface == EGL_NO_SURFACE)
++ {
++ return egl::error(EGL_BAD_SURFACE, EGL_FALSE);
++ }
++
+ rx::SwapChain *swapchain = eglSurface->getSwapChain();
+ *value = (void*) (swapchain ? swapchain->getShareHandle() : NULL);
+ }
+ break;
++#if defined(ANGLE_ENABLE_D3D11)
++ case EGL_DEVICE_EXT:
++ {
++ if (!validateDisplay(display))
++ {
++ return EGL_FALSE;
++ }
++
++ rx::Renderer *renderer = display->getRenderer();
++ if (!renderer)
++ {
++ *value = NULL;
++ break;
++ }
++
++ if (renderer->getMajorShaderModel() < 4)
++ {
++ return egl::error(EGL_BAD_CONTEXT, EGL_FALSE);
++ }
++
++ *value = static_cast<rx::Renderer11*>(renderer)->getDevice();
++ }
++ break;
++#endif
+ default:
+ return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
+ }
+--
+1.9.0.msysgit.0
+