[Mesa-dev] [PATCH 4/4] tgsi/ureg: simplify code for declaring properties

Commend Sarnex commendsarnex at gmail.com
Fri Nov 14 13:03:38 PST 2014


All four Tested-by: Nick Sarnie <commendsarnex at gmail.com> using Gallium
Nine.

On Sun, Nov 9, 2014 at 6:08 PM, Marek Olšák <maraeo at gmail.com> wrote:

> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
>  src/gallium/auxiliary/tgsi/tgsi_ureg.c        | 153
> ++------------------------
>  src/gallium/auxiliary/tgsi/tgsi_ureg.h        |  35 +-----
>  src/gallium/auxiliary/util/u_simple_shaders.c |   2 +-
>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp    |  12 +-
>  src/mesa/state_tracker/st_mesa_to_tgsi.c      |  12 +-
>  src/mesa/state_tracker/st_program.c           |  23 ++--
>  6 files changed, 43 insertions(+), 194 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> index 6d3ac91..f524dfb 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> @@ -165,15 +165,7 @@ struct ureg_program
>     struct const_decl const_decls;
>     struct const_decl const_decls2D[PIPE_MAX_CONSTANT_BUFFERS];
>
> -   unsigned property_gs_input_prim;
> -   unsigned property_gs_output_prim;
> -   unsigned property_gs_max_vertices;
> -   unsigned property_gs_invocations;
> -   unsigned char property_fs_coord_origin; /* = TGSI_FS_COORD_ORIGIN_* */
> -   unsigned char property_fs_coord_pixel_center; /* =
> TGSI_FS_COORD_PIXEL_CENTER_* */
> -   unsigned char property_fs_color0_writes_all_cbufs; /* =
> TGSI_FS_COLOR0_WRITES_ALL_CBUFS * */
> -   unsigned char property_fs_depth_layout; /* TGSI_FS_DEPTH_LAYOUT */
> -   boolean property_vs_window_space_position; /*
> TGSI_VS_WINDOW_SPACE_POSITION */
> +   unsigned properties[TGSI_PROPERTY_COUNT];
>
>     unsigned nr_addrs;
>     unsigned nr_preds;
> @@ -278,65 +270,10 @@ ureg_dst_register( unsigned file,
>
>
>  void
> -ureg_property_gs_input_prim(struct ureg_program *ureg,
> -                            unsigned input_prim)
> +ureg_property(struct ureg_program *ureg, unsigned name, unsigned value)
>  {
> -   ureg->property_gs_input_prim = input_prim;
> -}
> -
> -void
> -ureg_property_gs_output_prim(struct ureg_program *ureg,
> -                             unsigned output_prim)
> -{
> -   ureg->property_gs_output_prim = output_prim;
> -}
> -
> -void
> -ureg_property_gs_max_vertices(struct ureg_program *ureg,
> -                              unsigned max_vertices)
> -{
> -   ureg->property_gs_max_vertices = max_vertices;
> -}
> -void
> -ureg_property_gs_invocations(struct ureg_program *ureg,
> -                             unsigned invocations)
> -{
> -   ureg->property_gs_invocations = invocations;
> -}
> -
> -void
> -ureg_property_fs_coord_origin(struct ureg_program *ureg,
> -                            unsigned fs_coord_origin)
> -{
> -   ureg->property_fs_coord_origin = fs_coord_origin;
> -}
> -
> -void
> -ureg_property_fs_coord_pixel_center(struct ureg_program *ureg,
> -                            unsigned fs_coord_pixel_center)
> -{
> -   ureg->property_fs_coord_pixel_center = fs_coord_pixel_center;
> -}
> -
> -void
> -ureg_property_fs_color0_writes_all_cbufs(struct ureg_program *ureg,
> -                            unsigned fs_color0_writes_all_cbufs)
> -{
> -   ureg->property_fs_color0_writes_all_cbufs = fs_color0_writes_all_cbufs;
> -}
> -
> -void
> -ureg_property_fs_depth_layout(struct ureg_program *ureg,
> -                              unsigned fs_depth_layout)
> -{
> -   ureg->property_fs_depth_layout = fs_depth_layout;
> -}
> -
> -void
> -ureg_property_vs_window_space_position(struct ureg_program *ureg,
> -                                       boolean vs_window_space_position)
> -{
> -   ureg->property_vs_window_space_position = vs_window_space_position;
> +   assert(name < Elements(ureg->properties));
> +   ureg->properties[name] = value;
>  }
>
>  struct ureg_src
> @@ -1452,77 +1389,9 @@ static void emit_decls( struct ureg_program *ureg )
>  {
>     unsigned i;
>
> -   if (ureg->property_gs_input_prim != ~0) {
> -      assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY);
> -
> -      emit_property(ureg,
> -                    TGSI_PROPERTY_GS_INPUT_PRIM,
> -                    ureg->property_gs_input_prim);
> -   }
> -
> -   if (ureg->property_gs_output_prim != ~0) {
> -      assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY);
> -
> -      emit_property(ureg,
> -                    TGSI_PROPERTY_GS_OUTPUT_PRIM,
> -                    ureg->property_gs_output_prim);
> -   }
> -
> -   if (ureg->property_gs_max_vertices != ~0) {
> -      assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY);
> -
> -      emit_property(ureg,
> -                    TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES,
> -                    ureg->property_gs_max_vertices);
> -   }
> -
> -   if (ureg->property_gs_invocations != ~0) {
> -      assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY);
> -
> -      emit_property(ureg,
> -                    TGSI_PROPERTY_GS_INVOCATIONS,
> -                    ureg->property_gs_invocations);
> -   }
> -
> -   if (ureg->property_fs_coord_origin) {
> -      assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
> -
> -      emit_property(ureg,
> -                    TGSI_PROPERTY_FS_COORD_ORIGIN,
> -                    ureg->property_fs_coord_origin);
> -   }
> -
> -   if (ureg->property_fs_coord_pixel_center) {
> -      assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
> -
> -      emit_property(ureg,
> -                    TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
> -                    ureg->property_fs_coord_pixel_center);
> -   }
> -
> -   if (ureg->property_fs_color0_writes_all_cbufs) {
> -      assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
> -
> -      emit_property(ureg,
> -                    TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS,
> -                    ureg->property_fs_color0_writes_all_cbufs);
> -   }
> -
> -   if (ureg->property_fs_depth_layout) {
> -      assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
> -
> -      emit_property(ureg,
> -                    TGSI_PROPERTY_FS_DEPTH_LAYOUT,
> -                    ureg->property_fs_depth_layout);
> -   }
> -
> -   if (ureg->property_vs_window_space_position) {
> -      assert(ureg->processor == TGSI_PROCESSOR_VERTEX);
> -
> -      emit_property(ureg,
> -                    TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION,
> -                    ureg->property_vs_window_space_position);
> -   }
> +   for (i = 0; i < Elements(ureg->properties); i++)
> +      if (ureg->properties[i] != ~0)
> +         emit_property(ureg, i, ureg->properties[i]);
>
>     if (ureg->processor == TGSI_PROCESSOR_VERTEX) {
>        for (i = 0; i < UREG_MAX_INPUT; i++) {
> @@ -1773,15 +1642,15 @@ void ureg_free_tokens( const struct tgsi_token
> *tokens )
>
>  struct ureg_program *ureg_create( unsigned processor )
>  {
> +   int i;
>     struct ureg_program *ureg = CALLOC_STRUCT( ureg_program );
>     if (ureg == NULL)
>        goto no_ureg;
>
>     ureg->processor = processor;
> -   ureg->property_gs_input_prim = ~0;
> -   ureg->property_gs_output_prim = ~0;
> -   ureg->property_gs_max_vertices = ~0;
> -   ureg->property_gs_invocations = ~0;
> +
> +   for (i = 0; i < Elements(ureg->properties); i++)
> +      ureg->properties[i] = ~0;
>
>     ureg->free_temps = util_bitmask_create();
>     if (ureg->free_temps == NULL)
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> index f014b53..f254b1e 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> @@ -153,40 +153,7 @@ ureg_create_shader_and_destroy( struct ureg_program
> *p,
>   */
>
>  void
> -ureg_property_gs_input_prim(struct ureg_program *ureg,
> -                            unsigned input_prim);
> -
> -void
> -ureg_property_gs_output_prim(struct ureg_program *ureg,
> -                             unsigned output_prim);
> -
> -void
> -ureg_property_gs_max_vertices(struct ureg_program *ureg,
> -                              unsigned max_vertices);
> -
> -void
> -ureg_property_gs_invocations(struct ureg_program *ureg,
> -                             unsigned invocations);
> -
> -void
> -ureg_property_fs_coord_origin(struct ureg_program *ureg,
> -                            unsigned fs_coord_origin);
> -
> -void
> -ureg_property_fs_coord_pixel_center(struct ureg_program *ureg,
> -                            unsigned fs_coord_pixel_center);
> -
> -void
> -ureg_property_fs_color0_writes_all_cbufs(struct ureg_program *ureg,
> -                            unsigned fs_color0_writes_all_cbufs);
> -
> -void
> -ureg_property_fs_depth_layout(struct ureg_program *ureg,
> -                              unsigned fs_depth_layout);
> -
> -void
> -ureg_property_vs_window_space_position(struct ureg_program *ureg,
> -                                       boolean vs_window_space_position);
> +ureg_property(struct ureg_program *ureg, unsigned name, unsigned value);
>
>
>  /***********************************************************************
> diff --git a/src/gallium/auxiliary/util/u_simple_shaders.c
> b/src/gallium/auxiliary/util/u_simple_shaders.c
> index 280ed8f..0eeb7d9 100644
> --- a/src/gallium/auxiliary/util/u_simple_shaders.c
> +++ b/src/gallium/auxiliary/util/u_simple_shaders.c
> @@ -84,7 +84,7 @@ util_make_vertex_passthrough_shader_with_so(struct
> pipe_context *pipe,
>        return NULL;
>
>     if (window_space)
> -      ureg_property_vs_window_space_position(ureg, TRUE);
> +      ureg_property(ureg, TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION, TRUE);
>
>     for (i = 0; i < num_attribs; i++) {
>        struct ureg_src src;
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 0920987..5eb702e 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -4723,7 +4723,8 @@ emit_wpos(struct st_context *st,
>        }
>        else if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) {
>           /* the driver supports lower-left origin, need to invert Y */
> -         ureg_property_fs_coord_origin(ureg,
> TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN,
> +                       TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
>           invert = TRUE;
>        }
>        else
> @@ -4733,7 +4734,8 @@ emit_wpos(struct st_context *st,
>        /* Fragment shader wants origin in lower-left */
>        if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT))
>           /* the driver supports lower-left origin */
> -         ureg_property_fs_coord_origin(ureg,
> TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN,
> +                       TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
>        else if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT))
>           /* the driver supports upper-left origin, need to invert Y */
>           invert = TRUE;
> @@ -4746,7 +4748,8 @@ emit_wpos(struct st_context *st,
>        if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) {
>           /* the driver supports pixel center integer */
>           adjY[1] = (float)t->fs_coord_y_flip;
> -         ureg_property_fs_coord_pixel_center(ureg,
> TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
> +                       TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
>        }
>        else if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) {
>           /* the driver supports pixel center half integer, need to bias
> X,Y */
> @@ -4765,7 +4768,8 @@ emit_wpos(struct st_context *st,
>        else if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) {
>           /* the driver supports pixel center integer, need to bias X,Y */
>           adjX = adjY[0] = adjY[1] = 0.5f;
> -         ureg_property_fs_coord_pixel_center(ureg,
> TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
> +                       TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
>        }
>        else
>           assert(0);
> diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c
> b/src/mesa/state_tracker/st_mesa_to_tgsi.c
> index 5659c08..76341b5 100644
> --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
> +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
> @@ -893,7 +893,8 @@ emit_wpos(struct st_context *st,
>        }
>        else if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) {
>           /* the driver supports lower-left origin, need to invert Y */
> -         ureg_property_fs_coord_origin(ureg,
> TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN,
> +                       TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
>           invert = TRUE;
>        }
>        else
> @@ -903,7 +904,8 @@ emit_wpos(struct st_context *st,
>        /* Fragment shader wants origin in lower-left */
>        if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT))
>           /* the driver supports lower-left origin */
> -         ureg_property_fs_coord_origin(ureg,
> TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN,
> +                       TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
>        else if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT))
>           /* the driver supports upper-left origin, need to invert Y */
>           invert = TRUE;
> @@ -916,7 +918,8 @@ emit_wpos(struct st_context *st,
>        if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) {
>           /* the driver supports pixel center integer */
>           adjY[1] = (float)!t->fs_coord_y_flip;
> -         ureg_property_fs_coord_pixel_center(ureg,
> TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
> +                       TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
>        }
>        else if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) {
>           /* the driver supports pixel center half integer, need to bias
> X,Y */
> @@ -935,7 +938,8 @@ emit_wpos(struct st_context *st,
>        else if (pscreen->get_param(pscreen,
> PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) {
>           /* the driver supports pixel center integer, need to bias X,Y */
>           adjX = adjY[0] = adjY[1] = 0.5f;
> -         ureg_property_fs_coord_pixel_center(ureg,
> TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
> +                       TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
>        }
>        else
>           assert(0);
> diff --git a/src/mesa/state_tracker/st_program.c
> b/src/mesa/state_tracker/st_program.c
> index 926086b..737c269 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -742,21 +742,25 @@ st_translate_fragment_program(struct st_context *st,
>        debug_printf("\n");
>     }
>     if (write_all == GL_TRUE)
> -      ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
> +      ureg_property(ureg, TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS, 1);
>
>     if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) {
>        switch (stfp->Base.FragDepthLayout) {
>        case FRAG_DEPTH_LAYOUT_ANY:
> -         ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
> +                       TGSI_FS_DEPTH_LAYOUT_ANY);
>           break;
>        case FRAG_DEPTH_LAYOUT_GREATER:
> -         ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_GREATER);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
> +                       TGSI_FS_DEPTH_LAYOUT_GREATER);
>           break;
>        case FRAG_DEPTH_LAYOUT_LESS:
> -         ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
> +                       TGSI_FS_DEPTH_LAYOUT_LESS);
>           break;
>        case FRAG_DEPTH_LAYOUT_UNCHANGED:
> -         ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
> +         ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
> +                       TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
>           break;
>        default:
>           assert(0);
> @@ -1122,10 +1126,11 @@ st_translate_geometry_program(struct st_context
> *st,
>        stgp->tgsi.tokens = NULL;
>     }
>
> -   ureg_property_gs_input_prim(ureg, stgp->Base.InputType);
> -   ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
> -   ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
> -   ureg_property_gs_invocations(ureg, stgp->Base.Invocations);
> +   ureg_property(ureg, TGSI_PROPERTY_GS_INPUT_PRIM, stgp->Base.InputType);
> +   ureg_property(ureg, TGSI_PROPERTY_GS_OUTPUT_PRIM,
> stgp->Base.OutputType);
> +   ureg_property(ureg, TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES,
> +                 stgp->Base.VerticesOut);
> +   ureg_property(ureg, TGSI_PROPERTY_GS_INVOCATIONS,
> stgp->Base.Invocations);
>
>     if (stgp->glsl_to_tgsi)
>        st_translate_program(st->ctx,
> --
> 2.1.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141114/c42d6719/attachment-0001.html>


More information about the mesa-dev mailing list