diff options
author | Tina Zhang <tina.zhang@intel.com> | 2014-07-21 16:50:30 +0800 |
---|---|---|
committer | Tina Zhang <tina.zhang@intel.com> | 2014-07-29 09:00:46 +0800 |
commit | f19f89d68723c868e3b1d8bbf75e04cf4e1809ba (patch) | |
tree | d1007dc51d186b65c80729613016c0bfbc70bf7c | |
parent | e83adf4bd3161aad1d8fc68e36e76e02ad660388 (diff) | |
download | emulator-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.c | 9 | ||||
-rw-r--r-- | EGL/wayland/yagl_wayland_display.c | 6 | ||||
-rw-r--r-- | EGL/x11/yagl_x11_display.c | 6 | ||||
-rw-r--r-- | EGL/yagl_native_display.c | 8 | ||||
-rw-r--r-- | EGL/yagl_native_display.h | 2 | ||||
-rw-r--r-- | EGL/yagl_onscreen_image_wl_buffer.c | 4 | ||||
-rw-r--r-- | gbm/yagl_gbm.c | 2 | ||||
-rw-r--r-- | include/wayland-drm.h | 2 | ||||
-rw-r--r-- | include/yagl_gbm.h | 2 | ||||
-rw-r--r-- | wayland-drm/wayland-drm.c | 13 |
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; |