Re: [PATCH 3/7] gl-renderer: Make dummy surface current after all outputs are gone

2016-08-05 Thread Pekka Paalanen
On Fri, 29 Jul 2016 13:26:24 +0200
Armin Krezović  wrote:

> When all outputs are gone, there are no current read/write
> surfaces associated with a context. This makes the previously
> created dummy surface current until an output gets attached
> to avoid any potential crashes.
> 
> Signed-off-by: Armin Krezović 

Hi Armin,

this patch seems to have several unnecessary things, see below.

> ---
>  libweston/gl-renderer.c | 27 +++
>  1 file changed, 27 insertions(+)
> 
> diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c
> index be6b11e..56eb344 100644
> --- a/libweston/gl-renderer.c
> +++ b/libweston/gl-renderer.c
> @@ -167,6 +167,7 @@ struct gl_surface_state {
>  
>  struct gl_renderer {
>   struct weston_renderer base;
> + struct weston_compositor *compositor;

This member is not really necessary.

>   int fragment_shader_debug;
>   int fan_debug;
>   struct weston_binding *fragment_binding;
> @@ -216,6 +217,9 @@ struct gl_renderer {
>   struct gl_shader *current_shader;
>  
>   struct wl_signal destroy_signal;
> +
> + struct wl_signal output_destroy_signal;

output_destroy_signal seems unused. Does it have any purpose?

> + struct wl_listener output_destroy_listener;
>  };
>  
>  static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL;
> @@ -2642,6 +2646,8 @@ gl_renderer_destroy(struct weston_compositor *ec)
>   eglTerminate(gr->egl_display);
>   eglReleaseThread();
>  
> + wl_list_remove(>output_destroy_listener.link);
> +
>   wl_array_release(>vertices);
>   wl_array_release(>vtxcnt);
>  
> @@ -2827,6 +2833,21 @@ platform_to_extension(EGLenum platform)
>   }
>  }
>  
> +static void
> +output_handle_destroy(struct wl_listener *listener, void *data)
> +{
> + struct gl_renderer *gr;
> + struct weston_compositor *ec;
> +
> + gr = container_of(listener, struct gl_renderer,
> +   output_destroy_listener);
> + ec = gr->compositor;

Rather than this, you could do:
struct weston_output *output = data;
ec = output->compositor;

> +
> + if (wl_list_empty(>output_list))
> + eglMakeCurrent(gr->egl_display, gr->dummy_surface,
> +gr->dummy_surface, gr->egl_context);
> +}
> +
>  static int
>  gl_renderer_create_pbuffer_surface(struct gl_renderer *gr) {
>   EGLConfig pbuffer_config;
> @@ -2884,6 +2905,7 @@ gl_renderer_create(struct weston_compositor *ec, 
> EGLenum platform,
>   if (gr == NULL)
>   return -1;
>  
> + gr->compositor = ec;

This would be unneeded.

>   gr->base.read_pixels = gl_renderer_read_pixels;
>   gr->base.repaint_output = gl_renderer_repaint_output;
>   gr->base.flush_damage = gl_renderer_flush_damage;
> @@ -2962,6 +2984,7 @@ gl_renderer_create(struct weston_compositor *ec, 
> EGLenum platform,
>   wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGB565);
>  
>   wl_signal_init(>destroy_signal);
> + wl_signal_init(>output_destroy_signal);

This is unused.

>  
>   if (gl_renderer_setup(ec, gr->dummy_surface) < 0) {
>   if (gr->dummy_surface != EGL_NO_SURFACE)
> @@ -3136,6 +3159,10 @@ gl_renderer_setup(struct weston_compositor *ec, 
> EGLSurface egl_surface)
>   fan_debug_repaint_binding,
>   ec);
>  
> + gr->output_destroy_listener.notify = output_handle_destroy;
> + wl_signal_add(>output_destroyed_signal,
> +   >output_destroy_listener);
> +
>   weston_log("GL ES 2 renderer features:\n");
>   weston_log_continue(STAMP_SPACE "read-back format: %s\n",
>   ec->read_format == PIXMAN_a8r8g8b8 ? "BGRA" : "RGBA");

Other than that, this patch looks good.


Thanks,
pq


pgp57X04FU3sE.pgp
Description: OpenPGP digital signature
___
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel


[PATCH 3/7] gl-renderer: Make dummy surface current after all outputs are gone

2016-07-29 Thread Armin Krezović
When all outputs are gone, there are no current read/write
surfaces associated with a context. This makes the previously
created dummy surface current until an output gets attached
to avoid any potential crashes.

Signed-off-by: Armin Krezović 
---
 libweston/gl-renderer.c | 27 +++
 1 file changed, 27 insertions(+)

diff --git a/libweston/gl-renderer.c b/libweston/gl-renderer.c
index be6b11e..56eb344 100644
--- a/libweston/gl-renderer.c
+++ b/libweston/gl-renderer.c
@@ -167,6 +167,7 @@ struct gl_surface_state {
 
 struct gl_renderer {
struct weston_renderer base;
+   struct weston_compositor *compositor;
int fragment_shader_debug;
int fan_debug;
struct weston_binding *fragment_binding;
@@ -216,6 +217,9 @@ struct gl_renderer {
struct gl_shader *current_shader;
 
struct wl_signal destroy_signal;
+
+   struct wl_signal output_destroy_signal;
+   struct wl_listener output_destroy_listener;
 };
 
 static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL;
@@ -2642,6 +2646,8 @@ gl_renderer_destroy(struct weston_compositor *ec)
eglTerminate(gr->egl_display);
eglReleaseThread();
 
+   wl_list_remove(>output_destroy_listener.link);
+
wl_array_release(>vertices);
wl_array_release(>vtxcnt);
 
@@ -2827,6 +2833,21 @@ platform_to_extension(EGLenum platform)
}
 }
 
+static void
+output_handle_destroy(struct wl_listener *listener, void *data)
+{
+   struct gl_renderer *gr;
+   struct weston_compositor *ec;
+
+   gr = container_of(listener, struct gl_renderer,
+ output_destroy_listener);
+   ec = gr->compositor;
+
+   if (wl_list_empty(>output_list))
+   eglMakeCurrent(gr->egl_display, gr->dummy_surface,
+  gr->dummy_surface, gr->egl_context);
+}
+
 static int
 gl_renderer_create_pbuffer_surface(struct gl_renderer *gr) {
EGLConfig pbuffer_config;
@@ -2884,6 +2905,7 @@ gl_renderer_create(struct weston_compositor *ec, EGLenum 
platform,
if (gr == NULL)
return -1;
 
+   gr->compositor = ec;
gr->base.read_pixels = gl_renderer_read_pixels;
gr->base.repaint_output = gl_renderer_repaint_output;
gr->base.flush_damage = gl_renderer_flush_damage;
@@ -2962,6 +2984,7 @@ gl_renderer_create(struct weston_compositor *ec, EGLenum 
platform,
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGB565);
 
wl_signal_init(>destroy_signal);
+   wl_signal_init(>output_destroy_signal);
 
if (gl_renderer_setup(ec, gr->dummy_surface) < 0) {
if (gr->dummy_surface != EGL_NO_SURFACE)
@@ -3136,6 +3159,10 @@ gl_renderer_setup(struct weston_compositor *ec, 
EGLSurface egl_surface)
fan_debug_repaint_binding,
ec);
 
+   gr->output_destroy_listener.notify = output_handle_destroy;
+   wl_signal_add(>output_destroyed_signal,
+ >output_destroy_listener);
+
weston_log("GL ES 2 renderer features:\n");
weston_log_continue(STAMP_SPACE "read-back format: %s\n",
ec->read_format == PIXMAN_a8r8g8b8 ? "BGRA" : "RGBA");
-- 
2.9.2

___
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel