Commit d17c016b by Jeff Muizelaar Committed by Geoff Lang

Add support for RESOURCE_MISC_SHARED_KEYEDMUTEX

Change-Id: I225f38b4616ac47e690dccbcb67074fedc571d61 Reviewed-on: https://chromium-review.googlesource.com/225642Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 2e5797e3
Name
ANGLE_keyed_mutex
Name Strings
EGL_ANGLE_keyed_mutex
Contributors
Jeff Muizelaar
Contacts
Jeff Muizelaar, Mozilla (jmuizelaar 'at' mozilla.org)
Status
Implemented in ANGLE.
Version
Version 1, Oct 29, 2014
Number
EGL Extension #??
Dependencies
Requires the EGL_ANGLE_query_surface_pointer extension.
This extension is written against the wording of the EGL 1.4
Specification.
Overview
Some EGL implementations generate EGLSurface handles that are
backed by Direct3D 11 2D textures. This extension allows
obtaining the IDXGIKeyedMutex for such EGL surfaces.
New Types
None
New Procedures and Functions
None
New Tokens
Accepted in the <attribute> parameter of eglQuerySurfacePointerANGLE:
EGL_DXGI_KEYED_MUTEX_ANGLE 0x33A2
Add to table 3.5, "Queryable surface attributes and types":
Attribute Type Description
--------- ---- -----------
EGL_DXGI_KEYED_MUTEX_ANGLE pointer IDXGIKeyedMutex
Add before the last paragraph in section 3.5, "Surface attributes":
"Querying EGL_DXGI_KEYED_MUTEX_ANGLE returns a IDXGIKeyedMutex, or NULL
if a keyed mutex for the surface is not available. The keyed mutex
must be queried using eglQuerySurfaceAttribPointerANGLE. Keyed Mutexes
are only available from EGL surfaces backed by Direct3D 11 surfaces.
Before using the keyed mutex, ensure that all rendering to the EGLSurface
with EGL client APIs has completed."
Issues
Revision History
Version 1, 2014/10/29 - first draft.
...@@ -470,6 +470,11 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSu ...@@ -470,6 +470,11 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSu
#define EGL_D3D11_DEVICE_ANGLE 0x33A1 #define EGL_D3D11_DEVICE_ANGLE 0x33A1
#endif /* EGL_ANGLE_device_d3d */ #endif /* EGL_ANGLE_device_d3d */
#ifndef EGL_ANGLE_keyed_mutex
#define EGL_ANGLE_keyed_mutex 1
#define EGL_DXGI_KEYED_MUTEX_ANGLE 0x33A2
#endif /* EGL_ANGLE_keyed_mutex */
#ifndef EGL_ARM_pixmap_multisample_discard #ifndef EGL_ARM_pixmap_multisample_discard
#define EGL_ARM_pixmap_multisample_discard 1 #define EGL_ARM_pixmap_multisample_discard 1
#define EGL_DISCARD_SAMPLES_ARM 0x3286 #define EGL_DISCARD_SAMPLES_ARM 0x3286
......
...@@ -512,6 +512,7 @@ DisplayExtensions::DisplayExtensions() ...@@ -512,6 +512,7 @@ DisplayExtensions::DisplayExtensions()
surfaceD3DTexture2DShareHandle(false), surfaceD3DTexture2DShareHandle(false),
querySurfacePointer(false), querySurfacePointer(false),
windowFixedSize(false), windowFixedSize(false),
keyedMutex(false),
postSubBuffer(false), postSubBuffer(false),
createContext(false), createContext(false),
deviceQuery(false), deviceQuery(false),
...@@ -536,6 +537,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const ...@@ -536,6 +537,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const
InsertExtensionString("EGL_ANGLE_surface_d3d_texture_2d_share_handle", surfaceD3DTexture2DShareHandle, &extensionStrings); InsertExtensionString("EGL_ANGLE_surface_d3d_texture_2d_share_handle", surfaceD3DTexture2DShareHandle, &extensionStrings);
InsertExtensionString("EGL_ANGLE_query_surface_pointer", querySurfacePointer, &extensionStrings); InsertExtensionString("EGL_ANGLE_query_surface_pointer", querySurfacePointer, &extensionStrings);
InsertExtensionString("EGL_ANGLE_window_fixed_size", windowFixedSize, &extensionStrings); InsertExtensionString("EGL_ANGLE_window_fixed_size", windowFixedSize, &extensionStrings);
InsertExtensionString("EGL_ANGLE_keyed_mutex", keyedMutex, &extensionStrings);
InsertExtensionString("EGL_NV_post_sub_buffer", postSubBuffer, &extensionStrings); InsertExtensionString("EGL_NV_post_sub_buffer", postSubBuffer, &extensionStrings);
InsertExtensionString("EGL_KHR_create_context", createContext, &extensionStrings); InsertExtensionString("EGL_KHR_create_context", createContext, &extensionStrings);
InsertExtensionString("EGL_EXT_device_query", deviceQuery, &extensionStrings); InsertExtensionString("EGL_EXT_device_query", deviceQuery, &extensionStrings);
......
...@@ -377,6 +377,9 @@ struct DisplayExtensions ...@@ -377,6 +377,9 @@ struct DisplayExtensions
// EGL_ANGLE_window_fixed_size // EGL_ANGLE_window_fixed_size
bool windowFixedSize; bool windowFixedSize;
// EGL_ANGLE_keyed_mutex
bool keyedMutex;
// EGL_NV_post_sub_buffer // EGL_NV_post_sub_buffer
bool postSubBuffer; bool postSubBuffer;
......
...@@ -321,6 +321,11 @@ void DisplayD3D::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -321,6 +321,11 @@ void DisplayD3D::generateExtensions(egl::DisplayExtensions *outExtensions) const
outExtensions->surfaceD3DTexture2DShareHandle = true; outExtensions->surfaceD3DTexture2DShareHandle = true;
} }
if (mRenderer->getKeyedMutexSupport())
{
outExtensions->keyedMutex = true;
}
outExtensions->querySurfacePointer = true; outExtensions->querySurfacePointer = true;
outExtensions->windowFixedSize = true; outExtensions->windowFixedSize = true;
......
...@@ -149,6 +149,7 @@ class RendererD3D : public Renderer, public BufferFactoryD3D ...@@ -149,6 +149,7 @@ class RendererD3D : public Renderer, public BufferFactoryD3D
virtual unsigned int getReservedVertexUniformBuffers() const = 0; virtual unsigned int getReservedVertexUniformBuffers() const = 0;
virtual unsigned int getReservedFragmentUniformBuffers() const = 0; virtual unsigned int getReservedFragmentUniformBuffers() const = 0;
virtual bool getShareHandleSupport() const = 0; virtual bool getShareHandleSupport() const = 0;
virtual bool getKeyedMutexSupport() const = 0;
virtual bool getPostSubBufferSupport() const = 0; virtual bool getPostSubBufferSupport() const = 0;
virtual int getMajorShaderModel() const = 0; virtual int getMajorShaderModel() const = 0;
......
...@@ -297,8 +297,16 @@ EGLint SurfaceD3D::isPostSubBufferSupported() const ...@@ -297,8 +297,16 @@ EGLint SurfaceD3D::isPostSubBufferSupported() const
egl::Error SurfaceD3D::querySurfacePointerANGLE(EGLint attribute, void **value) egl::Error SurfaceD3D::querySurfacePointerANGLE(EGLint attribute, void **value)
{ {
ASSERT(attribute == EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE); if (attribute == EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE)
*value = mSwapChain->getShareHandle(); {
*value = mSwapChain->getShareHandle();
}
else if (attribute == EGL_DXGI_KEYED_MUTEX_ANGLE)
{
*value = mSwapChain->getKeyedMutex();
}
else UNREACHABLE();
return egl::Error(EGL_SUCCESS); return egl::Error(EGL_SUCCESS);
} }
......
...@@ -49,6 +49,7 @@ class SwapChainD3D : angle::NonCopyable ...@@ -49,6 +49,7 @@ class SwapChainD3D : angle::NonCopyable
GLenum GetDepthBufferInternalFormat() const { return mDepthBufferFormat; } GLenum GetDepthBufferInternalFormat() const { return mDepthBufferFormat; }
HANDLE getShareHandle() { return mShareHandle; } HANDLE getShareHandle() { return mShareHandle; }
virtual void *getKeyedMutex() = 0;
protected: protected:
rx::NativeWindow mNativeWindow; // Handler for the Window that the surface is created for. rx::NativeWindow mNativeWindow; // Handler for the Window that the surface is created for.
......
...@@ -2552,6 +2552,15 @@ bool Renderer11::getShareHandleSupport() const ...@@ -2552,6 +2552,15 @@ bool Renderer11::getShareHandleSupport() const
return true; return true;
} }
bool Renderer11::getKeyedMutexSupport() const
{
#ifdef ANGLE_ENABLE_KEYEDMUTEX
return true;
#else
return false;
#endif
}
bool Renderer11::getPostSubBufferSupport() const bool Renderer11::getPostSubBufferSupport() const
{ {
// D3D11 does not support present with dirty rectangles until DXGI 1.2. // D3D11 does not support present with dirty rectangles until DXGI 1.2.
......
...@@ -161,6 +161,7 @@ class Renderer11 : public RendererD3D ...@@ -161,6 +161,7 @@ class Renderer11 : public RendererD3D
virtual unsigned int getReservedVertexUniformBuffers() const; virtual unsigned int getReservedVertexUniformBuffers() const;
virtual unsigned int getReservedFragmentUniformBuffers() const; virtual unsigned int getReservedFragmentUniformBuffers() const;
virtual bool getShareHandleSupport() const; virtual bool getShareHandleSupport() const;
bool getKeyedMutexSupport() const override;
virtual bool getPostSubBufferSupport() const; virtual bool getPostSubBufferSupport() const;
virtual int getMajorShaderModel() const; virtual int getMajorShaderModel() const;
......
...@@ -19,6 +19,12 @@ ...@@ -19,6 +19,12 @@
#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h" #include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h"
#include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h" #include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h"
#ifdef ANGLE_ENABLE_KEYEDMUTEX
#define ANGLE_RESOURCE_SHARE_TYPE D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX
#else
#define ANGLE_RESOURCE_SHARE_TYPE D3D11_RESOURCE_MISC_SHARED
#endif
namespace rx namespace rx
{ {
...@@ -38,6 +44,8 @@ SwapChain11::SwapChain11(Renderer11 *renderer, NativeWindow nativeWindow, HANDLE ...@@ -38,6 +44,8 @@ SwapChain11::SwapChain11(Renderer11 *renderer, NativeWindow nativeWindow, HANDLE
mSwapChain = NULL; mSwapChain = NULL;
mSwapChain1 = nullptr; mSwapChain1 = nullptr;
mKeyedMutex = nullptr;
mBackBufferTexture = NULL; mBackBufferTexture = NULL;
mBackBufferRTView = NULL; mBackBufferRTView = NULL;
...@@ -65,6 +73,7 @@ void SwapChain11::release() ...@@ -65,6 +73,7 @@ void SwapChain11::release()
{ {
SafeRelease(mSwapChain1); SafeRelease(mSwapChain1);
SafeRelease(mSwapChain); SafeRelease(mSwapChain);
SafeRelease(mKeyedMutex);
SafeRelease(mBackBufferTexture); SafeRelease(mBackBufferTexture);
SafeRelease(mBackBufferRTView); SafeRelease(mBackBufferRTView);
SafeRelease(mOffscreenTexture); SafeRelease(mOffscreenTexture);
...@@ -173,7 +182,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei ...@@ -173,7 +182,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
offscreenTextureDesc.Usage = D3D11_USAGE_DEFAULT; offscreenTextureDesc.Usage = D3D11_USAGE_DEFAULT;
offscreenTextureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; offscreenTextureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
offscreenTextureDesc.CPUAccessFlags = 0; 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); HRESULT result = device->CreateTexture2D(&offscreenTextureDesc, NULL, &mOffscreenTexture);
...@@ -217,6 +226,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei ...@@ -217,6 +226,7 @@ EGLint SwapChain11::resetOffscreenTexture(int backbufferWidth, int backbufferHei
} }
} }
} }
mKeyedMutex = d3d11::DynamicCastComObject<IDXGIKeyedMutex>(mOffscreenTexture);
} }
......
...@@ -42,6 +42,7 @@ class SwapChain11 : public SwapChainD3D ...@@ -42,6 +42,7 @@ class SwapChain11 : public SwapChainD3D
EGLint getWidth() const { return mWidth; } EGLint getWidth() const { return mWidth; }
EGLint getHeight() const { return mHeight; } EGLint getHeight() const { return mHeight; }
void *getKeyedMutex() override { return mKeyedMutex; }
private: private:
void release(); void release();
...@@ -59,6 +60,7 @@ class SwapChain11 : public SwapChainD3D ...@@ -59,6 +60,7 @@ class SwapChain11 : public SwapChainD3D
DXGISwapChain *mSwapChain; DXGISwapChain *mSwapChain;
IDXGISwapChain1 *mSwapChain1; IDXGISwapChain1 *mSwapChain1;
IDXGIKeyedMutex *mKeyedMutex;
ID3D11Texture2D *mBackBufferTexture; ID3D11Texture2D *mBackBufferTexture;
ID3D11RenderTargetView *mBackBufferRTView; ID3D11RenderTargetView *mBackBufferRTView;
......
...@@ -2506,6 +2506,11 @@ bool Renderer9::getShareHandleSupport() const ...@@ -2506,6 +2506,11 @@ bool Renderer9::getShareHandleSupport() const
return (mD3d9Ex != NULL) && !gl::DebugAnnotationsActive(); return (mD3d9Ex != NULL) && !gl::DebugAnnotationsActive();
} }
bool Renderer9::getKeyedMutexSupport() const
{
return false;
}
bool Renderer9::getPostSubBufferSupport() const bool Renderer9::getPostSubBufferSupport() const
{ {
return true; return true;
......
...@@ -144,6 +144,7 @@ class Renderer9 : public RendererD3D ...@@ -144,6 +144,7 @@ class Renderer9 : public RendererD3D
virtual unsigned int getReservedVertexUniformBuffers() const; virtual unsigned int getReservedVertexUniformBuffers() const;
virtual unsigned int getReservedFragmentUniformBuffers() const; virtual unsigned int getReservedFragmentUniformBuffers() const;
virtual bool getShareHandleSupport() const; virtual bool getShareHandleSupport() const;
bool getKeyedMutexSupport() const override;
virtual bool getPostSubBufferSupport() const; virtual bool getPostSubBufferSupport() const;
virtual int getMajorShaderModel() const; virtual int getMajorShaderModel() const;
......
...@@ -384,6 +384,12 @@ IDirect3DTexture9 *SwapChain9::getOffscreenTexture() ...@@ -384,6 +384,12 @@ IDirect3DTexture9 *SwapChain9::getOffscreenTexture()
return mOffscreenTexture; return mOffscreenTexture;
} }
void *SwapChain9::getKeyedMutex()
{
UNREACHABLE();
return nullptr;
}
void SwapChain9::recreate() void SwapChain9::recreate()
{ {
if (!mSwapChain) if (!mSwapChain)
......
...@@ -39,6 +39,8 @@ class SwapChain9 : public SwapChainD3D ...@@ -39,6 +39,8 @@ class SwapChain9 : public SwapChainD3D
EGLint getWidth() const { return mWidth; } EGLint getWidth() const { return mWidth; }
EGLint getHeight() const { return mHeight; } EGLint getHeight() const { return mHeight; }
void *getKeyedMutex() override;
private: private:
void release(); void release();
......
...@@ -57,7 +57,13 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa ...@@ -57,7 +57,13 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa
return EGL_FALSE; return EGL_FALSE;
} }
break; break;
case EGL_DXGI_KEYED_MUTEX_ANGLE:
if (!display->getExtensions().keyedMutex)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE;
}
break;
default: default:
SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE; return EGL_FALSE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment