mesa: add fragdata_arrays list to gl_shader
authorTapani Pälli <tapani.palli@intel.com>
Tue, 27 Oct 2015 11:18:41 +0000 (13:18 +0200)
committerTapani Pälli <tapani.palli@intel.com>
Thu, 29 Oct 2015 15:16:22 +0000 (17:16 +0200)
This is required to store information about fragdata arrays, currently
these variables get lost and cannot be retrieved later in sensible way
for program interface queries. List will be utilized by next patch.

Patch also modifies opt_dead_builtin_varyings pass to build list when
lowering fragdata arrays. This is identical approach as taken with
packed varyings pass.

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Marta Lofstedt <marta.lofstedt@intel.com>
src/glsl/opt_dead_builtin_varyings.cpp
src/mesa/main/mtypes.h

index 31719d20c0509563acbfce54cf8198002c9e7526..68b70eedf9272f3a22da860263fda7387a7117c6 100644 (file)
@@ -269,14 +269,14 @@ public:
  */
 class replace_varyings_visitor : public ir_rvalue_visitor {
 public:
-   replace_varyings_visitor(exec_list *ir,
+   replace_varyings_visitor(struct gl_shader *sha,
                             const varying_info_visitor *info,
                             unsigned external_texcoord_usage,
                             unsigned external_color_usage,
                             bool external_has_fog)
-      : info(info), new_fog(NULL)
+      : shader(sha), info(info), new_fog(NULL)
    {
-      void *const ctx = ir;
+      void *const ctx = shader->ir;
 
       memset(this->new_fragdata, 0, sizeof(this->new_fragdata));
       memset(this->new_texcoord, 0, sizeof(this->new_texcoord));
@@ -293,14 +293,16 @@ public:
        * occurrences of gl_TexCoord will be replaced with.
        */
       if (info->lower_texcoord_array) {
-         prepare_array(ir, this->new_texcoord, ARRAY_SIZE(this->new_texcoord),
+         prepare_array(shader->ir, this->new_texcoord,
+                       ARRAY_SIZE(this->new_texcoord),
                        VARYING_SLOT_TEX0, "TexCoord", mode_str,
                        info->texcoord_usage, external_texcoord_usage);
       }
 
       /* Handle gl_FragData in the same way like gl_TexCoord. */
       if (info->lower_fragdata_array) {
-         prepare_array(ir, this->new_fragdata, ARRAY_SIZE(this->new_fragdata),
+         prepare_array(shader->ir, this->new_fragdata,
+                       ARRAY_SIZE(this->new_fragdata),
                        FRAG_RESULT_DATA0, "FragData", mode_str,
                        info->fragdata_usage, (1 << MAX_DRAW_BUFFERS) - 1);
       }
@@ -340,7 +342,7 @@ public:
       }
 
       /* Now do the replacing. */
-      visit_list_elements(this, ir);
+      visit_list_elements(this, shader->ir);
    }
 
    void prepare_array(exec_list *ir,
@@ -389,6 +391,13 @@ public:
       /* Remove the gl_FragData array. */
       if (this->info->lower_fragdata_array &&
           var == this->info->fragdata_array) {
+
+         /* Clone variable for program resource list before it is removed. */
+         if (!shader->fragdata_arrays)
+            shader->fragdata_arrays = new (shader) exec_list;
+
+         shader->fragdata_arrays->push_tail(var->clone(shader, NULL));
+
          var->remove();
       }
 
@@ -487,6 +496,7 @@ public:
    }
 
 private:
+   struct gl_shader *shader;
    const varying_info_visitor *info;
    ir_variable *new_fragdata[MAX_DRAW_BUFFERS];
    ir_variable *new_texcoord[MAX_TEXTURE_COORD_UNITS];
@@ -498,20 +508,20 @@ private:
 } /* anonymous namespace */
 
 static void
-lower_texcoord_array(exec_list *ir, const varying_info_visitor *info)
+lower_texcoord_array(struct gl_shader *shader, const varying_info_visitor *info)
 {
-   replace_varyings_visitor(ir, info,
+   replace_varyings_visitor(shader, info,
                             (1 << MAX_TEXTURE_COORD_UNITS) - 1,
                             1 | 2, true);
 }
 
 static void
-lower_fragdata_array(exec_list *ir)
+lower_fragdata_array(struct gl_shader *shader)
 {
    varying_info_visitor info(ir_var_shader_out, true);
-   info.get(ir, 0, NULL);
+   info.get(shader->ir, 0, NULL);
 
-   replace_varyings_visitor(ir, &info, 0, 0, 0);
+   replace_varyings_visitor(shader, &info, 0, 0, 0);
 }
 
 
@@ -523,7 +533,7 @@ do_dead_builtin_varyings(struct gl_context *ctx,
 {
    /* Lower the gl_FragData array to separate variables. */
    if (consumer && consumer->Stage == MESA_SHADER_FRAGMENT) {
-      lower_fragdata_array(consumer->ir);
+      lower_fragdata_array(consumer);
    }
 
    /* Lowering of built-in varyings has no effect with the core context and
@@ -544,7 +554,7 @@ do_dead_builtin_varyings(struct gl_context *ctx,
       if (!consumer) {
          /* At least eliminate unused gl_TexCoord elements. */
          if (producer_info.lower_texcoord_array) {
-            lower_texcoord_array(producer->ir, &producer_info);
+            lower_texcoord_array(producer, &producer_info);
          }
          return;
       }
@@ -556,7 +566,7 @@ do_dead_builtin_varyings(struct gl_context *ctx,
       if (!producer) {
          /* At least eliminate unused gl_TexCoord elements. */
          if (consumer_info.lower_texcoord_array) {
-            lower_texcoord_array(consumer->ir, &consumer_info);
+            lower_texcoord_array(consumer, &consumer_info);
          }
          return;
       }
@@ -566,7 +576,7 @@ do_dead_builtin_varyings(struct gl_context *ctx,
    if (producer_info.lower_texcoord_array ||
        producer_info.color_usage ||
        producer_info.has_fog) {
-      replace_varyings_visitor(producer->ir,
+      replace_varyings_visitor(producer,
                                &producer_info,
                                consumer_info.texcoord_usage,
                                consumer_info.color_usage,
@@ -587,7 +597,7 @@ do_dead_builtin_varyings(struct gl_context *ctx,
    if (consumer_info.lower_texcoord_array ||
        consumer_info.color_usage ||
        consumer_info.has_fog) {
-      replace_varyings_visitor(consumer->ir,
+      replace_varyings_visitor(consumer,
                                &consumer_info,
                                producer_info.texcoord_usage,
                                producer_info.color_usage,
index 34120cf5777a0761263006b1607ad5fa7373a474..10e158618f7790d755a941b0d99ef07b39349f96 100644 (file)
@@ -2292,6 +2292,7 @@ struct gl_shader
 
    struct exec_list *ir;
    struct exec_list *packed_varyings;
+   struct exec_list *fragdata_arrays;
    struct glsl_symbol_table *symbols;
 
    bool uses_builtin_functions;