/*static*/ UniquePtr<SharedSurface_ANGLEShareHandle> SharedSurface_ANGLEShareHandle::Create(GLContext* gl, EGLContext context, EGLConfig config, const gfx::IntSize& size, bool hasAlpha) { GLLibraryEGL* egl = &sEGLLibrary; MOZ_ASSERT(egl); MOZ_ASSERT(egl->IsExtensionSupported( GLLibraryEGL::ANGLE_surface_d3d_texture_2d_share_handle)); if (!context || !config) return nullptr; EGLDisplay display = egl->Display(); EGLSurface pbuffer = CreatePBufferSurface(egl, display, config, size); if (!pbuffer) return nullptr; // Declare everything before 'goto's. HANDLE shareHandle = nullptr; bool ok = egl->fQuerySurfacePointerANGLE(display, pbuffer, LOCAL_EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, &shareHandle); if (!ok) { egl->fDestroySurface(egl->Display(), pbuffer); return nullptr; } typedef SharedSurface_ANGLEShareHandle ptrT; UniquePtr<ptrT> ret( new ptrT(gl, egl, size, hasAlpha, context, pbuffer, shareHandle) ); return Move(ret); }
/*static*/ UniquePtr<SharedSurface_ANGLEShareHandle> SharedSurface_ANGLEShareHandle::Create(GLContext* gl, EGLConfig config, const gfx::IntSize& size, bool hasAlpha) { GLLibraryEGL* egl = &sEGLLibrary; MOZ_ASSERT(egl); MOZ_ASSERT(egl->IsExtensionSupported( GLLibraryEGL::ANGLE_surface_d3d_texture_2d_share_handle)); MOZ_ASSERT(config); EGLDisplay display = egl->Display(); EGLSurface pbuffer = CreatePBufferSurface(egl, display, config, size); if (!pbuffer) return nullptr; // Declare everything before 'goto's. HANDLE shareHandle = nullptr; bool ok = egl->fQuerySurfacePointerANGLE(display, pbuffer, LOCAL_EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, &shareHandle); if (!ok) { egl->fDestroySurface(egl->Display(), pbuffer); return nullptr; } void* opaqueKeyedMutex = nullptr; egl->fQuerySurfacePointerANGLE(display, pbuffer, LOCAL_EGL_DXGI_KEYED_MUTEX_ANGLE, &opaqueKeyedMutex); RefPtr<IDXGIKeyedMutex> keyedMutex = static_cast<IDXGIKeyedMutex*>(opaqueKeyedMutex); GLuint fence = 0; if (gl->IsExtensionSupported(GLContext::NV_fence)) { gl->MakeCurrent(); gl->fGenFences(1, &fence); } typedef SharedSurface_ANGLEShareHandle ptrT; UniquePtr<ptrT> ret( new ptrT(gl, egl, size, hasAlpha, pbuffer, shareHandle, keyedMutex, fence) ); return Move(ret); }