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

Marek Olšák maraeo at gmail.com
Mon Oct 19 14:34:25 PDT 2015


On Sun, Oct 18, 2015 at 9:38 PM, Tobias Klausmann
<tobias.johannes.klausmann at mni.thm.de> wrote:
>
>
> 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.

"piglit-run .. -t clip" shows no regressions.

Marek


More information about the mesa-dev mailing list