| From 2f2aabec376cb749a7d0db9e7f754fbfd28b8a72 Mon Sep 17 00:00:00 2001 |
| From: Oliver Wolff <oliver.wolff@qt.io> |
| 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 |
| |