[Mesa-dev] [PATCH 1/4] mesa: replace UsesClipDistance with ClipDistanceArraySize

Tobias Klausmann tobias.johannes.klausmann at mni.thm.de
Sun Oct 18 12:38:42 PDT 2015



On 18.10.2015 19:14, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> This is more practical and needed by gallium.
> ---
>   src/glsl/linker.cpp                | 33 +++++++++++++++------------------
>   src/glsl/nir/glsl_to_nir.cpp       |  3 ++-
>   src/mesa/drivers/dri/i965/brw_vs.c |  2 +-
>   src/mesa/main/mtypes.h             |  5 +----
>   src/mesa/main/shaderapi.c          |  6 +++---
>   5 files changed, 22 insertions(+), 27 deletions(-)
>
> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
> index 25ca928..9dd7a49 100644
> --- a/src/glsl/linker.cpp
> +++ b/src/glsl/linker.cpp
> @@ -651,7 +651,7 @@ link_invalidate_variable_locations(exec_list *ir)
>   
>   
>   /**
> - * Set UsesClipDistance and ClipDistanceArraySize based on the given shader.
> + * Set ClipDistanceArraySize based on the given shader.
>    *
>    * Also check for errors based on incorrect usage of gl_ClipVertex and
>    * gl_ClipDistance.
> @@ -660,7 +660,7 @@ link_invalidate_variable_locations(exec_list *ir)
>    */
>   static void
>   analyze_clip_usage(struct gl_shader_program *prog,
> -                   struct gl_shader *shader, GLboolean *UsesClipDistance,
> +                   struct gl_shader *shader,
>                      GLuint *ClipDistanceArraySize)
>   {
>      *ClipDistanceArraySize = 0;
> @@ -686,13 +686,14 @@ analyze_clip_usage(struct gl_shader_program *prog,
>                         _mesa_shader_stage_to_string(shader->Stage));
>            return;
>         }
> -      *UsesClipDistance = clip_distance.variable_found();
> -      ir_variable *clip_distance_var =
> -         shader->symbols->get_variable("gl_ClipDistance");
> -      if (clip_distance_var)
> +
> +      if (clip_distance.variable_found()) {
> +         ir_variable *clip_distance_var =
> +               shader->symbols->get_variable("gl_ClipDistance");
> +
> +         assert(clip_distance_var);
>            *ClipDistanceArraySize = clip_distance_var->type->length;
> -   } else {
> -      *UsesClipDistance = false;
> +      }
>      }
>   }
>   
> @@ -700,8 +701,7 @@ analyze_clip_usage(struct gl_shader_program *prog,
>   /**
>    * Verify that a vertex shader executable meets all semantic requirements.
>    *
> - * Also sets prog->Vert.UsesClipDistance and prog->Vert.ClipDistanceArraySize
> - * as a side effect.
> + * Also sets prog->Vert.ClipDistanceArraySize as a side effect.
>    *
>    * \param shader  Vertex shader executable to be verified
>    */
> @@ -754,8 +754,7 @@ validate_vertex_shader_executable(struct gl_shader_program *prog,
>         }
>      }
>   
> -   analyze_clip_usage(prog, shader, &prog->Vert.UsesClipDistance,
> -                      &prog->Vert.ClipDistanceArraySize);
> +   analyze_clip_usage(prog, shader, &prog->Vert.ClipDistanceArraySize);
>   }
>   
>   void
> @@ -765,8 +764,7 @@ validate_tess_eval_shader_executable(struct gl_shader_program *prog,
>      if (shader == NULL)
>         return;
>   
> -   analyze_clip_usage(prog, shader, &prog->TessEval.UsesClipDistance,
> -                      &prog->TessEval.ClipDistanceArraySize);
> +   analyze_clip_usage(prog, shader, &prog->TessEval.ClipDistanceArraySize);
>   }
>   
>   
> @@ -797,8 +795,8 @@ validate_fragment_shader_executable(struct gl_shader_program *prog,
>   /**
>    * Verify that a geometry shader executable meets all semantic requirements
>    *
> - * Also sets prog->Geom.VerticesIn, prog->Geom.UsesClipDistance, and
> - * prog->Geom.ClipDistanceArraySize as a side effect.
> + * Also sets prog->Geom.VerticesIn, and prog->Geom.ClipDistanceArraySize as
> + * a side effect.
>    *
>    * \param shader Geometry shader executable to be verified
>    */
> @@ -812,8 +810,7 @@ validate_geometry_shader_executable(struct gl_shader_program *prog,
>      unsigned num_vertices = vertices_per_prim(prog->Geom.InputType);
>      prog->Geom.VerticesIn = num_vertices;
>   
> -   analyze_clip_usage(prog, shader, &prog->Geom.UsesClipDistance,
> -                      &prog->Geom.ClipDistanceArraySize);
> +   analyze_clip_usage(prog, shader, &prog->Geom.ClipDistanceArraySize);
>   }
>   
>   /**
> diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp
> index cf5bb93..3f7cc83 100644
> --- a/src/glsl/nir/glsl_to_nir.cpp
> +++ b/src/glsl/nir/glsl_to_nir.cpp
> @@ -160,7 +160,8 @@ glsl_to_nir(const struct gl_shader_program *shader_prog,
>      shader->info.outputs_written = sh->Program->OutputsWritten;
>      shader->info.system_values_read = sh->Program->SystemValuesRead;
>      shader->info.uses_texture_gather = sh->Program->UsesGather;
> -   shader->info.uses_clip_distance_out = sh->Program->UsesClipDistanceOut;
> +   shader->info.uses_clip_distance_out =
> +      sh->Program->ClipDistanceArraySize != 0;

Have you tested this working? At some place we fix up the size of the 
arrays (from "unsized" to 1 for 1D if i'm not mistaken), not sure if you 
will break something here.

>      shader->info.separate_shader = shader_prog->SeparateShader;
>      shader->info.gs.vertices_out = sh->Geom.VerticesOut;
>      shader->info.gs.invocations = sh->Geom.Invocations;
> diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
> index de9a867..f1df2df 100644
> --- a/src/mesa/drivers/dri/i965/brw_vs.c
> +++ b/src/mesa/drivers/dri/i965/brw_vs.c
> @@ -346,7 +346,7 @@ brw_vs_populate_key(struct brw_context *brw,
>   
>      if (ctx->Transform.ClipPlanesEnabled != 0 &&
>          ctx->API == API_OPENGL_COMPAT &&
> -       !vp->program.Base.UsesClipDistanceOut) {
> +       vp->program.Base.ClipDistanceArraySize == 0) {
>         key->nr_userclip_plane_consts =
>            _mesa_logbase2(ctx->Transform.ClipPlanesEnabled) + 1;
>      }
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index e9d8ea4..610c25d 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1909,7 +1909,7 @@ struct gl_program
>       * For vertex and geometry shaders, true if the program uses the
>       * gl_ClipDistance output.  Ignored for fragment shaders.
>       */
> -   GLboolean UsesClipDistanceOut;
> +   unsigned ClipDistanceArraySize;
>   
>   
>      /** Named parameters, constants, etc. from program text */
> @@ -2632,7 +2632,6 @@ struct gl_shader_program
>          * True if gl_ClipDistance is written to.  Copied into
>          * gl_tess_eval_program by _mesa_copy_linked_program_data().
>          */
> -      GLboolean UsesClipDistance;
>         GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
>                                            0 if not present. */
>      } TessEval;
> @@ -2655,7 +2654,6 @@ struct gl_shader_program
>          * True if gl_ClipDistance is written to.  Copied into
>          * gl_geometry_program by _mesa_copy_linked_program_data().
>          */
> -      GLboolean UsesClipDistance;
>         GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
>                                            0 if not present. */
>         bool UsesEndPrimitive;
> @@ -2668,7 +2666,6 @@ struct gl_shader_program
>          * True if gl_ClipDistance is written to.  Copied into gl_vertex_program
>          * by _mesa_copy_linked_program_data().
>          */
> -      GLboolean UsesClipDistance;
>         GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or
>                                            0 if not present. */
>      } Vert;
> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
> index 6a2f60d..96d68af 100644
> --- a/src/mesa/main/shaderapi.c
> +++ b/src/mesa/main/shaderapi.c
> @@ -2072,7 +2072,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type,
>   {
>      switch (type) {
>      case MESA_SHADER_VERTEX:
> -      dst->UsesClipDistanceOut = src->Vert.UsesClipDistance;
> +      dst->ClipDistanceArraySize = src->Vert.ClipDistanceArraySize;
>         break;
>      case MESA_SHADER_TESS_CTRL: {
>         struct gl_tess_ctrl_program *dst_tcp =
> @@ -2087,7 +2087,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type,
>         dst_tep->Spacing = src->TessEval.Spacing;
>         dst_tep->VertexOrder = src->TessEval.VertexOrder;
>         dst_tep->PointMode = src->TessEval.PointMode;
> -      dst->UsesClipDistanceOut = src->TessEval.UsesClipDistance;
> +      dst->ClipDistanceArraySize = src->TessEval.ClipDistanceArraySize;
>         break;
>      }
>      case MESA_SHADER_GEOMETRY: {
> @@ -2097,7 +2097,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type,
>         dst_gp->Invocations = src->Geom.Invocations;
>         dst_gp->InputType = src->Geom.InputType;
>         dst_gp->OutputType = src->Geom.OutputType;
> -      dst->UsesClipDistanceOut = src->Geom.UsesClipDistance;
> +      dst->ClipDistanceArraySize = src->Geom.ClipDistanceArraySize;
>         dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive;
>         dst_gp->UsesStreams = src->Geom.UsesStreams;
>         break;



More information about the mesa-dev mailing list