On Thu, 12 Nov 2015 14:01:33 -0600
Derek Foreman <[email protected]> wrote:

> From: Jason Ekstrand <[email protected]>
> 
> This provides a standardized mechanism for tracking protocol object
> versions in client code.  The wl_display object is created with version 1.
> Every time an object is created from within wl_registry_bind, it gets the
> bound version.  Every other time an object is created, it simply inherits
> it's version from the parent object that created it.
> 
> ---
> Sooo, seems to finally fix the EGLSwapBuffersWithDamage problem, we also
> need this patch.  However, it's not complete.
> 
> I've rebased it and updated it.  Here's the original posting:
> http://lists.freedesktop.org/archives/wayland-devel/2014-April/014004.html
> 
> Of special importance is:
> http://lists.freedesktop.org/archives/wayland-devel/2014-April/014011.html
> 
> And the proposed solution to the new backwards compatibility issue.  If we
> get a consensus on a way forward, I can pick this up and finish it off...
> 
>  src/scanner.c             |  29 ++++++++----
>  src/wayland-client-core.h |  14 ++++++
>  src/wayland-client.c      | 112 
> +++++++++++++++++++++++++++++++++++++++++++---
>  3 files changed, 140 insertions(+), 15 deletions(-)
> 
> diff --git a/src/scanner.c b/src/scanner.c
> index 8ecdd56..850e72a 100644
> --- a/src/scanner.c
> +++ b/src/scanner.c
> @@ -889,6 +889,14 @@ emit_stubs(struct wl_list *message_list, struct 
> interface *interface)
>              interface->name, interface->name, interface->name,
>              interface->name);
>  
> +     printf("static inline uint32_t\n"
> +            "%s_get_version(struct %s *%s)\n"
> +            "{\n"
> +            "\treturn wl_proxy_get_version((struct wl_proxy *) %s);\n"
> +            "}\n\n",
> +            interface->name, interface->name, interface->name,
> +            interface->name);
> +
>       has_destructor = 0;
>       has_destroy = 0;
>       wl_list_for_each(m, message_list, link) {
> @@ -960,20 +968,25 @@ emit_stubs(struct wl_list *message_list, struct 
> interface *interface)
>  
>               printf(")\n"
>                      "{\n");
> -             if (ret) {
> +             if (ret && ret->interface_name == NULL) {

Hi,

it took a while to decipher what all these cases are. This one is the
wl_registry.bind case: new_id without hardcoded type in the XML.

>                       printf("\tstruct wl_proxy *%s;\n\n"
> -                            "\t%s = wl_proxy_marshal_constructor("
> +                            "\t%s = wl_proxy_marshal_constructor_versioned("
>                              "(struct wl_proxy *) %s,\n"
> -                            "\t\t\t %s_%s, ",
> +                            "\t\t\t %s_%s, interface, version",
>                              ret->name, ret->name,
>                              interface->name,
>                              interface->uppercase_name,
>                              m->uppercase_name);
> -
> -                     if (ret->interface_name == NULL)
> -                             printf("interface");
> -                     else
> -                             printf("&%s_interface", ret->interface_name);
> +             } else if (ret) {

This is the normal factory case: new_id with hardcoded type.

> +                     printf("\tstruct wl_proxy *%s;\n\n"
> +                            "\t%s = wl_proxy_marshal_constructor("
> +                            "(struct wl_proxy *) %s,\n"
> +                            "\t\t\t %s_%s, &%s_interface",
> +                            ret->name, ret->name,
> +                            interface->name,
> +                            interface->uppercase_name,
> +                            m->uppercase_name,
> +                            ret->interface_name);
>               } else {

And this is the usual case of no new_id at all.

Would be nice to add comments to that effect.

>                       printf("\twl_proxy_marshal((struct wl_proxy *) %s,\n"
>                              "\t\t\t %s_%s",
> diff --git a/src/wayland-client-core.h b/src/wayland-client-core.h
> index 8b4b4b8..ed41773 100644
> --- a/src/wayland-client-core.h
> +++ b/src/wayland-client-core.h
> @@ -138,10 +138,21 @@ wl_proxy_marshal_constructor(struct wl_proxy *proxy,
>                            const struct wl_interface *interface,
>                            ...);
>  
> +struct wl_proxy *wl_proxy_marshal_constructor_versioned(struct wl_proxy 
> *proxy,

Split.

> +                                                     uint32_t opcode,
> +                                                     const struct 
> wl_interface *interface,
> +                                                     uint32_t version,
> +                                                     ...);
>  struct wl_proxy *
>  wl_proxy_marshal_array_constructor(struct wl_proxy *proxy,
>                                  uint32_t opcode, union wl_argument *args,
>                                  const struct wl_interface *interface);
> +struct wl_proxy *
> +wl_proxy_marshal_array_constructor_versioned(struct wl_proxy *proxy,
> +                                          uint32_t opcode,
> +                                          union wl_argument *args,
> +                                          const struct wl_interface 
> *interface,
> +                                          uint32_t version);
>  
>  void
>  wl_proxy_destroy(struct wl_proxy *proxy);
> @@ -165,6 +176,9 @@ void *
>  wl_proxy_get_user_data(struct wl_proxy *proxy);
>  
>  uint32_t
> +wl_proxy_get_version(struct wl_proxy *proxy);
> +
> +uint32_t
>  wl_proxy_get_id(struct wl_proxy *proxy);
>  
>  const char *

Regardless of the cosmetics:
Reviewed-by: Pekka Paalanen <[email protected]>


Thanks,
pq

Attachment: pgp_ifCQMxP1w.pgp
Description: OpenPGP digital signature

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to