diff options
author | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-04-28 21:23:48 +0200 |
---|---|---|
committer | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-04-28 21:23:48 +0200 |
commit | 277f0fa5184549e1bfadf23a88a9219306149895 (patch) | |
tree | c6bc12ff5a27b5c9d992bac84ab294b350cea0a5 | |
parent | f42229c277e1c73007e3f4b36aa1559bad7544f3 (diff) |
Drop GetDRMfd; WFD_DEVICE_ID = drm_fd
-rw-r--r-- | include/WF/wfdext.h | 3 | ||||
-rw-r--r-- | src/wfdapi.c | 23 | ||||
-rw-r--r-- | src/wfddevice.c | 123 | ||||
-rw-r--r-- | src/wfddevice.h | 3 | ||||
-rw-r--r-- | src/wfdregistry.c | 4 | ||||
-rw-r--r-- | src/wfdregistry.h | 6 | ||||
-rw-r--r-- | src/wfdsource.c | 2 | ||||
-rw-r--r-- | test/test.c | 2 |
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); |