Bug 1092582. Add support to ANGLE for using IDXGIKeyedMutex.

This commit is contained in:
Jeff Muizelaar 2014-11-01 14:11:02 -04:00
parent 9d622e3111
commit a0f8fa61fd
6 changed files with 36 additions and 2 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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']:

View File

@ -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.

View File

@ -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;
}
}

View File

@ -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;