summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2014-02-28 09:40:31 -0500
committerNeil Roberts <neil@linux.intel.com>2014-03-12 17:29:21 +0000
commit0d91085193bb380ea28bdf5f3e30c2195569310a (patch)
tree8449123e147478db433f7f24c0d8cb4ab7a080db
parent76cdaabc153ebba44f7026d4c6a5a93679bd1497 (diff)
downloadcogl-0d91085193bb380ea28bdf5f3e30c2195569310a.tar.gz
cogl-winsys-egl-kms: Add cogl_kms_renderer_set_kms_fd
Reviewed-by: Neil Roberts <neil@linux.intel.com> (cherry picked from commit 7bc7ea4cb5e8134a3aeed9615477f4152b558509) Conflicts: cogl/winsys/cogl-winsys-egl-kms.c
-rw-r--r--cogl/cogl-kms-renderer.h16
-rw-r--r--cogl/cogl-renderer-private.h4
-rw-r--r--cogl/cogl-renderer.c4
-rw-r--r--cogl/winsys/cogl-winsys-egl-kms.c40
4 files changed, 56 insertions, 8 deletions
diff --git a/cogl/cogl-kms-renderer.h b/cogl/cogl-kms-renderer.h
index 0ade3fee..c2606f8c 100644
--- a/cogl/cogl-kms-renderer.h
+++ b/cogl/cogl-kms-renderer.h
@@ -39,6 +39,22 @@
COGL_BEGIN_DECLS
/**
+ * cogl_kms_renderer_set_kms_fd:
+ * @renderer: A #CoglRenderer
+ * @fd: The fd to kms to use
+ *
+ * Sets the file descriptor Cogl should use to communicate
+ * to the kms driver. If -1 (the default), then Cogl will
+ * open its own FD by trying to open "/dev/dri/card0".
+ *
+ * Since: 1.18
+ * Stability: unstable
+ */
+void
+cogl_kms_renderer_set_kms_fd (CoglRenderer *renderer,
+ int fd);
+
+/**
* cogl_kms_renderer_get_kms_fd:
* @renderer: A #CoglRenderer
*
diff --git a/cogl/cogl-renderer-private.h b/cogl/cogl-renderer-private.h
index 77a3593a..3871d91b 100644
--- a/cogl/cogl-renderer-private.h
+++ b/cogl/cogl-renderer-private.h
@@ -88,6 +88,10 @@ struct _CoglRenderer
CoglBool wayland_enable_event_dispatch;
#endif
+#if defined (COGL_HAS_EGL_PLATFORM_KMS_SUPPORT)
+ int kms_fd;
+#endif
+
#ifdef COGL_HAS_SDL_SUPPORT
CoglBool sdl_event_type_set;
uint32_t sdl_event_type;
diff --git a/cogl/cogl-renderer.c b/cogl/cogl-renderer.c
index b1d8c0b0..5bb3fa0a 100644
--- a/cogl/cogl-renderer.c
+++ b/cogl/cogl-renderer.c
@@ -303,6 +303,10 @@ cogl_renderer_new (void)
renderer->wayland_enable_event_dispatch = TRUE;
#endif
+#ifdef COGL_HAS_EGL_PLATFORM_KMS_SUPPORT
+ renderer->kms_fd = -1;
+#endif
+
return _cogl_renderer_object_new (renderer);
}
diff --git a/cogl/winsys/cogl-winsys-egl-kms.c b/cogl/winsys/cogl-winsys-egl-kms.c
index 4af9848f..3c5460ed 100644
--- a/cogl/winsys/cogl-winsys-egl-kms.c
+++ b/cogl/winsys/cogl-winsys-egl-kms.c
@@ -69,6 +69,7 @@ static const CoglWinsysVtable *parent_vtable;
typedef struct _CoglRendererKMS
{
int fd;
+ int opened_fd;
struct gbm_device *gbm;
CoglClosure *swap_notify_idle;
} CoglRendererKMS;
@@ -285,14 +286,25 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
* we're doing here... */
g_setenv ("EGL_PLATFORM", "drm", 1);
- kms_renderer->fd = open (device_name, O_RDWR);
- if (kms_renderer->fd < 0)
+ kms_renderer->fd = -1;
+ kms_renderer->opened_fd = -1;
+
+ if (renderer->kms_fd >= 0)
{
- /* Probably permissions error */
- _cogl_set_error (error, COGL_WINSYS_ERROR,
- COGL_WINSYS_ERROR_INIT,
- "Couldn't open %s", device_name);
- return FALSE;
+ kms_renderer->fd = renderer->kms_fd;
+ }
+ else
+ {
+ kms_renderer->opened_fd = open (device_name, O_RDWR);
+ kms_renderer->fd = kms_renderer->opened_fd;
+ if (kms_renderer->fd < 0)
+ {
+ /* Probably permissions error */
+ _cogl_set_error (error, COGL_WINSYS_ERROR,
+ COGL_WINSYS_ERROR_INIT,
+ "Couldn't open %s", device_name);
+ return FALSE;
+ }
}
kms_renderer->gbm = gbm_create_device (kms_renderer->fd);
@@ -330,7 +342,8 @@ egl_terminate:
destroy_gbm_device:
gbm_device_destroy (kms_renderer->gbm);
close_fd:
- close (kms_renderer->fd);
+ if (kms_renderer->opened_fd >= 0)
+ close (kms_renderer->opened_fd);
_cogl_winsys_renderer_disconnect (renderer);
@@ -1075,6 +1088,17 @@ _cogl_winsys_egl_kms_get_vtable (void)
return &vtable;
}
+void
+cogl_kms_renderer_set_kms_fd (CoglRenderer *renderer,
+ int fd)
+{
+ _COGL_RETURN_IF_FAIL (cogl_is_renderer (renderer));
+ /* NB: Renderers are considered immutable once connected */
+ _COGL_RETURN_IF_FAIL (!renderer->connected);
+
+ renderer->kms_fd = fd;
+}
+
int
cogl_kms_renderer_get_kms_fd (CoglRenderer *renderer)
{