summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Stephen Kiazyk <skiazyk@google.com> 2017-02-21 15:31:15 -0800
committer Stephen Kiazyk <skiazyk@google.com> 2017-02-22 12:28:40 -0800
commitc8c6860e8f0ef7f01670e19bd4578204cdf8207f (patch)
tree7c941105d2ebd6bd88314fde2b37e4f6622b40f0
parent08a27389c0c1039cf067eb7fba0329905e403f0f (diff)
Expose display manager client event fd
This will allow the display manager client to use epoll to wait and respond to changes in the current set of VR display surfaces. Bug: None Test: Compiled and ran with simple standalone binary application. Change-Id: I7680f5a56348abfb686e78d13e0e737466735ac6
-rw-r--r--libs/vr/libdisplay/display_manager_client.cpp17
-rw-r--r--libs/vr/libdisplay/include/private/dvr/display_manager_client.h15
-rw-r--r--libs/vr/libdisplay/include/private/dvr/display_manager_client_impl.h3
3 files changed, 35 insertions, 0 deletions
diff --git a/libs/vr/libdisplay/display_manager_client.cpp b/libs/vr/libdisplay/display_manager_client.cpp
index f454b08a97..8fd3627d80 100644
--- a/libs/vr/libdisplay/display_manager_client.cpp
+++ b/libs/vr/libdisplay/display_manager_client.cpp
@@ -41,6 +41,23 @@ void dvrDisplayManagerClientDestroy(DvrDisplayManagerClient* client) {
delete client;
}
+int dvrDisplayManagerClientGetEventFd(DvrDisplayManagerClient* client) {
+ return client->client->event_fd();
+}
+
+int dvrDisplayManagerClientTranslateEpollEventMask(
+ DvrDisplayManagerClient* client, int in_events, int* out_events) {
+ auto result = client->client->GetChannel()->GetEventMask(in_events);
+
+ if (!result) {
+ return -EIO;
+ }
+
+ *out_events = result.get();
+
+ return 0;
+}
+
int dvrDisplayManagerClientGetSurfaceList(
DvrDisplayManagerClient* client,
DvrDisplayManagerClientSurfaceList** surface_list) {
diff --git a/libs/vr/libdisplay/include/private/dvr/display_manager_client.h b/libs/vr/libdisplay/include/private/dvr/display_manager_client.h
index f28c1e4e1a..8ba9175f28 100644
--- a/libs/vr/libdisplay/include/private/dvr/display_manager_client.h
+++ b/libs/vr/libdisplay/include/private/dvr/display_manager_client.h
@@ -19,6 +19,21 @@ DvrDisplayManagerClient* dvrDisplayManagerClientCreate();
void dvrDisplayManagerClientDestroy(DvrDisplayManagerClient* client);
+// Return an event fd for checking if there was an event on the server
+// Note that the only event which will be flagged is POLLIN. You must use
+// dvrDisplayManagerClientTranslateEpollEventMask in order to get the real
+// event flags.
+// @return the fd
+int dvrDisplayManagerClientGetEventFd(DvrDisplayManagerClient* client);
+
+// Once you have received an epoll event, you must translate it to its true
+// flags. This is a workaround for working with UDS.
+// @param in_events pass in the epoll revents that were initially returned
+// @param on success, this value will be overwritten with the true epoll values
+// @return 0 on success, non-zero otherwise
+int dvrDisplayManagerClientTranslateEpollEventMask(
+ DvrDisplayManagerClient* client, int in_events, int* out_events);
+
// If successful, populates |surface_list| with a list of application
// surfaces the display is currently using.
//
diff --git a/libs/vr/libdisplay/include/private/dvr/display_manager_client_impl.h b/libs/vr/libdisplay/include/private/dvr/display_manager_client_impl.h
index 645ccce93f..4ecd8d4fc0 100644
--- a/libs/vr/libdisplay/include/private/dvr/display_manager_client_impl.h
+++ b/libs/vr/libdisplay/include/private/dvr/display_manager_client_impl.h
@@ -20,6 +20,9 @@ class DisplayManagerClient : public pdx::ClientBase<DisplayManagerClient> {
int GetSurfaceBuffers(
int surface_id, std::vector<std::unique_ptr<BufferConsumer>>* consumers);
+ using Client::event_fd;
+ using Client::GetChannel;
+
private:
friend BASE;