summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2011-07-26 10:15:55 +0200
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2011-07-26 10:15:55 +0200
commit41278a62d0d459c81aba9a3fdd76ebcabecc57da (patch)
tree3f162dc2c6b04c997dafaf48f5b7d8c279244226
parent7fa9a6c5ca945c3fcc2b1248f72da2b4f2cf53d7 (diff)
Implement WFD_EVENT_PIPELINE_BIND_SOURCE attrib (v2)
-rw-r--r--src/wfdevent.c6
-rw-r--r--src/wfdpipeline.c8
-rw-r--r--src/wfdpipeline.h3
-rw-r--r--src/wfhandle.c19
-rw-r--r--src/wfhandle.h3
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);