[PATCH 2/3] renderer: introduce destroy callback
Kristian Høgsberg
krh at bitplanet.net
Tue Jan 8 11:22:17 PST 2013
On Tue, Jan 8, 2013 at 1:36 PM, John Kåre Alsaker
<john.kare.alsaker at gmail.com> wrote:
> I'd like to see this callback in a buffer manager abstraction which
> could encapsulate EGL and X11/fb/kms buffer management and get rid of
> duplicated code for the renderers. However if it's added to
> weston_renderer, it should be destroyed by the compositor and not by
> the backends.
What code duplication do you see? There's very little left; only
compositor-drm creates egl on kms buffers, only compositor-x11 creates
X windows... for the pixman renderer, we'll need X shm buffers for X
and kms dumb buffers for compsitor-drm so there's not a lot of
commonality there either. Also, since the backend creates the
renderer it only makes sense that it destroys it. The reason for the
function pointer is that we can now have different renderers in play
in one backend, and instead of doing #ifdef EGL if (using gl renderer)
destroy_gl_renderer else #else blah blah, we can just call the
renderer destroy vfunc. It's just a small pragmatic cleanup, not a
brand new abstraction.
Kristian
> On Tue, Jan 8, 2013 at 5:09 PM, Vasily Khoruzhick <anarsoul at gmail.com> wrote:
>> Signed-off-by: Vasily Khoruzhick <anarsoul at gmail.com>
>> ---
>> src/compositor-android.c | 6 +++---
>> src/compositor-drm.c | 4 ++--
>> src/compositor-headless.c | 2 +-
>> src/compositor-rpi.c | 4 ++--
>> src/compositor-wayland.c | 4 ++--
>> src/compositor-x11.c | 10 ++--------
>> src/compositor.h | 3 +--
>> src/gl-renderer.c | 3 ++-
>> src/gl-renderer.h | 2 --
>> src/noop-renderer.c | 3 ++-
>> src/pixman-renderer.c | 3 ++-
>> src/pixman-renderer.h | 3 ---
>> 12 files changed, 19 insertions(+), 28 deletions(-)
>>
>> diff --git a/src/compositor-android.c b/src/compositor-android.c
>> index 5e27071..4e4ff08 100644
>> --- a/src/compositor-android.c
>> +++ b/src/compositor-android.c
>> @@ -299,7 +299,7 @@ android_init_egl(struct android_compositor *compositor,
>>
>> if (gl_renderer_output_create(&output->base,
>> output->fb->native_window) < 0) {
>> - gl_renderer_destroy(&compositor->base);
>> + compositor->base.renderer->destroy(&compositor->base);
>> return -1;
>> }
>>
>> @@ -313,7 +313,7 @@ android_compositor_destroy(struct weston_compositor *base)
>>
>> android_seat_destroy(compositor->seat);
>>
>> - gl_renderer_destroy(base);
>> + base->renderer->destroy(base);
>>
>> /* destroys outputs, too */
>> weston_compositor_shutdown(&compositor->base);
>> @@ -358,7 +358,7 @@ android_compositor_create(struct wl_display *display, int argc, char *argv[],
>> return &compositor->base;
>>
>> err_gl:
>> - gl_renderer_destroy(&compositor->base);
>> + compositor->base.renderer->destroy(&compositor->base);
>> err_output:
>> android_output_destroy(&output->base);
>> err_compositor:
>> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
>> index cc72c74..1c17bfd 100644
>> --- a/src/compositor-drm.c
>> +++ b/src/compositor-drm.c
>> @@ -2007,7 +2007,7 @@ drm_destroy(struct weston_compositor *ec)
>>
>> weston_compositor_shutdown(ec);
>>
>> - gl_renderer_destroy(ec);
>> + ec->renderer->destroy(ec);
>>
>> destroy_sprites(d);
>> gbm_device_destroy(d->gbm);
>> @@ -2307,7 +2307,7 @@ err_drm_source:
>> wl_list_for_each_safe(weston_seat, next, &ec->base.seat_list, link)
>> evdev_input_destroy(weston_seat);
>> err_sprite:
>> - gl_renderer_destroy(&ec->base);
>> + ec->base.renderer->destroy(&ec->base);
>> gbm_device_destroy(ec->gbm);
>> destroy_sprites(ec);
>> err_udev_dev:
>> diff --git a/src/compositor-headless.c b/src/compositor-headless.c
>> index d23ee0a..03bd0a4 100644
>> --- a/src/compositor-headless.c
>> +++ b/src/compositor-headless.c
>> @@ -141,7 +141,7 @@ headless_destroy(struct weston_compositor *ec)
>> {
>> struct headless_compositor *c = (struct headless_compositor *) ec;
>>
>> - noop_renderer_destroy(ec);
>> + ec->renderer->destroy(ec);
>>
>> weston_seat_release(&c->fake_seat);
>> weston_compositor_shutdown(ec);
>> diff --git a/src/compositor-rpi.c b/src/compositor-rpi.c
>> index f169d3b..208271f 100644
>> --- a/src/compositor-rpi.c
>> +++ b/src/compositor-rpi.c
>> @@ -1347,7 +1347,7 @@ rpi_compositor_destroy(struct weston_compositor *base)
>> /* destroys outputs, too */
>> weston_compositor_shutdown(&compositor->base);
>>
>> - gl_renderer_destroy(&compositor->base);
>> + compositor->base.renderer->destroy(&compositor->base);
>> tty_destroy(compositor->tty);
>>
>> bcm_host_deinit();
>> @@ -1501,7 +1501,7 @@ rpi_compositor_create(struct wl_display *display, int argc, char *argv[],
>> return &compositor->base;
>>
>> out_gl:
>> - gl_renderer_destroy(&compositor->base);
>> + compositor->base.renderer->destroy(&compositor->base);
>>
>> out_tty:
>> tty_destroy(compositor->tty);
>> diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
>> index 167fce6..0a3df03 100644
>> --- a/src/compositor-wayland.c
>> +++ b/src/compositor-wayland.c
>> @@ -612,7 +612,7 @@ wayland_restore(struct weston_compositor *ec)
>> static void
>> wayland_destroy(struct weston_compositor *ec)
>> {
>> - gl_renderer_destroy(ec);
>> + ec->renderer->destroy(ec);
>>
>> weston_compositor_shutdown(ec);
>>
>> @@ -686,7 +686,7 @@ wayland_compositor_create(struct wl_display *display,
>> return &c->base;
>>
>> err_gl:
>> - gl_renderer_destroy(&c->base);
>> + c->base.renderer->destroy(&c->base);
>> err_display:
>> wl_display_disconnect(c->parent.wl_display);
>> err_compositor:
>> diff --git a/src/compositor-x11.c b/src/compositor-x11.c
>> index a5fc9ef..c5c4248 100644
>> --- a/src/compositor-x11.c
>> +++ b/src/compositor-x11.c
>> @@ -1419,10 +1419,7 @@ x11_destroy(struct weston_compositor *ec)
>>
>> weston_compositor_shutdown(ec); /* destroys outputs, too */
>>
>> - if (compositor->use_pixman)
>> - pixman_renderer_destroy(ec);
>> - else
>> - gl_renderer_destroy(ec);
>> + ec->renderer->destroy(ec);
>>
>> XCloseDisplay(compositor->dpy);
>> free(ec);
>> @@ -1532,10 +1529,7 @@ x11_compositor_create(struct wl_display *display,
>> err_x11_input:
>> x11_input_destroy(c);
>> err_renderer:
>> - if (c->use_pixman)
>> - pixman_renderer_destroy(&c->base);
>> - else
>> - gl_renderer_destroy(&c->base);
>> + c->base.renderer->destroy(&c->base);
>> err_xdisplay:
>> XCloseDisplay(c->dpy);
>> err_free:
>> diff --git a/src/compositor.h b/src/compositor.h
>> index 15d6939..544cf33 100644
>> --- a/src/compositor.h
>> +++ b/src/compositor.h
>> @@ -273,6 +273,7 @@ struct weston_renderer {
>> float red, float green,
>> float blue, float alpha);
>> void (*destroy_surface)(struct weston_surface *surface);
>> + void (*destroy)(struct weston_compositor *ec);
>> };
>>
>> struct weston_compositor {
>> @@ -821,8 +822,6 @@ weston_output_switch_mode(struct weston_output *output, struct weston_mode *mode
>>
>> int
>> noop_renderer_init(struct weston_compositor *ec);
>> -void
>> -noop_renderer_destroy(struct weston_compositor *ec);
>>
>> struct weston_compositor *
>> backend_init(struct wl_display *display, int argc, char *argv[],
>> diff --git a/src/gl-renderer.c b/src/gl-renderer.c
>> index 8da111e..ee2763a 100644
>> --- a/src/gl-renderer.c
>> +++ b/src/gl-renderer.c
>> @@ -1648,7 +1648,7 @@ gl_renderer_output_surface(struct weston_output *output)
>> return get_output_state(output)->egl_surface;
>> }
>>
>> -WL_EXPORT void
>> +static void
>> gl_renderer_destroy(struct weston_compositor *ec)
>> {
>> struct gl_renderer *gr = get_renderer(ec);
>> @@ -1748,6 +1748,7 @@ gl_renderer_create(struct weston_compositor *ec, EGLNativeDisplayType display,
>> gr->base.create_surface = gl_renderer_create_surface;
>> gr->base.surface_set_color = gl_renderer_surface_set_color;
>> gr->base.destroy_surface = gl_renderer_destroy_surface;
>> + gr->base.destroy = gl_renderer_destroy;
>>
>> gr->egl_display = eglGetDisplay(display);
>> if (gr->egl_display == EGL_NO_DISPLAY) {
>> diff --git a/src/gl-renderer.h b/src/gl-renderer.h
>> index 09c58c5..1186348 100644
>> --- a/src/gl-renderer.h
>> +++ b/src/gl-renderer.h
>> @@ -42,8 +42,6 @@ gl_renderer_output_surface(struct weston_output *output);
>> void
>> gl_renderer_set_border(struct weston_compositor *ec, int32_t width, int32_t height, void *data,
>> int32_t *edges);
>> -void
>> -gl_renderer_destroy(struct weston_compositor *ec);
>>
>> void
>> gl_renderer_print_egl_error_state(void);
>> diff --git a/src/noop-renderer.c b/src/noop-renderer.c
>> index 24660ec..a0b1679 100644
>> --- a/src/noop-renderer.c
>> +++ b/src/noop-renderer.c
>> @@ -68,7 +68,7 @@ noop_renderer_destroy_surface(struct weston_surface *surface)
>> {
>> }
>>
>> -WL_EXPORT void
>> +static void
>> noop_renderer_destroy(struct weston_compositor *ec)
>> {
>> free(ec->renderer);
>> @@ -91,6 +91,7 @@ noop_renderer_init(struct weston_compositor *ec)
>> renderer->create_surface = noop_renderer_create_surface;
>> renderer->surface_set_color = noop_renderer_surface_set_color;
>> renderer->destroy_surface = noop_renderer_destroy_surface;
>> + renderer->destroy = noop_renderer_destroy;
>> ec->renderer = renderer;
>>
>> return 0;
>> diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c
>> index 1747408..6c62965 100644
>> --- a/src/pixman-renderer.c
>> +++ b/src/pixman-renderer.c
>> @@ -312,7 +312,7 @@ pixman_renderer_destroy_surface(struct weston_surface *surface)
>> free(ps);
>> }
>>
>> -WL_EXPORT void
>> +static void
>> pixman_renderer_destroy(struct weston_compositor *ec)
>> {
>> free(ec->renderer);
>> @@ -335,6 +335,7 @@ pixman_renderer_init(struct weston_compositor *ec)
>> renderer->create_surface = pixman_renderer_create_surface;
>> renderer->surface_set_color = pixman_renderer_surface_set_color;
>> renderer->destroy_surface = pixman_renderer_destroy_surface;
>> + renderer->destroy = pixman_renderer_destroy;
>> ec->renderer = renderer;
>>
>> return 0;
>> diff --git a/src/pixman-renderer.h b/src/pixman-renderer.h
>> index 9920999..77761ba 100644
>> --- a/src/pixman-renderer.h
>> +++ b/src/pixman-renderer.h
>> @@ -22,9 +22,6 @@
>>
>> #include "compositor.h"
>>
>> -void
>> -pixman_renderer_destroy(struct weston_compositor *ec);
>> -
>> int
>> pixman_renderer_init(struct weston_compositor *ec);
>>
>> --
>> 1.8.1
>>
>> _______________________________________________
>> wayland-devel mailing list
>> wayland-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list