On 12/30/2015 09:53 PM, Marek Olšák wrote:
On Mon, Nov 2, 2015 at 10:12 AM, Tapani Pälli <tapani.pa...@intel.com> wrote:


On 11/02/2015 09:16 AM, Ilia Mirkin wrote:

On Mon, Nov 2, 2015 at 1:58 AM, Tapani Pälli <tapani.pa...@intel.com>
wrote:

Patch changes linker to allocate gl_shader_variable instead of using
ir_variable. This makes it possible to get rid of ir_variables and ir
in memory after linking.

v2: check that we do not create duplicate entries with
      packed varyings

Signed-off-by: Tapani Pälli <tapani.pa...@intel.com>
---
   src/glsl/linker.cpp            | 58
+++++++++++++++++++++++++++++++++++-------
   src/mesa/main/mtypes.h         | 56
++++++++++++++++++++++++++++++++++++++++
   src/mesa/main/shader_query.cpp | 36 +++++++++++++-------------
   3 files changed, 123 insertions(+), 27 deletions(-)

diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 48dd2d3..d0353b4 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -3341,6 +3341,27 @@ build_stageref(struct gl_shader_program *shProg,
const char *name,
      return stages;
   }

+/**
+ * Create gl_shader_variable from ir_variable class.
+ */
+static gl_shader_variable *
+create_shader_variable(struct gl_shader_program *shProg, const
ir_variable *in)
+{
+   gl_shader_variable *out = ralloc(shProg, struct gl_shader_variable);
+   if (!out)
+      return NULL;
+
+   out->type = in->type;
+   out->name = ralloc_strdup(shProg, in->name);


This can fail too, right? Might be nice to error-check.


Thanks, static analysis might complain about this, will fix.


+
+   out->location = in->data.location;
+   out->index = in->data.index;
+   out->patch = in->data.patch;
+   out->mode = in->data.mode;
+
+   return out;
+}
+
   static bool
   add_interface_variables(struct gl_shader_program *shProg,
                           exec_list *ir, GLenum programInterface)
@@ -3392,9 +3413,13 @@ add_interface_variables(struct gl_shader_program
*shProg,
         if (strncmp(var->name, "gl_out_FragData", 15) == 0)
            continue;

-      if (!add_program_resource(shProg, programInterface, var,
-                                build_stageref(shProg, var->name,
-                                               var->data.mode) | mask))
+      gl_shader_variable *sha_v = create_shader_variable(shProg, var);
+      if (!sha_v)
+         return false;
+
+      if (!add_program_resource(shProg, programInterface, sha_v,
+                                build_stageref(shProg, sha_v->name,
+                                               sha_v->mode) | mask))
            return false;
      }
      return true;
@@ -3422,9 +3447,14 @@ add_packed_varyings(struct gl_shader_program
*shProg, int stage)
            default:
               unreachable("unexpected type");
            }
-         if (!add_program_resource(shProg, iface, var,
-                                   build_stageref(shProg, var->name,
-                                                  var->data.mode)))
+
+         gl_shader_variable *sha_v = create_shader_variable(shProg,
var);
+         if (!sha_v)
+            return false;
+
+         if (!add_program_resource(shProg, iface, sha_v,
+                                   build_stageref(shProg, sha_v->name,
+                                                  sha_v->mode)))
               return false;
         }
      }
@@ -3443,7 +3473,12 @@ add_fragdata_arrays(struct gl_shader_program
*shProg)
         ir_variable *var = node->as_variable();
         if (var) {
            assert(var->data.mode == ir_var_shader_out);
-         if (!add_program_resource(shProg, GL_PROGRAM_OUTPUT, var,
+
+         gl_shader_variable *sha_v = create_shader_variable(shProg,
var);
+         if (!sha_v)
+            return false;
+
+         if (!add_program_resource(shProg, GL_PROGRAM_OUTPUT, sha_v,
                                      1 << MESA_SHADER_FRAGMENT))
               return false;
         }
@@ -3723,8 +3758,13 @@ build_program_resource_list(struct
gl_shader_program *shProg)
      if (shProg->SeparateShader) {
         if (!add_packed_varyings(shProg, input_stage))
            return;
-      if (!add_packed_varyings(shProg, output_stage))
-         return;
+      /* Only when dealing with multiple stages, otherwise we would have
+       * duplicate gl_shader_variable entries.
+       */
+      if (input_stage != output_stage) {
+         if (!add_packed_varyings(shProg, output_stage))
+            return;
+      }
      }

      if (!add_fragdata_arrays(shProg))
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index d6c1eb8..0316769 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2519,6 +2519,62 @@ struct gl_active_atomic_buffer
   };

   /**
+ * Data container for shader queries. This holds only the minimal
+ * amount of required information for resource queries to work.
+ */
+struct gl_shader_variable
+{
+   /**
+    * Declared type of the variable
+    */
+   const struct glsl_type *type;
+
+   /**
+    * Declared name of the variable
+    */
+   char *name;
+
+   /**
+    * Storage location of the base of this variable
+    *
+    * The precise meaning of this field depends on the nature of the
variable.
+    *
+    *   - Vertex shader input: one of the values from \c gl_vert_attrib.
+    *   - Vertex shader output: one of the values from \c
gl_varying_slot.
+    *   - Geometry shader input: one of the values from \c
gl_varying_slot.
+    *   - Geometry shader output: one of the values from \c
gl_varying_slot.
+    *   - Fragment shader input: one of the values from \c
gl_varying_slot.
+    *   - Fragment shader output: one of the values from \c
gl_frag_result.
+    *   - Uniforms: Per-stage uniform slot number for default uniform
block.
+    *   - Uniforms: Index within the uniform block definition for UBO
members.
+    *   - Non-UBO Uniforms: explicit location until linking then reused
to
+    *     store uniform slot number.
+    *   - Other: This field is not currently used.
+    *
+    * If the variable is a uniform, shader input, or shader output, and
the
+    * slot has not been assigned, the value will be -1.
+    */
+   int location;
+
+   /**
+    * Output index for dual source blending.
+    *
+    * \note
+    * The GLSL spec only allows the values 0 or 1 for the index in \b
dual
+    * source blending.
+    */
+   unsigned index:1;
+   unsigned patch:1;


Perhaps say a few words about patch? This specifies whether a shader
input/output is per-patch or not in TES/TCS. If you wanted to be
stingy with bits, you could make index/patch be the same thing. But
it's not worth it at this point.


OK, I'll add. This was just copy-paste from ir_variable_data which does not
include any documentation for it.

Hi,

What's the state of this?

I have v3 available here with fixes to Ilia's comments:

http://cgit.freedesktop.org/~tpalli/mesa/commit/?h=floating

I'll rebase and send it to the list.


Thanks,
Marek

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to