From 2f2aabec376cb749a7d0db9e7f754fbfd28b8a72 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Wed, 22 Aug 2018 12:58:13 +0200 Subject: [PATCH 2/8] 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: Ib3dfd3edc47dbcc02b07f71980ba785508f2ee57 --- src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp | 4 ++++ src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h | 1 + src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp | 5 +++++ src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h | 2 ++ 4 files changed, 12 insertions(+) diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp index 8e78b71a36..ceb022d14c 100644 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp +++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp @@ -351,6 +351,10 @@ egl::Error SurfaceD3D::querySurfacePointerANGLE(EGLint attribute, void **value) { *value = mSwapChain->getKeyedMutex(); } + else if (attribute == EGL_DEVICE_EXT) + { + *value = mSwapChain->getDevice(); + } else UNREACHABLE(); return egl::NoError(); diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h index 81c3d13da4..017737b878 100644 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h +++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/SwapChainD3D.h @@ -58,6 +58,7 @@ class SwapChainD3D : angle::NonCopyable EGLint width, EGLint height) = 0; virtual void recreate() = 0; + virtual void *getDevice() { return nullptr; } virtual RenderTargetD3D *getColorRenderTarget() = 0; virtual RenderTargetD3D *getDepthStencilRenderTarget() = 0; diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp index 19bcaae776..05bb5d9863 100644 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp +++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp @@ -1007,6 +1007,11 @@ void SwapChain11::recreate() // possibly should use this method instead of reset } +void *rx::SwapChain11::getDevice() +{ + return mRenderer->getDevice(); +} + RenderTargetD3D *SwapChain11::getColorRenderTarget() { return &mColorRenderTarget; diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h index 5ce2af193d..eca068210b 100644 --- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h +++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h @@ -61,6 +61,8 @@ class SwapChain11 final : public SwapChainD3D void *getKeyedMutex() override; EGLint getSamples() const { return mEGLSamples; } + void *getDevice() override; + egl::Error getSyncValues(EGLuint64KHR *ust, EGLuint64KHR *msc, EGLuint64KHR *sbc) override; private: -- 2.15.0.windows.1