[Piglit] [PATCH v3 1/3] piglit-util-gl: Add piglit_get_gl_enum_from_name
Dylan Baker
baker.dylan.c at gmail.com
Mon Feb 23 16:23:15 PST 2015
This generally looks good. As long as Ilia has no objections neither do
I. I have a few minor comments, but they're minor and you can take them
or leave them.
Reviewed-by: Dylan Baker <baker.dylan.c at gmail.com>
On Mon, Feb 23, 2015 at 01:22:22PM -0800, Jordan Justen wrote:
> v2:
> * Use key based sorting rather than cmp
> * Print message to stderr before aborting in
> piglit_get_gl_enum_from_name
> * Use const with static data in piglit_get_gl_enum_from_name
>
> v3:
> * Convert list comprehesion to for loops
> * Only gather the default namespace enums once
> * Remove reduce on enums_by_name since it appears the names are
> unique as returned from get_enums_in_default_namespace
>
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> Reviewed-by: Chad Versace <chad.versace at intel.com> (v1)
> ---
> tests/util/gen_dispatch.py | 29 ++++++++++++++++--------
> tests/util/piglit-util-gl-enum-gen.c.mako | 37 +++++++++++++++++++++++++++++++
> tests/util/piglit-util-gl.h | 9 ++++++++
> 3 files changed, 66 insertions(+), 9 deletions(-)
>
> diff --git a/tests/util/gen_dispatch.py b/tests/util/gen_dispatch.py
> index 4d7d756..73af820 100644
> --- a/tests/util/gen_dispatch.py
> +++ b/tests/util/gen_dispatch.py
> @@ -131,30 +131,41 @@ class EnumCode(object):
> @classmethod
> def emit(cls, out_dir, gl_registry):
> assert isinstance(gl_registry, registry.gl.Registry)
> - enums = cls.get_unique_enums_in_default_namespace(gl_registry)
> + enums = cls.get_enums_in_default_namespace(gl_registry)
> + unique_enums = cls.get_unique_enums(enums)
> + enums_by_name = cls.get_enums_by_name(enums)
> render_template(
> cls.C_TEMPLATE,
> out_dir,
> gl_registry=gl_registry,
> - sorted_unique_enums_in_default_namespace=enums)
> + sorted_unique_enums_in_default_namespace=unique_enums,
> + sorted_enums_by_name=enums_by_name)
>
> @classmethod
> - def get_unique_enums_in_default_namespace(cls, gl_registry):
> + def get_enums_in_default_namespace(cls, gl_registry):
> + enums = []
> + for enum_group in gl_registry.enum_groups:
> + if enum_group.type == 'default_namespace':
Can you just use extend?:
enums.extend(enum_group.enums)
> + for enum in enum_group.enums:
> + enums.append(enum)
> + return enums
> +
> + @classmethod
> + def get_unique_enums(cls, enums):
> def append_enum_if_new_value(enum_list, enum):
> if enum_list[-1].num_value < enum.num_value:
> enum_list.append(enum)
> return enum_list
>
> - enums = (
> - enum
> - for enum_group in gl_registry.enum_groups
> - if enum_group.type == 'default_namespace'
> - for enum in enum_group.enums
> - )
> enums = sorted(enums)
> enums = reduce(append_enum_if_new_value, enums[1:], [enums[0]])
> return enums
>
> + @classmethod
> + def get_enums_by_name(cls, enums):
> + enums = sorted(enums, key=lambda enum: enum.name)
> + return enums
> +
you could drop the assignment and just directly return sorted(...)
>
> if __name__ == '__main__':
> main()
> diff --git a/tests/util/piglit-util-gl-enum-gen.c.mako b/tests/util/piglit-util-gl-enum-gen.c.mako
> index e22a75d..9a0fff8 100644
> --- a/tests/util/piglit-util-gl-enum-gen.c.mako
> +++ b/tests/util/piglit-util-gl-enum-gen.c.mako
> @@ -50,4 +50,41 @@ piglit_get_prim_name(GLenum prim)
> >-------default: return "(unrecognized enum)";
> >-------}
> }
> +
> +struct gl_name_to_enum {
> +>-------const char *name;
> +>-------GLenum _enum;
> +};
> +
> +static int
> +compare_enum_name(const void *a, const void *b)
> +{
> +>-------return strcmp(((struct gl_name_to_enum*)a)->name,
> +>------- ((struct gl_name_to_enum*)b)->name);
> +}
> +
> +GLenum
> +piglit_get_gl_enum_from_name(const char *name)
> +{
> +>-------static const struct gl_name_to_enum names[] = {
> +% for enum in sorted_enums_by_name:
> +>------->-------{ "${enum.name}", ${enum.c_num_literal} },
> +% endfor
> +>-------};
> +>-------struct gl_name_to_enum key = { name, 0 };
> +>-------struct gl_name_to_enum *result;
> +
> +>-------result = (struct gl_name_to_enum*)
> +>------->-------bsearch(&key,
> +>------->------- names, ARRAY_SIZE(names), sizeof names[0],
> +>------->------- compare_enum_name);
> +
> +>-------if (result == NULL) {
> +>------->-------fprintf(stderr, "No known enum named %s!\n", name);
> +>------->-------abort();
> +>-------}
> +
> +>-------return result->_enum;
> +}
> +
> </%block>\
> diff --git a/tests/util/piglit-util-gl.h b/tests/util/piglit-util-gl.h
> index 0f8eb81..fa4a6e4 100644
> --- a/tests/util/piglit-util-gl.h
> +++ b/tests/util/piglit-util-gl.h
> @@ -87,6 +87,15 @@ const char* piglit_get_gl_error_name(GLenum error);
> const char *piglit_get_gl_enum_name(GLenum param);
>
> /**
> + * \brief Convert a string to a GL enum.
> + *
> + * For example, given "GL_INVALID_ENUM", return GL_INVALID_ENUM.
> + *
> + * abort() if the string is not recognized.
> + */
> +GLenum piglit_get_gl_enum_from_name(const char *name);
> +
> +/**
> * \brief Convert a GL primitive type enum value to a string.
> *
> * For example, given GL_POLYGON, return "GL_POLYGON".
> --
> 2.1.4
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20150223/16d8f260/attachment.sig>
More information about the Piglit
mailing list