diff --git a/gfx/angle/include/EGL/eglext.h b/gfx/angle/include/EGL/eglext.h index 9e29605cf0eec..6033404564b66 100644 --- a/gfx/angle/include/EGL/eglext.h +++ b/gfx/angle/include/EGL/eglext.h @@ -458,6 +458,11 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSu #define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x3208 #endif /* EGL_ANGLE_platform_angle_opengl */ +#ifndef EGL_ANGLE_keyed_mutex +#define EGL_ANGLE_keyed_mutex 1 +#define EGL_DXGI_KEYED_MUTEX_ANGLE 0x3209 +#endif /* EGL_ANGLE_keyed_mutex */ + #ifndef EGL_ARM_pixmap_multisample_discard #define EGL_ARM_pixmap_multisample_discard 1 #define EGL_DISCARD_SAMPLES_ARM 0x3286 diff --git a/gfx/angle/src/libEGL/libEGL.cpp b/gfx/angle/src/libEGL/libEGL.cpp index 1b08466a7ec56..8a5c9f60856d6 100644 --- a/gfx/angle/src/libEGL/libEGL.cpp +++ b/gfx/angle/src/libEGL/libEGL.cpp @@ -495,6 +495,12 @@ EGLBoolean __stdcall eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surf *value = (void*) (swapchain ? swapchain->getShareHandle() : NULL); } break; + case EGL_DXGI_KEYED_MUTEX_ANGLE: + { + rx::SwapChain *swapchain = eglSurface->getSwapChain(); + *value = (void*) (swapchain ? swapchain->getKeyedMutex() : NULL); + } + break; default: return egl::error(EGL_BAD_ATTRIBUTE, EGL_FALSE); } diff --git a/gfx/angle/src/libGLESv2/moz.build b/gfx/angle/src/libGLESv2/moz.build index b45bec4b448ee..e2b58c428d059 100644 --- a/gfx/angle/src/libGLESv2/moz.build +++ b/gfx/angle/src/libGLESv2/moz.build @@ -171,10 +171,11 @@ if CONFIG['MOZ_HAS_WINSDK_WITH_D3D']: 'renderer/d3d/d3d11/RenderStateCache.cpp', 'renderer/d3d/d3d11/RenderTarget11.cpp', 'renderer/d3d/d3d11/ShaderExecutable11.cpp', - 'renderer/d3d/d3d11/SwapChain11.cpp', 'renderer/d3d/d3d11/TextureStorage11.cpp', 'renderer/d3d/d3d11/VertexBuffer11.cpp', ] + SOURCES += ['renderer/d3d/d3d11/SwapChain11.cpp'] + SOURCES['renderer/d3d/d3d11/SwapChain11.cpp'].flags += ['-DANGLE_RESOURCE_SHARE_TYPE=D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX'] if CONFIG['GNU_CXX']: diff --git a/gfx/angle/src/libGLESv2/renderer/SwapChain.h b/gfx/angle/src/libGLESv2/renderer/SwapChain.h index e742cc3b77523..f985fd9a94a4b 100644 --- a/gfx/angle/src/libGLESv2/renderer/SwapChain.h +++ b/gfx/angle/src/libGLESv2/renderer/SwapChain.h @@ -40,6 +40,7 @@ class SwapChain virtual void recreate() = 0; virtual HANDLE getShareHandle() {return mShareHandle;}; + virtual void* getKeyedMutex() {return NULL;}; protected: rx::NativeWindow mNativeWindow; // Handler for the Window that the surface is created for. diff --git a/gfx/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.cpp b/gfx/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.cpp index 021b8e204d27d..6faa8009fbdc7 100644 --- a/gfx/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.cpp +++ b/gfx/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.cpp @@ -17,6 +17,11 @@ #include "common/NativeWindow.h" +// This can be defined to other values like D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX as needed +#ifndef ANGLE_RESOURCE_SHARE_TYPE +#define ANGLE_RESOURCE_SHARE_TYPE D3D11_RESOURCE_MISC_SHARED +#endif + namespace rx { @@ -26,6 +31,7 @@ SwapChain11::SwapChain11(Renderer11 *renderer, rx::NativeWindow nativeWindow, HA SwapChain(nativeWindow, shareHandle, backBufferFormat, depthBufferFormat) { mSwapChain = NULL; + mKeyedMutex = NULL; mBackBufferTexture = NULL; mBackBufferRTView = NULL; mOffscreenTexture = NULL; @@ -54,6 +60,7 @@ SwapChain11::~SwapChain11() void SwapChain11::release() { SafeRelease(mSwapChain); + SafeRelease(mKeyedMutex); SafeRelease(mBackBufferTexture); SafeRelease(mBackBufferRTView); SafeRelease(mOffscreenTexture); @@ -161,7 +168,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei offscreenTextureDesc.Usage = D3D11_USAGE_DEFAULT; offscreenTextureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; offscreenTextureDesc.CPUAccessFlags = 0; - offscreenTextureDesc.MiscFlags = useSharedResource ? D3D11_RESOURCE_MISC_SHARED : 0; + offscreenTextureDesc.MiscFlags = useSharedResource ? ANGLE_RESOURCE_SHARE_TYPE : 0; HRESULT result = device->CreateTexture2D(&offscreenTextureDesc, NULL, &mOffscreenTexture); @@ -205,6 +212,18 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei } } } + IDXGIKeyedMutex *keyedMutex = NULL; + result = mOffscreenTexture->QueryInterface(__uuidof(IDXGIKeyedMutex), (void**)&keyedMutex); + + if (FAILED(result)) + { + mKeyedMutex = NULL; + } + else + { + mKeyedMutex = keyedMutex; + } + } diff --git a/gfx/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.h b/gfx/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.h index ae2e350adbb39..781a11f137204 100644 --- a/gfx/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.h +++ b/gfx/angle/src/libGLESv2/renderer/d3d/d3d11/SwapChain11.h @@ -38,6 +38,7 @@ class SwapChain11 : public SwapChain EGLint getWidth() const { return mWidth; } EGLint getHeight() const { return mHeight; } + virtual void* getKeyedMutex() { return mKeyedMutex; }; static SwapChain11 *makeSwapChain11(SwapChain *swapChain); @@ -57,6 +58,7 @@ class SwapChain11 : public SwapChain bool mPassThroughResourcesInit; IDXGISwapChain *mSwapChain; + IDXGIKeyedMutex *mKeyedMutex; ID3D11Texture2D *mBackBufferTexture; ID3D11RenderTargetView *mBackBufferRTView;