[Mesa-dev] [PATCH 3/4] glsl-to-tgsi: Use TGSI_FILE_TEMPORARY_ARRAY for indirect addressing

Brian Paul brianp at vmware.com
Wed Nov 7 16:48:38 PST 2012


On 11/05/2012 01:14 PM, Tom Stellard wrote:
> From: Tom Stellard<thomas.stellard at amd.com>
>
> ---
>   src/mesa/main/mtypes.h                     |  1 +
>   src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 31 +++++++++++++++++++++++++++++-
>   2 files changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index c8f2ca3..4aba5e8 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1861,6 +1861,7 @@ typedef enum
>      PROGRAM_SAMPLER,     /**<  for shader samplers, compile-time only */
>      PROGRAM_SYSTEM_VALUE,/**<  InstanceId, PrimitiveID, etc. */
>      PROGRAM_UNDEFINED,   /**<  Invalid/TBD value */
> +   PROGRAM_ARRAY,       /**<  Values used by indirect addressing. */
>      PROGRAM_FILE_MAX
>   } gl_register_file;
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 14b72dc..151d40b 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -306,6 +306,7 @@ public:
>
>      int glsl_version;
>      bool native_integers;
> +   bool temp_array_supported;
>
>      variable_storage *find_variable_storage(ir_variable *var);
>
> @@ -992,6 +993,12 @@ glsl_to_tgsi_visitor::get_temp(const glsl_type *type)
>      } else {
>         src.swizzle = swizzle_for_size(type->vector_elements);
>      }
> +
> +   if (this->temp_array_supported&&
> +       (type->is_array() || type->is_matrix())) {
> +      src.file = PROGRAM_ARRAY;
> +   }

So any GLSL array will wind up as PROGRAM_ARRAY / 
TGSI_FILE_TEMPORARY_ARRAY even if it's only indexed with compile-time 
constant expressions?


> +
>      src.negate = 0;
>
>      return src;
> @@ -2860,6 +2867,8 @@ glsl_to_tgsi_visitor::glsl_to_tgsi_visitor()
>      indirect_addr_consts = false;
>      glsl_version = 0;
>      native_integers = false;
> +   temp_array_supported = false;
> +
>      mem_ctx = ralloc_context(NULL);
>      ctx = NULL;
>      prog = NULL;
> @@ -3690,6 +3699,7 @@ get_pixel_transfer_visitor(struct st_fragment_program *fp,
>      v->shader_program = NULL;
>      v->glsl_version = original->glsl_version;
>      v->native_integers = original->native_integers;
> +   v->temp_array_supported = original->temp_array_supported;
>      v->options = original->options;
>      v->next_temp = original->next_temp;
>      v->num_address_regs = original->num_address_regs;
> @@ -3821,6 +3831,7 @@ get_bitmap_visitor(struct st_fragment_program *fp,
>      v->shader_program = NULL;
>      v->glsl_version = original->glsl_version;
>      v->native_integers = original->native_integers;
> +   v->temp_array_supported = original->temp_array_supported;
>      v->options = original->options;
>      v->next_temp = original->next_temp;
>      v->num_address_regs = original->num_address_regs;
> @@ -3887,6 +3898,7 @@ struct st_translate {
>      struct ureg_program *ureg;
>
>      struct ureg_dst temps[MAX_TEMPS];
> +   struct ureg_dst array_temps[MAX_TEMPS];
>      struct ureg_src *constants;
>      struct ureg_src *immediates;
>      struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS];
> @@ -4030,6 +4042,11 @@ dst_register(struct st_translate *t,
>      case PROGRAM_ADDRESS:
>         return t->address[index];
>
> +   case PROGRAM_ARRAY:
> +      if (ureg_dst_is_undef(t->array_temps[index]))
> +         t->array_temps[index] = ureg_DECL_temporary_array(t->ureg, index);
> +      return t->array_temps[index];
> +
>      default:
>         assert(!"unknown dst register file");
>         return ureg_dst_undef();
> @@ -4085,6 +4102,12 @@ src_register(struct st_translate *t,
>         assert(index<  (int) Elements(t->systemValues));
>         return t->systemValues[index];
>
> +   case PROGRAM_ARRAY:
> +      assert(index<  (int) Elements(t->array_temps));
> +      if (ureg_dst_is_undef(t->array_temps[index]))
> +         t->array_temps[index] = ureg_DECL_temporary_array(t->ureg, index);
> +      return ureg_src(t->array_temps[index]);
> +
>      default:
>         assert(!"unknown src register file");
>         return ureg_src_undef();
> @@ -4684,7 +4707,6 @@ st_translate_program(
>          * (Note: the number of temporaries is equal to program->next_temp)
>          */
>         for (i = 0; i<  (unsigned)program->next_temp; i++) {
> -         /* XXX use TGSI_FILE_TEMPORARY_ARRAY when it's supported by ureg */
>            t->temps[i] = ureg_DECL_local_temporary(t->ureg);
>         }
>      }
> @@ -4816,19 +4838,24 @@ get_mesa_program(struct gl_context *ctx,
>      bool progress;
>      struct gl_shader_compiler_options *options =
>            &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(shader->Type)];
> +   struct pipe_screen *pscreen = st_context(ctx)->pipe->screen;
> +   unsigned processor_type;
>
>      switch (shader->Type) {
>      case GL_VERTEX_SHADER:
>         target = GL_VERTEX_PROGRAM_ARB;
>         target_string = "vertex";
> +      processor_type = PIPE_SHADER_VERTEX;
>         break;
>      case GL_FRAGMENT_SHADER:
>         target = GL_FRAGMENT_PROGRAM_ARB;
>         target_string = "fragment";
> +      processor_type = PIPE_SHADER_FRAGMENT;
>         break;
>      case GL_GEOMETRY_SHADER:
>         target = GL_GEOMETRY_PROGRAM_NV;
>         target_string = "geometry";
> +      processor_type = PIPE_SHADER_GEOMETRY;
>         break;
>      default:
>         assert(!"should not be reached");
> @@ -4848,6 +4875,8 @@ get_mesa_program(struct gl_context *ctx,
>      v->options = options;
>      v->glsl_version = ctx->Const.GLSLVersion;
>      v->native_integers = ctx->Const.NativeIntegers;
> +   v->temp_array_supported = pscreen->get_shader_param(pscreen, processor_type,
> +                                    PIPE_SHADER_CAP_INDIRECT_TEMP_ARRAY_ADDR );
>
>      _mesa_generate_parameters_list_for_uniforms(shader_program, shader,
>   					       prog->Parameters);

Reviewed-by: Brian Paul <brianp at vmware.com>

Patch 4 looks OK too, but I'm not an r600 person.

-Brian


More information about the mesa-dev mailing list