[Mesa-dev] [PATCH 03/19] st_glsl_to_tgsi: declare temp arrays at the start of translation

Nicolai Hähnle nhaehnle at gmail.com
Tue Aug 9 10:36:32 UTC 2016


From: Nicolai Hähnle <nicolai.haehnle at amd.com>

Unused arrays should have been removed earlier anyway, and it allows us to
remove st_translate::array_sizes.
---
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 4a19fe6..1df4864 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -5143,21 +5143,20 @@ struct st_translate {
    int num_immediates;
    struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS];
    struct ureg_src inputs[PIPE_MAX_SHADER_INPUTS];
    struct ureg_dst address[3];
    struct ureg_src samplers[PIPE_MAX_SAMPLERS];
    struct ureg_src buffers[PIPE_MAX_SHADER_BUFFERS];
    struct ureg_src images[PIPE_MAX_SHADER_IMAGES];
    struct ureg_src systemValues[SYSTEM_VALUE_MAX];
    struct ureg_src shared_memory;
    struct tgsi_texture_offset tex_offsets[MAX_GLSL_TEXTURE_OFFSET];
-   unsigned *array_sizes;
    struct array_decl *input_arrays;
    struct array_decl *output_arrays;
 
    const GLuint *inputMapping;
    const GLuint *outputMapping;
 
    /* For every instruction that contains a label (eg CALL), keep
     * details so that we can go back afterwards and emit the correct
     * tgsi instruction number for each label.
     */
@@ -5350,24 +5349,20 @@ dst_register(struct st_translate *t, gl_register_file file, unsigned index,
       if (ureg_dst_is_undef(t->temps[index]))
          t->temps[index] = ureg_DECL_local_temporary(t->ureg);
 
       return t->temps[index];
 
    case PROGRAM_ARRAY:
       array = index >> 16;
 
       assert(array < t->num_temp_arrays);
 
-      if (ureg_dst_is_undef(t->arrays[array]))
-         t->arrays[array] = ureg_DECL_array_temporary(
-            t->ureg, t->array_sizes[array], TGSI_WRITEMASK_XYZW, TRUE);
-
       return ureg_dst_array_offset(t->arrays[array],
                                    (int)(index & 0xFFFF) - 0x8000);
 
    case PROGRAM_OUTPUT:
       if (!array_id) {
          if (t->procType == PIPE_SHADER_FRAGMENT)
             assert(index < FRAG_RESULT_MAX);
          else if (t->procType == PIPE_SHADER_TESS_CTRL ||
                   t->procType == PIPE_SHADER_TESS_EVAL)
             assert(index < VARYING_SLOT_TESS_MAX);
@@ -6028,24 +6023,32 @@ st_translate_program(
    t = CALLOC_STRUCT(st_translate);
    if (!t) {
       ret = PIPE_ERROR_OUT_OF_MEMORY;
       goto out;
    }
 
    t->procType = procType;
    t->inputMapping = inputMapping;
    t->outputMapping = outputMapping;
    t->ureg = ureg;
+
+   /*
+    * Declare temporary arrays.
+    */
    t->num_temp_arrays = program->next_array;
-   if (t->num_temp_arrays)
+   if (t->num_temp_arrays) {
       t->arrays = (struct ureg_dst*)
                   calloc(1, sizeof(t->arrays[0]) * t->num_temp_arrays);
+      for (i = 0; i < t->num_temp_arrays; ++i)
+         t->arrays[i] = ureg_DECL_array_temporary(
+            t->ureg, program->array_sizes[i], TGSI_WRITEMASK_XYZW, TRUE);
+   }
 
    /*
     * Declare input attributes.
     */
    switch (procType) {
    case PIPE_SHADER_FRAGMENT:
       for (i = 0; i < numInputs; i++) {
          unsigned array_id = 0;
          unsigned array_size;
 
@@ -6243,21 +6246,20 @@ st_translate_program(
             if (procType == PIPE_SHADER_FRAGMENT &&
                 semName == TGSI_SEMANTIC_POSITION)
                emit_wpos(st_context(ctx), t, proginfo, ureg,
                          program->wpos_transform_const);
 
             sysInputs &= ~(1 << i);
          }
       }
    }
 
-   t->array_sizes = program->array_sizes;
    t->input_arrays = program->input_arrays;
    t->output_arrays = program->output_arrays;
 
    /* Emit constants and uniforms.  TGSI uses a single index space for these,
     * so we put all the translated regs in t->constants.
     */
    if (proginfo->Parameters) {
       t->constants = (struct ureg_src *)
          calloc(proginfo->Parameters->NumParameters, sizeof(t->constants[0]));
       if (t->constants == NULL) {
-- 
2.7.4



More information about the mesa-dev mailing list