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

Tom Stellard tom at stellard.net
Mon Nov 5 12:14:28 PST 2012


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;
+   }
+
    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);
-- 
1.7.11.4



More information about the mesa-dev mailing list