summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTina Zhang <tina.zhang@intel.com>2014-07-21 16:50:30 +0800
committerTina Zhang <tina.zhang@intel.com>2014-07-29 09:00:46 +0800
commitf19f89d68723c868e3b1d8bbf75e04cf4e1809ba (patch)
treed1007dc51d186b65c80729613016c0bfbc70bf7c
parente83adf4bd3161aad1d8fc68e36e76e02ad660388 (diff)
downloademulator-yagl-f19f89d68723c868e3b1d8bbf75e04cf4e1809ba.tar.gz
emulator-yagl-f19f89d68723c868e3b1d8bbf75e04cf4e1809ba.tar.bz2
emulator-yagl-f19f89d68723c868e3b1d8bbf75e04cf4e1809ba.zip
Remove static variable for identifying wl_drm buffers
libwayland-drm.a is static link for libEGL.so and libgbm-yagl.so. We can't rely on comparing the address of a static vtable symbol in libwayland-drm.a to determine if a wl_buffer is a wl_drm_buffer. Instead, we move the vtable into the wl_drm struct and use that for comparing. Change-Id: I38e397f2d4806178ebb51bb3850040fad7961b0f Signed-off-by: Tina Zhang <tina.zhang@intel.com>
-rw-r--r--EGL/gbm/yagl_gbm_display.c9
-rw-r--r--EGL/wayland/yagl_wayland_display.c6
-rw-r--r--EGL/x11/yagl_x11_display.c6
-rw-r--r--EGL/yagl_native_display.c8
-rw-r--r--EGL/yagl_native_display.h2
-rw-r--r--EGL/yagl_onscreen_image_wl_buffer.c4
-rw-r--r--gbm/yagl_gbm.c2
-rw-r--r--include/wayland-drm.h2
-rw-r--r--include/yagl_gbm.h2
-rw-r--r--wayland-drm/wayland-drm.c13
10 files changed, 41 insertions, 13 deletions
diff --git a/EGL/gbm/yagl_gbm_display.c b/EGL/gbm/yagl_gbm_display.c
index e552598..a0ebd3c 100644
--- a/EGL/gbm/yagl_gbm_display.c
+++ b/EGL/gbm/yagl_gbm_display.c
@@ -109,6 +109,14 @@ static int yagl_gbm_display_get_visual(struct yagl_native_display *dpy,
return 1;
}
+static void yagl_gbm_display_update_wl_server(struct yagl_native_display *dpy)
+{
+#ifdef YAGL_PLATFORM_WAYLAND
+ struct gbm_device *gbm_dev = YAGL_GBM_DPY(dpy->os_dpy);
+ gbm_dev->wl_drm = dpy->wl_server_drm;
+#endif
+}
+
static void yagl_gbm_display_destroy(struct yagl_native_display *dpy)
{
yagl_native_display_cleanup(dpy);
@@ -142,6 +150,7 @@ struct yagl_native_display
dpy->create_pixmap = &yagl_gbm_display_create_pixmap;
dpy->create_image = &yagl_gbm_display_create_image;
dpy->get_visual = &yagl_gbm_display_get_visual;
+ dpy->update_wl_server = &yagl_gbm_display_update_wl_server;
dpy->destroy = &yagl_gbm_display_destroy;
free(device_name);
diff --git a/EGL/wayland/yagl_wayland_display.c b/EGL/wayland/yagl_wayland_display.c
index 83dcb44..fe7ec80 100644
--- a/EGL/wayland/yagl_wayland_display.c
+++ b/EGL/wayland/yagl_wayland_display.c
@@ -240,6 +240,11 @@ static int yagl_wayland_display_get_visual(struct yagl_native_display *dpy,
return 1;
}
+static void yagl_wayland_display_update_wl_server(struct yagl_native_display *dpy)
+{
+ return ;
+}
+
static void yagl_wayland_display_destroy(struct yagl_native_display *dpy)
{
struct yagl_wayland_display *wayland_dpy = (struct yagl_wayland_display*)dpy;
@@ -343,6 +348,7 @@ struct yagl_native_display
dpy->base.create_pixmap = &yagl_wayland_display_create_pixmap;
dpy->base.create_image = &yagl_wayland_display_create_image;
dpy->base.get_visual = &yagl_wayland_display_get_visual;
+ dpy->base.update_wl_server = &yagl_wayland_display_update_wl_server;
dpy->base.destroy = &yagl_wayland_display_destroy;
YAGL_LOG_FUNC_EXIT("display %p created", dpy);
diff --git a/EGL/x11/yagl_x11_display.c b/EGL/x11/yagl_x11_display.c
index 5d6a03e..4bcdd5a 100644
--- a/EGL/x11/yagl_x11_display.c
+++ b/EGL/x11/yagl_x11_display.c
@@ -181,6 +181,11 @@ static int yagl_x11_display_get_visual(struct yagl_native_display *dpy,
return 1;
}
+static void yagl_x11_display_update_wl_server(struct yagl_native_display *dpy)
+{
+ return ;
+}
+
static void yagl_x11_display_destroy(struct yagl_native_display *dpy)
{
struct yagl_x11_display *x11_dpy = (struct yagl_x11_display*)dpy;
@@ -266,6 +271,7 @@ struct yagl_native_display *yagl_x11_display_create(struct yagl_native_platform
dpy->base.create_pixmap = &yagl_x11_display_create_pixmap;
dpy->base.create_image = &yagl_x11_display_create_image;
dpy->base.get_visual = &yagl_x11_display_get_visual;
+ dpy->base.update_wl_server = &yagl_x11_display_update_wl_server;
dpy->base.destroy = &yagl_x11_display_destroy;
if (dri_device) {
diff --git a/EGL/yagl_native_display.c b/EGL/yagl_native_display.c
index f15af7b..55468a2 100644
--- a/EGL/yagl_native_display.c
+++ b/EGL/yagl_native_display.c
@@ -85,6 +85,12 @@ int yagl_native_display_bind_wl_display(struct yagl_native_display *dpy,
&wl_drm_callbacks,
dpy);
+ if (dpy->wl_server_drm) {
+ dpy->update_wl_server(dpy);
+ return 1;
+ } else {
+ return 0;
+ }
return dpy->wl_server_drm ? 1 : 0;
}
@@ -105,7 +111,7 @@ int yagl_native_display_query_wl_buffer(struct yagl_native_display *dpy,
EGLint attribute,
EGLint *value)
{
- struct wl_drm_buffer *drm_buffer = wayland_drm_get_buffer(buffer);
+ struct wl_drm_buffer *drm_buffer = wayland_drm_get_buffer(dpy->wl_server_drm, buffer);
struct vigs_drm_surface *drm_sfc;
if (!drm_buffer) {
diff --git a/EGL/yagl_native_display.h b/EGL/yagl_native_display.h
index a34ecb8..e64dfd1 100644
--- a/EGL/yagl_native_display.h
+++ b/EGL/yagl_native_display.h
@@ -53,6 +53,8 @@ struct yagl_native_display
int */*visual_id*/,
int */*visual_type*/);
+ void (*update_wl_server)(struct yagl_native_display */*dpy*/);
+
void (*destroy)(struct yagl_native_display */*dpy*/);
};
diff --git a/EGL/yagl_onscreen_image_wl_buffer.c b/EGL/yagl_onscreen_image_wl_buffer.c
index 72f7f2c..f976058 100644
--- a/EGL/yagl_onscreen_image_wl_buffer.c
+++ b/EGL/yagl_onscreen_image_wl_buffer.c
@@ -1,4 +1,5 @@
#include "yagl_onscreen_image_wl_buffer.h"
+#include "yagl_native_display.h"
#include "yagl_display.h"
#include "yagl_malloc.h"
#include "yagl_host_egl_calls.h"
@@ -36,8 +37,7 @@ struct yagl_onscreen_image_wl_buffer
struct vigs_drm_surface *drm_sfc;
image = yagl_malloc0(sizeof(*image));
-
- drm_buffer = wayland_drm_get_buffer(buffer);
+ drm_buffer = wayland_drm_get_buffer(dpy->native_dpy->wl_server_drm, buffer);
if (!drm_buffer) {
/*
diff --git a/gbm/yagl_gbm.c b/gbm/yagl_gbm.c
index eca3fad..308402e 100644
--- a/gbm/yagl_gbm.c
+++ b/gbm/yagl_gbm.c
@@ -254,7 +254,7 @@ YAGL_API struct gbm_bo *gbm_bo_import(struct gbm_device *gbm, uint32_t type,
switch (type) {
#ifdef YAGL_PLATFORM_WAYLAND
case GBM_BO_IMPORT_WL_BUFFER:
- drm_buffer = wayland_drm_get_buffer((struct wl_resource*)buffer);
+ drm_buffer = wayland_drm_get_buffer(gbm->wl_drm, (struct wl_resource*)buffer);
if (!drm_buffer) {
return NULL;
diff --git a/include/wayland-drm.h b/include/wayland-drm.h
index 7c01d3c..a659ae3 100644
--- a/include/wayland-drm.h
+++ b/include/wayland-drm.h
@@ -26,7 +26,7 @@ struct wl_drm *wayland_drm_create(struct wl_display *display,
void wayland_drm_destroy(struct wl_drm *drm);
-struct wl_drm_buffer *wayland_drm_get_buffer(struct wl_resource *resource);
+struct wl_drm_buffer *wayland_drm_get_buffer(struct wl_drm *drm, struct wl_resource *resource);
struct vigs_drm_surface *wayland_drm_buffer_get_sfc(struct wl_drm_buffer *buffer);
diff --git a/include/yagl_gbm.h b/include/yagl_gbm.h
index 52b1448..6825b52 100644
--- a/include/yagl_gbm.h
+++ b/include/yagl_gbm.h
@@ -16,6 +16,8 @@ struct gbm_device
struct gbm_device *(*dummy)(int);
struct vigs_drm_device *drm_dev;
+
+ struct wl_drm *wl_drm;
};
struct gbm_bo
diff --git a/wayland-drm/wayland-drm.c b/wayland-drm/wayland-drm.c
index 0259dfb..2fe8036 100644
--- a/wayland-drm/wayland-drm.c
+++ b/wayland-drm/wayland-drm.c
@@ -12,6 +12,7 @@ struct wl_drm
char *device_name;
struct wayland_drm_callbacks *callbacks;
void *user_data;
+ struct wl_buffer_interface buffer_interface;
};
struct wl_drm_buffer
@@ -38,11 +39,6 @@ static void drm_buffer_destroy(struct wl_client *client,
wl_resource_destroy(resource);
}
-static struct wl_buffer_interface drm_buffer_interface =
-{
- drm_buffer_destroy
-};
-
static void drm_create_buffer(struct wl_client *client,
struct wl_resource *resource,
uint32_t id, uint32_t name,
@@ -86,7 +82,7 @@ static void drm_create_buffer(struct wl_client *client,
buffer->resource.object.id = id;
buffer->resource.object.interface = &wl_buffer_interface;
- buffer->resource.object.implementation = (void(**)(void))&drm_buffer_interface;
+ buffer->resource.object.implementation = (void(**)(void))&drm->buffer_interface;
buffer->resource.data = buffer;
buffer->resource.destroy = buffer_destroy;
@@ -178,6 +174,7 @@ struct wl_drm *wayland_drm_create(struct wl_display *display,
drm->callbacks = callbacks;
drm->user_data = user_data;
+ drm->buffer_interface.destroy = drm_buffer_destroy;
wl_global_create(display, &wl_drm_interface, 1, drm, bind_drm);
return drm;
@@ -190,7 +187,7 @@ void wayland_drm_destroy(struct wl_drm *drm)
free(drm);
}
-struct wl_drm_buffer *wayland_drm_get_buffer(struct wl_resource *resource)
+struct wl_drm_buffer *wayland_drm_get_buffer(struct wl_drm *drm, struct wl_resource *resource)
{
if (!resource) {
return NULL;
@@ -198,7 +195,7 @@ struct wl_drm_buffer *wayland_drm_get_buffer(struct wl_resource *resource)
if (wl_resource_instance_of(resource,
&wl_buffer_interface,
- &drm_buffer_interface)) {
+ &drm->buffer_interface)) {
return wl_resource_get_user_data(resource);
} else {
return NULL;