diff options
author | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-07-26 10:15:55 +0200 |
---|---|---|
committer | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-07-26 10:15:55 +0200 |
commit | 41278a62d0d459c81aba9a3fdd76ebcabecc57da (patch) | |
tree | 3f162dc2c6b04c997dafaf48f5b7d8c279244226 | |
parent | 7fa9a6c5ca945c3fcc2b1248f72da2b4f2cf53d7 (diff) |
Implement WFD_EVENT_PIPELINE_BIND_SOURCE attrib (v2)
-rw-r--r-- | src/wfdevent.c | 6 | ||||
-rw-r--r-- | src/wfdpipeline.c | 8 | ||||
-rw-r--r-- | src/wfdpipeline.h | 3 | ||||
-rw-r--r-- | src/wfhandle.c | 19 | ||||
-rw-r--r-- | src/wfhandle.h | 3 |
5 files changed, 38 insertions, 1 deletions
diff --git a/src/wfdevent.c b/src/wfdevent.c index 16d4729..df0a966 100644 --- a/src/wfdevent.c +++ b/src/wfdevent.c @@ -32,6 +32,7 @@ #include <WF/wfdext.h> #include "wflist.h" +#include "wfhandle.h" #include "wfdregistry.h" #include "wfdevent.h" #include "wfdport.h" @@ -48,6 +49,7 @@ struct bind_event { WFDint pipeline_id; + WFDSource source; WFDint time; struct wf_list link; @@ -367,6 +369,8 @@ wfd_event_get_attribi(struct wfd_device *device, return event->bind.pipeline_id; case WFD_EVENT_PIPELINE_BIND_TIME_EXT: return event->bind.time; + case WFD_EVENT_PIPELINE_BIND_SOURCE: + return event->bind.source; default: wfd_device_set_error(device, WFD_ERROR_ILLEGAL_ARGUMENT); @@ -392,6 +396,8 @@ page_flip_handler(int fd, unsigned int frame, struct bind_event bind; wf_list_init(&bind.link); + bind.source = wf_handle_get(wfd_pipeline_get_previous_source(pipeline), + SOURCE_HANDLE); bind.pipeline_id = wfd_pipeline_get_id(pipeline); bind.time = (sec * 1000 + usec / 1000) - global_event->start_time_msec; diff --git a/src/wfdpipeline.c b/src/wfdpipeline.c index 6360c82..cd5b857 100644 --- a/src/wfdpipeline.c +++ b/src/wfdpipeline.c @@ -47,6 +47,7 @@ struct wfd_pipeline { int first_bind; struct wfd_source *source; + struct wfd_source *previous_source; int source_updated; struct wfd_port *port; @@ -114,6 +115,7 @@ wfd_pipeline_bind_source(struct wfd_device *device, WFDTransition transition, const WFDRect *region) { + pipeline->previous_source = pipeline->source; pipeline->source = source; pipeline->source_updated = 1; @@ -183,6 +185,12 @@ wfd_pipeline_get_id(struct wfd_pipeline *pipeline) return pipeline->crtc->crtc_id; } +struct wfd_source * +wfd_pipeline_get_previous_source(struct wfd_pipeline *pipeline) +{ + return pipeline->previous_source; +} + WFDint wfd_pipeline_get_attribi(struct wfd_device *device, struct wfd_pipeline *pipeline, diff --git a/src/wfdpipeline.h b/src/wfdpipeline.h index e2561fe..693b38d 100644 --- a/src/wfdpipeline.h +++ b/src/wfdpipeline.h @@ -55,6 +55,9 @@ wfd_pipeline_bind_source(struct wfd_device *device, int wfd_pipeline_get_id(struct wfd_pipeline *pipeline); +struct wfd_source * +wfd_pipeline_get_previous_source(struct wfd_pipeline *pipeline); + uint32_t wfd_pipeline_get_crtc_id(struct wfd_pipeline *pipeline); diff --git a/src/wfhandle.c b/src/wfhandle.c index 3294bcd..a8a9c86 100644 --- a/src/wfhandle.c +++ b/src/wfhandle.c @@ -31,7 +31,7 @@ struct handle_entry { void *object; }; -void **hash_table = NULL; +struct handle_entry **hash_table = NULL; uint32_t next_handle = 1; uint32_t current_size = 16; @@ -90,6 +90,23 @@ wf_handle_create(void *object, enum wf_type type) return handle; } +uint32_t +wf_handle_get(void *object, enum wf_type type) +{ + int i; + + if (object == NULL) + return WF_HANDLE_INVALID; + + for (i = 0; i < next_handle; ++i) + if (hash_table[i] != NULL && + hash_table[i]->object == object && + hash_table[i]->type == type) + return i; + + return WF_HANDLE_INVALID; +} + void * wf_handle_get_object(uint32_t handle, enum wf_type type) { diff --git a/src/wfhandle.h b/src/wfhandle.h index 3ddad79..e3de089 100644 --- a/src/wfhandle.h +++ b/src/wfhandle.h @@ -46,6 +46,9 @@ wf_handle_create(void *object, enum wf_type type); void * wf_handle_get_object(uint32_t handle, enum wf_type type); +uint32_t +wf_handle_get(void *object, enum wf_type type); + void wf_handle_destroy(uint32_t handle); |