Related to #786.
This commit is contained in:
Camilla Löwy 2017-09-07 19:28:44 +02:00
parent 243db302bf
commit 4e1d7e9266
6 changed files with 109 additions and 105 deletions

View File

@ -11,8 +11,9 @@ application development. It provides a simple, platform-independent API for
creating windows, contexts and surfaces, reading input, handling events, etc.
GLFW natively supports Windows, macOS and Linux and other Unix-like systems.
Experimental implementations for the Wayland protocol and the Mir display server
are available but not yet officially supported.
Experimental implementations for the Wayland protocol, the Mir display server
and direct rendering via EGLDevice are available but not yet officially
supported.
GLFW is licensed under the [zlib/libpng
license](http://www.glfw.org/license.html).
@ -91,6 +92,9 @@ GLFW itself depends only on the headers and libraries for your window system.
The (experimental) Wayland backend also depends on the `extra-cmake-modules`
package, which is used to generated Wayland protocol headers.
The (experimental) EGLDevice backend also depends on the `libdrm-dev`
development package.
The examples and test programs depend on a number of tiny libraries. These are
located in the `deps/` directory.
@ -208,6 +212,7 @@ information on what to include when reporting a bug.
- [X11] Bugfix: Incremental reading of selections was not supported (#275)
- [X11] Bugfix: Selection I/O reported but did not support `COMPOUND_TEXT`
- [X11] Bugfix: Latin-1 text read from selections was not converted to UTF-8
- [Linux] Added experimental support for direct rendering via EGLDevice (#786)
- [Linux] Moved to evdev for joystick input (#906,#1005)
- [Linux] Bugfix: Event processing did not detect joystick disconnection (#932)
- [Linux] Bugfix: The joystick device path could be truncated (#1025)
@ -282,6 +287,7 @@ skills.
- David Carlier
- Arturo Castro
- Chi-kwan Chan
- Kamal Chandra
- Ian Clarkson
- Michał Cichoń
- Lambert Clara

View File

@ -257,6 +257,7 @@ ramps and clipboard. The options are:
- @b _GLFW_WAYLAND to use the Wayland API (experimental and incomplete)
- @b _GLFW_MIR to use the Mir API (experimental and incomplete)
- @b _GLFW_OSMESA to use the OSMesa API (headless and non-interactive)
- @b _GLFW_EGLDEVICE to use the EGLDevice API (experimental and incomplete)
If you are building GLFW as a shared library / dynamic library / DLL then you
must also define @b _GLFW_BUILD_DLL. Otherwise, you must not define it.

View File

@ -1,5 +1,5 @@
//========================================================================
// GLFW 3.2 EGLDevice - www.glfw.org
// GLFW 3.3 EGLDevice - www.glfw.org
//------------------------------------------------------------------------
// Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
//
@ -28,44 +28,44 @@
#include <linux/limits.h>
static GLFWbool initializeExtensions()
static GLFWbool initializeExtensions(void)
{
_glfw.egldevice.eglQueryDevicesEXT =
_glfw.egldevice.QueryDevicesEXT =
(PFNEGLQUERYDEVICESEXTPROC)
_glfw.egl.GetProcAddress("eglQueryDevicesEXT");
_glfw.egldevice.eglQueryDeviceStringEXT =
eglGetProcAddress("eglQueryDevicesEXT");
_glfw.egldevice.QueryDeviceStringEXT =
(PFNEGLQUERYDEVICESTRINGEXTPROC)
_glfw.egl.GetProcAddress("eglQueryDeviceStringEXT");
_glfw.egldevice.eglGetPlatformDisplayEXT =
eglGetProcAddress("eglQueryDeviceStringEXT");
_glfw.egldevice.GetPlatformDisplayEXT =
(PFNEGLGETPLATFORMDISPLAYEXTPROC)
_glfw.egl.GetProcAddress("eglGetPlatformDisplayEXT");
_glfw.egldevice.eglGetOutputLayersEXT =
eglGetProcAddress("eglGetPlatformDisplayEXT");
_glfw.egldevice.GetOutputLayersEXT =
(PFNEGLGETOUTPUTLAYERSEXTPROC)
_glfw.egl.GetProcAddress("eglGetOutputLayersEXT");
_glfw.egldevice.eglCreateStreamKHR =
eglGetProcAddress("eglGetOutputLayersEXT");
_glfw.egldevice.CreateStreamKHR =
(PFNEGLCREATESTREAMKHRPROC)
_glfw.egl.GetProcAddress("eglCreateStreamKHR");
_glfw.egldevice.eglDestroyStreamKHR =
eglGetProcAddress("eglCreateStreamKHR");
_glfw.egldevice.DestroyStreamKHR =
(PFNEGLDESTROYSTREAMKHRPROC)
_glfw.egl.GetProcAddress("eglDestroyStreamKHR");
_glfw.egldevice.eglStreamConsumerOutputEXT =
eglGetProcAddress("eglDestroyStreamKHR");
_glfw.egldevice.StreamConsumerOutputEXT =
(PFNEGLSTREAMCONSUMEROUTPUTEXTPROC)
_glfw.egl.GetProcAddress("eglStreamConsumerOutputEXT");
_glfw.egldevice.eglCreateStreamProducerSurfaceKHR =
eglGetProcAddress("eglStreamConsumerOutputEXT");
_glfw.egldevice.CreateStreamProducerSurfaceKHR =
(PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)
_glfw.egl.GetProcAddress("eglCreateStreamProducerSurfaceKHR");
eglGetProcAddress("eglCreateStreamProducerSurfaceKHR");
if(!_glfw.egldevice.eglQueryDevicesEXT ||
!_glfw.egldevice.eglQueryDeviceStringEXT ||
!_glfw.egldevice.eglGetPlatformDisplayEXT ||
!_glfw.egldevice.eglGetOutputLayersEXT ||
!_glfw.egldevice.eglCreateStreamKHR ||
!_glfw.egldevice.eglDestroyStreamKHR ||
!_glfw.egldevice.eglStreamConsumerOutputEXT ||
!_glfw.egldevice.eglCreateStreamProducerSurfaceKHR)
if(!_glfw.egldevice.QueryDevicesEXT ||
!_glfw.egldevice.QueryDeviceStringEXT ||
!_glfw.egldevice.GetPlatformDisplayEXT ||
!_glfw.egldevice.GetOutputLayersEXT ||
!_glfw.egldevice.CreateStreamKHR ||
!_glfw.egldevice.DestroyStreamKHR ||
!_glfw.egldevice.StreamConsumerOutputEXT ||
!_glfw.egldevice.CreateStreamProducerSurfaceKHR)
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Missing required function(s)");
"EGLDevice: Failed to find required EGL extension functions");
return GLFW_FALSE;
}
return GLFW_TRUE;
@ -90,7 +90,7 @@ static EGLDeviceEXT getEGLDevice(void)
"EGLDevice: EGL_EXT_device base extensions not found");
}
if (!_glfw.egldevice.eglQueryDevicesEXT(0, NULL, &num_devs))
if (!eglQueryDevicesEXT(0, NULL, &num_devs))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Falied to query EGLDevice");
@ -98,7 +98,7 @@ static EGLDeviceEXT getEGLDevice(void)
if (num_devs < 1)
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: No Devices Found");
"EGLDevice: No devices found");
}
egl_devs = calloc(sizeof(EGLDeviceEXT), num_devs);
@ -109,7 +109,7 @@ static EGLDeviceEXT getEGLDevice(void)
}
// Select suitable device
if (!_glfw.egldevice.eglQueryDevicesEXT(num_devs, egl_devs, &num_devs))
if (!eglQueryDevicesEXT(num_devs, egl_devs, &num_devs))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Failed to query EGL devices");
@ -119,8 +119,7 @@ static EGLDeviceEXT getEGLDevice(void)
{
const char* deviceExtensionString;
deviceExtensionString =
_glfw.egldevice.eglQueryDeviceStringEXT(egl_devs[i], EGL_EXTENSIONS);
deviceExtensionString = eglQueryDeviceStringEXT(egl_devs[i], EGL_EXTENSIONS);
if (_glfwStringInExtensionString("EGL_EXT_device_drm",
deviceExtensionString))
{
@ -134,8 +133,7 @@ static EGLDeviceEXT getEGLDevice(void)
if (eglDevice == EGL_NO_DEVICE_EXT)
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Missing required extension:"
" EGL_EXT_device_drm");
"EGLDevice: Missing required extension EGL_EXT_device_drm");
}
return eglDevice;
}
@ -145,8 +143,7 @@ static int getDRMFd(EGLDeviceEXT eglDevice)
int drm_fd;
const char* drmName;
drmName = _glfw.egldevice.eglQueryDeviceStringEXT(eglDevice,
EGL_DRM_DEVICE_FILE_EXT);
drmName = eglQueryDeviceStringEXT(eglDevice, EGL_DRM_DEVICE_FILE_EXT);
if (!drmName || (strnlen(drmName, PATH_MAX) == 0))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
@ -173,8 +170,7 @@ static GLFWbool initEGLDisplay(EGLDeviceEXT egl_dev, int drm_fd)
EGL_NONE
};
_glfw.egl.display =
_glfw.egldevice.eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,
_glfw.egl.display = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,
(void*)egl_dev,
displayAttribs);
if (_glfw.egl.display == EGL_NO_DISPLAY)
@ -196,8 +192,7 @@ static GLFWbool initEGLDisplay(EGLDeviceEXT egl_dev, int drm_fd)
displayExtensionString))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Missing required extension:"
" EGL_EXT_output_base");
"EGLDevice: Missing required extension EGL_EXT_output_base");
return GLFW_FALSE;
}
@ -205,8 +200,7 @@ static GLFWbool initEGLDisplay(EGLDeviceEXT egl_dev, int drm_fd)
displayExtensionString))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Missing required extension:"
" EGL_EXT_output_drm");
"EGLDevice: Missing required extension EGL_EXT_output_drm");
return GLFW_FALSE;
}
@ -214,8 +208,7 @@ static GLFWbool initEGLDisplay(EGLDeviceEXT egl_dev, int drm_fd)
displayExtensionString))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Missing required extension:"
" EGL_KHR_stream");
"EGLDevice: Missing required extension EGL_KHR_stream");
return GLFW_FALSE;
}
@ -223,16 +216,14 @@ static GLFWbool initEGLDisplay(EGLDeviceEXT egl_dev, int drm_fd)
displayExtensionString))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Missing required extension:"
" EGL_KHR_stream_producer_eglsurface");
"EGLDevice: Missing required extension EGL_KHR_stream_producer_eglsurface");
return GLFW_FALSE;
}
if (!_glfwStringInExtensionString("EGL_EXT_stream_consumer_egloutput",
displayExtensionString))
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Missing required extension:"
" EGL_EXT_stream_consumer_egloutput");
"EGLDevice: Missing required extension EGL_EXT_stream_consumer_egloutput");
return GLFW_FALSE;
}
@ -290,3 +281,4 @@ const char* _glfwPlatformGetVersionString(void)
#endif
;
}

View File

@ -1,5 +1,5 @@
//========================================================================
// GLFW 3.2 EGLDevice - www.glfw.org
// GLFW 3.3 EGLDevice - www.glfw.org
//------------------------------------------------------------------------
// Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
//
@ -58,8 +58,7 @@ static GLFWbool pickConnector(_GLFWmonitor* monitor, int drm_fd, drmModeRes* res
drmModeGetEncoder(drm_fd, monitor->egldevice.encId);
if (!enc_info) {
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Unable to query DRM-KMS"
" information for connector index %d", i);
"EGLDevice: Unable to query DRM-KMS information for connector index %d", i);
}
// Select the modesize
@ -163,3 +162,4 @@ void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: _glfwPlatformSetGammaRamp not implemented");
}

View File

@ -1,5 +1,5 @@
//========================================================================
// GLFW 3.2 EGLDevice - www.glfw.org
// GLFW 3.3 EGLDevice - www.glfw.org
//------------------------------------------------------------------------
// Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
//
@ -24,9 +24,6 @@
//
//========================================================================
#ifndef _glfw3_egldevice_h_
#define _glfw3_egldevice_h_
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
@ -77,6 +74,16 @@ typedef EGLBoolean (EGLAPIENTRY * PFNEGLSTREAMCONSUMEROUTPUTEXTPROC)(EGLDisplay,
typedef EGLSurface (EGLAPIENTRY * PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)(EGLDisplay,EGLConfig,EGLStreamKHR,const EGLint*);
typedef EGLBoolean (EGLAPIENTRY * PFNEGLSTREAMATTRIBKHRPROC)(EGLDisplay,EGLStreamKHR,EGLenum,EGLint);
typedef EGLBoolean (EGLAPIENTRY * PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC)(EGLDisplay,EGLStreamKHR,const EGLAttrib*);
#define eglQueryDevicesEXT _glfw.egldevice.QueryDevicesEXT
#define eglQueryDeviceStringEXT _glfw.egldevice.QueryDeviceStringEXT
#define eglGetPlatformDisplayEXT _glfw.egldevice.GetPlatformDisplayEXT
#define eglGetOutputLayersEXT _glfw.egldevice.GetOutputLayersEXT
#define eglCreateStreamKHR _glfw.egldevice.CreateStreamKHR
#define eglDestroyStreamKHR _glfw.egldevice.DestroyStreamKHR
#define eglStreamConsumerOutputEXT _glfw.egldevice.StreamConsumerOutputEXT
#define eglCreateStreamProducerSurfaceKHR _glfw.egldevice.CreateStreamProducerSurfaceKHR
#define eglStreamAttribKHR _glfw.egldevice.StreamAttribKHR
#define eglStreamConsumerAcquireAttribKHR _glfw.egldevice.StreamConsumerAcquireAttribKHR
#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)
#define _glfw_dlclose(handle) dlclose(handle)
@ -85,17 +92,17 @@ typedef EGLBoolean (EGLAPIENTRY * PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC)(EGLD
#define _GLFW_EGL_NATIVE_DISPLAY EGL_DEFAULT_DISPLAY
#define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType)window->egldevice.handle)
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowEgldevice egldevice
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryEgldevice egldevice
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorEgldevice egldevice
#define _GLFW_PLATFORM_CURSOR_STATE _GLFWcursorEgldevice egldevice
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowEGLDevice egldevice
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryEGLDevice egldevice
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorEGLDevice egldevice
#define _GLFW_PLATFORM_CURSOR_STATE _GLFWcursorEGLDevice egldevice
#define _GLFW_PLATFORM_CONTEXT_STATE
#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE
// EGLDEVICE-specific per-window data
// EGLDevice-specific per-window data
//
typedef struct _GLFWwindowEgldevice
typedef struct _GLFWwindowEGLDevice
{
int xsurfsize, ysurfsize;
int xoffset, yoffset;
@ -106,38 +113,39 @@ typedef struct _GLFWwindowEgldevice
EGLDisplay handle;
EGLOutputLayerEXT eglLayer;
EGLStreamKHR eglStream;
} _GLFWwindowEgldevice;
} _GLFWwindowEGLDevice;
// EGLDEVICE-specific global data
// EGLDevice-specific global data
//
typedef struct _GLFWlibraryEgldevice
typedef struct _GLFWlibraryEGLDevice
{
int drmFd;
PFNEGLQUERYDEVICESEXTPROC eglQueryDevicesEXT;
PFNEGLQUERYDEVICESTRINGEXTPROC eglQueryDeviceStringEXT;
PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT;
PFNEGLGETOUTPUTLAYERSEXTPROC eglGetOutputLayersEXT;
PFNEGLCREATESTREAMKHRPROC eglCreateStreamKHR;
PFNEGLDESTROYSTREAMKHRPROC eglDestroyStreamKHR;
PFNEGLSTREAMCONSUMEROUTPUTEXTPROC eglStreamConsumerOutputEXT;
PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC eglCreateStreamProducerSurfaceKHR;
PFNEGLSTREAMATTRIBKHRPROC eglStreamAttribKHR;
PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC eglStreamConsumerAcquireAttribKHR;
} _GLFWlibraryEgldevice;
PFNEGLQUERYDEVICESEXTPROC QueryDevicesEXT;
PFNEGLQUERYDEVICESTRINGEXTPROC QueryDeviceStringEXT;
PFNEGLGETPLATFORMDISPLAYEXTPROC GetPlatformDisplayEXT;
PFNEGLGETOUTPUTLAYERSEXTPROC GetOutputLayersEXT;
PFNEGLCREATESTREAMKHRPROC CreateStreamKHR;
PFNEGLDESTROYSTREAMKHRPROC DestroyStreamKHR;
PFNEGLSTREAMCONSUMEROUTPUTEXTPROC StreamConsumerOutputEXT;
PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC CreateStreamProducerSurfaceKHR;
PFNEGLSTREAMATTRIBKHRPROC StreamAttribKHR;
PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC StreamConsumerAcquireAttribKHR;
} _GLFWlibraryEGLDevice;
// EGLDEVICE-specific per-monitor data
// EGLDevice-specific per-monitor data
//
typedef struct _GLFWmonitorEgldevice {
typedef struct _GLFWmonitorEGLDevice
{
int crtcIndex;
uint32_t connId, encId, crtcId;
} _GLFWmonitorEgldevice;
} _GLFWmonitorEGLDevice;
// EGLDEVICE-specific per-cursor data
// EGLDevice-specific per-cursor data
//
typedef struct _GLFWcursorEgldevice {
} _GLFWcursorEgldevice;
typedef struct _GLFWcursorEGLDevice
{
} _GLFWcursorEGLDevice;
void _glfwPollMonitorsEGLDevice(void);
#endif // _glfw3_egldevice_platform_h_

View File

@ -1,5 +1,5 @@
//========================================================================
// GLFW 3.2 EGLDevice - www.glfw.org
// GLFW 3.3 EGLDevice - www.glfw.org
//------------------------------------------------------------------------
// Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
//
@ -57,7 +57,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
layerAttribs[0] = EGL_DRM_CRTC_EXT;
layerAttribs[1] = (EGLAttrib)monitor->egldevice.crtcId;
if (!_glfw.egldevice.eglGetOutputLayersEXT(_glfw.egl.display, layerAttribs,
if (!eglGetOutputLayersEXT(_glfw.egl.display, layerAttribs,
&window->egldevice.eglLayer,
1, &n) || !n)
{
@ -68,7 +68,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
// Create a stream and connect to the output
window->egldevice.eglStream =
_glfw.egldevice.eglCreateStreamKHR(_glfw.egl.display, streamAttribs);
eglCreateStreamKHR(_glfw.egl.display, streamAttribs);
if (window->egldevice.eglStream == EGL_NO_STREAM_KHR)
{
_glfwInputError(GLFW_PLATFORM_ERROR,
@ -76,7 +76,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
eglGetError());
return GLFW_FALSE;
}
if (!_glfw.egldevice.eglStreamConsumerOutputEXT(_glfw.egl.display,
if (!eglStreamConsumerOutputEXT(_glfw.egl.display,
window->egldevice.eglStream,
window->egldevice.eglLayer))
{
@ -90,15 +90,14 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
surfaceAttribs[1] = window->egldevice.xsurfsize;
surfaceAttribs[3] = window->egldevice.ysurfsize;
window->context.egl.surface =
_glfw.egldevice.eglCreateStreamProducerSurfaceKHR(_glfw.egl.display,
eglCreateStreamProducerSurfaceKHR(_glfw.egl.display,
window->context.egl.config,
window->egldevice.eglStream,
surfaceAttribs);
if (window->context.egl.surface == EGL_NO_SURFACE)
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: Unable to create rendering"
" surface (error 0x%x)", eglGetError());
"EGLDevice: Unable to create rendering surface (error 0x%x)", eglGetError());
return GLFW_FALSE;
}
@ -111,10 +110,7 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
window->context.destroy(window);
if (window->egldevice.eglStream != EGL_NO_STREAM_KHR)
{
_glfw.egldevice.eglDestroyStreamKHR(_glfw.egl.display,
window->egldevice.eglStream);
}
eglDestroyStreamKHR(_glfw.egl.display, window->egldevice.eglStream);
}
void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
@ -307,7 +303,7 @@ int _glfwPlatformWindowMaximized(_GLFWwindow* window)
void _glfwPlatformPollEvents(void)
{
return;
_glfwDetectJoystickConnectionLinux();
}
void _glfwPlatformWaitEvents(void)
@ -419,7 +415,7 @@ int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: _glfwPlatformGetPhysicalDevicePresentationSupport not supported");
return 0;
return GLFW_FALSE;
}
VkResult _glfwPlatformCreateWindowSurface(VkInstance instance,
@ -429,5 +425,6 @@ VkResult _glfwPlatformCreateWindowSurface(VkInstance instance,
{
_glfwInputError(GLFW_PLATFORM_ERROR,
"EGLDevice: _glfwPlatformCreateWindowSurface not supported");
return (VkResult)NULL;
return VK_ERROR_INITIALIZATION_FAILED;
}