summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2011-04-28 21:23:48 +0200
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2011-04-28 21:23:48 +0200
commit277f0fa5184549e1bfadf23a88a9219306149895 (patch)
treec6bc12ff5a27b5c9d992bac84ab294b350cea0a5
parentf42229c277e1c73007e3f4b36aa1559bad7544f3 (diff)
Drop GetDRMfd; WFD_DEVICE_ID = drm_fd
-rw-r--r--include/WF/wfdext.h3
-rw-r--r--src/wfdapi.c23
-rw-r--r--src/wfddevice.c123
-rw-r--r--src/wfddevice.h3
-rw-r--r--src/wfdregistry.c4
-rw-r--r--src/wfdregistry.h6
-rw-r--r--src/wfdsource.c2
-rw-r--r--test/test.c2
8 files changed, 105 insertions, 61 deletions
diff --git a/include/WF/wfdext.h b/include/WF/wfdext.h
index e52fd65..bf1187b 100644
--- a/include/WF/wfdext.h
+++ b/include/WF/wfdext.h
@@ -26,9 +26,6 @@ static const char* wfd_extensions[] =
#endif
WFDint
-wfdDeviceGetDRMfd(WFDDevice device);
-
-WFDint
wfdDeviceEventGetFD(WFDDevice device,
WFDEvent event);
diff --git a/src/wfdapi.c b/src/wfdapi.c
index d565b15..1b23c66 100644
--- a/src/wfdapi.c
+++ b/src/wfdapi.c
@@ -97,18 +97,6 @@ wfdEnumerateDevices(WFDint *deviceIds,
return wfd_devices_enumerate(deviceIds, deviceIdsCount, filterList);
}
-WFD_API_CALL WFDint WFD_APIENTRY
-wfdDeviceGetDRMfd(WFDDevice device_handle) WFD_APIEXIT
-{
- struct wfd_device *device;
-
- device = wf_handle_get_object(device_handle, DEVICE_HANDLE);
- if (device == NULL)
- return -1;
-
- return wfd_device_get_fd(device);
-}
-
WFD_API_CALL WFDDevice WFD_APIENTRY
wfdCreateDevice(WFDint deviceId, const WFDint *attribList)
{
@@ -150,10 +138,17 @@ wfdDestroyDevice(WFDDevice device_handle) WFD_APIEXIT
}
WFD_API_CALL WFDint WFD_APIENTRY
-wfdGetDeviceAttribi(WFDDevice device,
+wfdGetDeviceAttribi(WFDDevice device_handle,
WFDDeviceAttrib attrib) WFD_APIEXIT
{
- return 0;
+ struct wfd_device *device;
+
+ device = wf_handle_get_object(device_handle, DEVICE_HANDLE);
+ if (device == NULL)
+ return 0;
+ wfd_device_set_error(device, WFD_ERROR_NONE);
+
+ return wfd_device_get_attribi(device, attrib);
}
WFD_API_CALL void WFD_APIENTRY
diff --git a/src/wfddevice.c b/src/wfddevice.c
index b802737..3cb4ed1 100644
--- a/src/wfddevice.c
+++ b/src/wfddevice.c
@@ -41,11 +41,12 @@
struct wfd_device {
int device_id;
+ int fd;
+ int device_index;
struct udev_device *dev;
WFDErrorCode error;
- int fd;
drmModeResPtr resources;
uint32_t choosen_crtcs;
@@ -54,15 +55,6 @@ struct wfd_device {
WFDint port_id;
WFDboolean state;
} attach;
-
- /*
- struct wfd_hashtable streams;
- struct wfd_hashtable image_providers;
-
- struct wfd_list wfd_ports;
- struct wfd_list wfd_pipelines;
- struct wfd_list wfd_conts;
- */
};
static int
@@ -78,6 +70,23 @@ udev_list_get_num_entries(struct udev_list_entry *list)
}
static int
+open_from_syspath(struct udev *udev, const char *syspath)
+{
+ struct udev_device *device;
+ int fd;
+
+ device = udev_device_new_from_syspath(udev, syspath);
+ if (device == NULL)
+ return -1;
+
+ fd = open(udev_device_get_devnode(device), O_RDWR);
+
+ udev_device_unref(device);
+
+ return fd;
+}
+
+static int
enumerate_devices(struct wfd_registry *registry)
{
struct udev_enumerate *enumerate;
@@ -96,15 +105,27 @@ enumerate_devices(struct wfd_registry *registry)
devices = udev_enumerate_get_list_entry(enumerate);
device_count = udev_list_get_num_entries(devices);
- registry->devices = calloc(device_count, sizeof(char*));
- registry->device_created = calloc(device_count, sizeof(int));
- if (registry->devices == NULL || registry->device_created == NULL)
+ registry->devices = calloc(device_count, sizeof *registry->devices);
+
+ if (registry->devices == NULL)
return -1;
i = 0;
udev_list_entry_foreach(list_entry, devices) {
- registry->devices[i++] =
- strdup(udev_list_entry_get_name(list_entry));
+ registry->devices[i].fd =
+ open_from_syspath(registry->udev,
+ udev_list_entry_get_name(list_entry));
+
+ if (registry->devices[i].fd < 0) {
+ registry->devices[i].fd = 0;
+ continue;
+ } else if (registry->devices[i].fd == 0) {
+ int tmp;
+ tmp = dup(registry->devices[i].fd);
+ close(registry->devices[i].fd);
+ registry->devices[i].fd = tmp;
+ }
+ i++;
}
registry->device_count = i;
@@ -131,7 +152,7 @@ wfd_devices_enumerate(WFDint *device_ids,
return registry->device_count;
for (i = 0; i < registry->device_count && count < device_id_count; ++i) {
- device_ids[count] = i+1;
+ device_ids[count] = registry->devices[i].fd;
count++;
}
@@ -155,7 +176,8 @@ wfd_device_destroy(struct wfd_device *device)
{
struct wfd_registry *registry = wfd_get_registry();
- registry->device_created[device->device_id-1] = 0;
+ registry->devices[device->device_index].created = 0;
+
drmModeFreeResources(device->resources);
udev_device_unref(device->dev);
close(device->fd);
@@ -166,66 +188,89 @@ struct wfd_device *
wfd_create_device(WFDint device_id, const WFDint *attrib_list)
{
struct wfd_device *device;
- const char *syspath, *filename;
struct wfd_registry *registry = wfd_get_registry();
-
- if (device_id == WFD_DEFAULT_DEVICE_ID)
- device_id = 1;
+ struct stat buf;
+ int device_index = -1, already_created = 0;
+ int i;
if (registry->devices == NULL)
enumerate_devices(registry);
- if (device_id < 1 || device_id > registry->device_count)
+ if (registry->device_count <= 0)
return NULL;
- if (registry->device_created[device_id-1])
+ if (device_id == WFD_DEFAULT_DEVICE_ID)
+ device_id = registry->devices[0].fd;
+
+ for (i = 0; i < registry->device_count; ++i) {
+ if (registry->devices[i].fd == device_id) {
+ device_index = i;
+ already_created = registry->devices[i].created;
+ break;
+ }
+ }
+
+ if (device_index == -1 || already_created)
return NULL;
- syspath = registry->devices[device_id-1];
- printf("creating device from syspath: %s\n", syspath);
-
device = calloc(1, sizeof *device);
if (device == NULL)
return NULL;
device->device_id = device_id;
+ device->device_index = device_index;
device->error = WFD_ERROR_NONE;
device->choosen_crtcs = 0;
- device->dev = udev_device_new_from_syspath(registry->udev, syspath);
+ device->fd = dup(device_id);
+ if (device->fd < 0)
+ goto cleanup_device;
+
+ if (fstat(device->fd, &buf) < 0)
+ goto cleanup_fd;
- printf("device->dev: %p\n", device->dev);
+ if (!S_ISCHR(buf.st_mode))
+ goto cleanup_fd;
+ device->dev =
+ udev_device_new_from_devnum(registry->udev, 'c', buf.st_rdev);
if (device->dev == NULL)
goto cleanup_device;
- filename = udev_device_get_devnode(device->dev);
- device->fd = open(filename, O_RDWR);
- if (device->fd < 0) {
- fprintf(stderr, "failed to open: %s\n", filename);
- goto cleanup_udev_device;
- }
-
device->resources = drmModeGetResources(device->fd);
if (device->resources == NULL) {
fprintf(stderr, "Failed to get resources: %m. consider chvt.\n");
- goto cleanup_fd;
+ goto cleanup_udev_device;
}
- registry->device_created[device_id-1] = 1;
+ registry->devices[device_index].created = 1;
return device;
+cleanup_udev_device:
+ udev_device_unref(device->dev);
cleanup_fd:
close(device->fd);
cleanup_device:
free(device);
-cleanup_udev_device:
- udev_device_unref(device->dev);
return NULL;
}
+WFDint
+wfd_device_get_attribi(struct wfd_device *device, WFDDeviceAttrib attrib)
+{
+ switch (attrib) {
+ case WFD_DEVICE_ID:
+ return device->device_id;
+ default:
+ wfd_device_set_error(device, WFD_ERROR_BAD_ATTRIBUTE);
+ break;
+ }
+
+ return 0;
+}
+
void *
wfd_device_get_udev_device(struct wfd_device *device)
{
diff --git a/src/wfddevice.h b/src/wfddevice.h
index 9bf5a0c..2f051ed 100644
--- a/src/wfddevice.h
+++ b/src/wfddevice.h
@@ -41,6 +41,9 @@ wfd_create_device(WFDint device_id, const WFDint *attrib_list);
void
wfd_device_destroy(struct wfd_device *device);
+WFDint
+wfd_device_get_attribi(struct wfd_device *device, WFDDeviceAttrib attrib);
+
WFDErrorCode
wfd_device_get_error(struct wfd_device *device);
diff --git a/src/wfdregistry.c b/src/wfdregistry.c
index 097fc76..ab8b4cd 100644
--- a/src/wfdregistry.c
+++ b/src/wfdregistry.c
@@ -27,6 +27,8 @@
#include "libudev.h"
+#include <unistd.h>
+
#include "wfdregistry.h"
static struct wfd_registry *wfd_registry = NULL;
@@ -38,7 +40,7 @@ wfd_destroy(void)
if (wfd_registry->devices) {
for (i = 0; i < wfd_registry->device_count; ++i)
- free(wfd_registry->devices[i]);
+ close(wfd_registry->devices[i].fd);
free(wfd_registry->devices);
}
diff --git a/src/wfdregistry.h b/src/wfdregistry.h
index 6418994..cc91a7e 100644
--- a/src/wfdregistry.h
+++ b/src/wfdregistry.h
@@ -28,8 +28,10 @@
struct wfd_registry {
struct udev *udev;
- char **devices;
- int *device_created;
+ struct {
+ int fd;
+ int created;
+ } *devices;
int device_count;
};
diff --git a/src/wfdsource.c b/src/wfdsource.c
index 8352da9..5756179 100644
--- a/src/wfdsource.c
+++ b/src/wfdsource.c
@@ -42,7 +42,7 @@ egl_image_export(struct wfd_device *device,
EGLImageKHR image,
uint32_t *handle, uint32_t *pitch)
{
- int fd = wfd_device_get_fd(device);
+ int fd = wfd_device_get_attribi(device, WFD_DEVICE_ID);
EGLDisplay dpy = eglGetDRMDisplayMESA(fd);
eglExportDRMImageMESA(dpy, image,
diff --git a/test/test.c b/test/test.c
index b774ad4..06d8657 100644
--- a/test/test.c
+++ b/test/test.c
@@ -149,7 +149,7 @@ main(int argc, char *argv[])
pipeline = wfdCreatePipeline(dev, bindable_pipelines[0], NULL);
printf("pipeline: %d\n", pipeline);
- drm_fd = wfdDeviceGetDRMfd(dev);
+ drm_fd = wfdGetDeviceAttribi(dev, WFD_DEVICE_ID);
printf("drm fd: %d\n", drm_fd);
edpy = eglGetDRMDisplayMESA(drm_fd);
assert(edpy != EGL_NO_DISPLAY);