[Mesa-dev] [RFC PATCH 07/12] glsl: Add support for linking uniform arrays of arrays

2015-03-21 Thread Timothy Arceri
---
 src/glsl/link_uniform_initializers.cpp | 51 --
 src/glsl/link_uniforms.cpp | 28 +++
 2 files changed, 52 insertions(+), 27 deletions(-)

diff --git a/src/glsl/link_uniform_initializers.cpp 
b/src/glsl/link_uniform_initializers.cpp
index 6907384..7817314 100644
--- a/src/glsl/link_uniform_initializers.cpp
+++ b/src/glsl/link_uniform_initializers.cpp
@@ -100,6 +100,38 @@ copy_constant_to_storage(union gl_constant_value *storage,
 }
 
 void
+copy_constant_array_to_storage(struct gl_uniform_storage *const storage,
+   const ir_constant *val,
+   unsigned int *idx,
+   unsigned int *array_elements,
+   unsigned int boolean_true)
+{
+   if (val-type-fields.array-is_array()) {
+  for (unsigned int i = 0; i  val-type-length; i++) {
+ copy_constant_array_to_storage(storage, val-array_elements[i],
+idx, array_elements, boolean_true);
+  }
+   } else {
+  const enum glsl_base_type base_type =
+val-array_elements[0]-type-base_type;
+  const unsigned int elements = val-array_elements[0]-type-components();
+  unsigned dmul = (base_type == GLSL_TYPE_DOUBLE) ? 2 : 1;
+  unsigned int length = MIN2(val-type-length,
+ (storage-array_elements - *array_elements));
+
+  for (unsigned int i = 0; i  length; i++) {
+ copy_constant_to_storage( storage-storage[*idx],
+  val-array_elements[i],
+  base_type,
+  elements,
+  boolean_true);
+ *idx += elements * dmul;
+ *array_elements = *array_elements + 1;
+  }
+   }
+}
+
+void
 set_sampler_binding(gl_shader_program *prog, const char *name, int binding)
 {
struct gl_uniform_storage *const storage =
@@ -178,7 +210,7 @@ set_uniform_initializer(void *mem_ctx, gl_shader_program 
*prog,
 field_constant = (ir_constant *)field_constant-next;
   }
   return;
-   } else if (type-is_array()  type-fields.array-is_record()) {
+   } else if (type-without_array()-is_record()) {
   const glsl_type *const element_type = type-fields.array;
 
   for (unsigned int i = 0; i  type-length; i++) {
@@ -201,22 +233,11 @@ set_uniform_initializer(void *mem_ctx, gl_shader_program 
*prog,
}
 
if (val-type-is_array()) {
-  const enum glsl_base_type base_type =
-val-array_elements[0]-type-base_type;
-  const unsigned int elements = val-array_elements[0]-type-components();
   unsigned int idx = 0;
-  unsigned dmul = (base_type == GLSL_TYPE_DOUBLE) ? 2 : 1;
+  unsigned int array_elements = 0;
 
-  assert(val-type-length = storage-array_elements);
-  for (unsigned int i = 0; i  storage-array_elements; i++) {
-copy_constant_to_storage( storage-storage[idx],
- val-array_elements[i],
- base_type,
-  elements,
-  boolean_true);
-
-idx += elements * dmul;
-  }
+  copy_constant_array_to_storage(storage, val, idx,
+ array_elements, boolean_true);
} else {
   copy_constant_to_storage(storage-storage,
   val,
diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
index 799c74b..654a1ca 100644
--- a/src/glsl/link_uniforms.cpp
+++ b/src/glsl/link_uniforms.cpp
@@ -49,8 +49,8 @@ values_for_type(const glsl_type *type)
 {
if (type-is_sampler()) {
   return 1;
-   } else if (type-is_array()  type-fields.array-is_sampler()) {
-  return type-array_size();
+   } else if (type-is_array()) {
+  return type-array_size() * values_for_type(type-fields.array);
} else {
   return type-component_slots();
}
@@ -71,6 +71,7 @@ void
 program_resource_visitor::process(ir_variable *var)
 {
const glsl_type *t = var-type;
+   const glsl_type *t_without_array = var-type-without_array();
const bool row_major =
   var-data.matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR;
 
@@ -136,7 +137,7 @@ program_resource_visitor::process(ir_variable *var)
*/
   recursion(var-type, name, strlen(name), row_major, NULL, false);
   ralloc_free(name);
-   } else if (t-without_array()-is_record()) {
+   } else if (t_without_array-is_record()) {
   char *name = ralloc_strdup(NULL, var-name);
   recursion(var-type, name, strlen(name), row_major, NULL, false);
   ralloc_free(name);
@@ -144,8 +145,8 @@ program_resource_visitor::process(ir_variable *var)
   char *name = ralloc_strdup(NULL, var-type-name);
   recursion(var-type, name, strlen(name), row_major, NULL, false);
   ralloc_free(name);
-   } else if (t-is_array()  t-fields.array-is_interface()) {
-  

Re: [Mesa-dev] [RFC PATCH 07/12] glsl: Add support for linking uniform arrays of arrays

2015-03-21 Thread Ilia Mirkin
On Sat, Mar 21, 2015 at 5:49 AM, Timothy Arceri t_arc...@yahoo.com.au wrote:
 ---
  src/glsl/link_uniform_initializers.cpp | 51 
 --
  src/glsl/link_uniforms.cpp | 28 +++
  2 files changed, 52 insertions(+), 27 deletions(-)

 diff --git a/src/glsl/link_uniform_initializers.cpp 
 b/src/glsl/link_uniform_initializers.cpp
 index 6907384..7817314 100644
 --- a/src/glsl/link_uniform_initializers.cpp
 +++ b/src/glsl/link_uniform_initializers.cpp
 @@ -100,6 +100,38 @@ copy_constant_to_storage(union gl_constant_value 
 *storage,
  }

  void
 +copy_constant_array_to_storage(struct gl_uniform_storage *const storage,
 +   const ir_constant *val,
 +   unsigned int *idx,
 +   unsigned int *array_elements,
 +   unsigned int boolean_true)
 +{
 +   if (val-type-fields.array-is_array()) {
 +  for (unsigned int i = 0; i  val-type-length; i++) {
 + copy_constant_array_to_storage(storage, val-array_elements[i],
 +idx, array_elements, boolean_true);
 +  }
 +   } else {
 +  const enum glsl_base_type base_type =
 +val-array_elements[0]-type-base_type;
 +  const unsigned int elements = 
 val-array_elements[0]-type-components();
 +  unsigned dmul = (base_type == GLSL_TYPE_DOUBLE) ? 2 : 1;
 +  unsigned int length = MIN2(val-type-length,
 + (storage-array_elements - 
 *array_elements));
 +
 +  for (unsigned int i = 0; i  length; i++) {
 + copy_constant_to_storage( storage-storage[*idx],
 +  val-array_elements[i],
 +  base_type,
 +  elements,
 +  boolean_true);
 + *idx += elements * dmul;
 + *array_elements = *array_elements + 1;
 +  }
 +   }
 +}
 +
 +void
  set_sampler_binding(gl_shader_program *prog, const char *name, int binding)
  {
 struct gl_uniform_storage *const storage =
 @@ -178,7 +210,7 @@ set_uniform_initializer(void *mem_ctx, gl_shader_program 
 *prog,
  field_constant = (ir_constant *)field_constant-next;
}
return;
 -   } else if (type-is_array()  type-fields.array-is_record()) {
 +   } else if (type-without_array()-is_record()) {

That's not what the old code looked for... it looked for array 
array-of-record. You changed it to record ||-array-of-record ||
array-of-array-of-record || ... . You've done this several times
throughout this change. Are all of these changes safe?

const glsl_type *const element_type = type-fields.array;

for (unsigned int i = 0; i  type-length; i++) {
 @@ -201,22 +233,11 @@ set_uniform_initializer(void *mem_ctx, 
 gl_shader_program *prog,
 }

 if (val-type-is_array()) {
 -  const enum glsl_base_type base_type =
 -val-array_elements[0]-type-base_type;
 -  const unsigned int elements = 
 val-array_elements[0]-type-components();
unsigned int idx = 0;
 -  unsigned dmul = (base_type == GLSL_TYPE_DOUBLE) ? 2 : 1;
 +  unsigned int array_elements = 0;

What is this used for? I don't see it used here or in the function (as
temp shared storage).


 -  assert(val-type-length = storage-array_elements);
 -  for (unsigned int i = 0; i  storage-array_elements; i++) {
 -copy_constant_to_storage( storage-storage[idx],
 - val-array_elements[i],
 - base_type,
 -  elements,
 -  boolean_true);
 -
 -idx += elements * dmul;
 -  }
 +  copy_constant_array_to_storage(storage, val, idx,
 + array_elements, boolean_true);
 } else {
copy_constant_to_storage(storage-storage,
val,
 diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
 index 799c74b..654a1ca 100644
 --- a/src/glsl/link_uniforms.cpp
 +++ b/src/glsl/link_uniforms.cpp
 @@ -49,8 +49,8 @@ values_for_type(const glsl_type *type)
  {
 if (type-is_sampler()) {
return 1;
 -   } else if (type-is_array()  type-fields.array-is_sampler()) {
 -  return type-array_size();
 +   } else if (type-is_array()) {
 +  return type-array_size() * values_for_type(type-fields.array);
 } else {
return type-component_slots();
 }
 @@ -71,6 +71,7 @@ void
  program_resource_visitor::process(ir_variable *var)
  {
 const glsl_type *t = var-type;
 +   const glsl_type *t_without_array = var-type-without_array();
 const bool row_major =
var-data.matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR;

 @@ -136,7 +137,7 @@ program_resource_visitor::process(ir_variable *var)
 */
recursion(var-type, name, strlen(name), row_major, NULL, false);
ralloc_free(name);

Re: [Mesa-dev] [RFC PATCH 07/12] glsl: Add support for linking uniform arrays of arrays

2015-03-21 Thread Timothy Arceri
On Sat, 2015-03-21 at 19:46 -0400, Ilia Mirkin wrote:
 On Sat, Mar 21, 2015 at 5:49 AM, Timothy Arceri t_arc...@yahoo.com.au wrote:
  ---
   src/glsl/link_uniform_initializers.cpp | 51 
  --
   src/glsl/link_uniforms.cpp | 28 +++
   2 files changed, 52 insertions(+), 27 deletions(-)
 
  diff --git a/src/glsl/link_uniform_initializers.cpp 
  b/src/glsl/link_uniform_initializers.cpp
  index 6907384..7817314 100644
  --- a/src/glsl/link_uniform_initializers.cpp
  +++ b/src/glsl/link_uniform_initializers.cpp
  @@ -100,6 +100,38 @@ copy_constant_to_storage(union gl_constant_value 
  *storage,
   }
 
   void
  +copy_constant_array_to_storage(struct gl_uniform_storage *const storage,
  +   const ir_constant *val,
  +   unsigned int *idx,
  +   unsigned int *array_elements,
  +   unsigned int boolean_true)
  +{
  +   if (val-type-fields.array-is_array()) {
  +  for (unsigned int i = 0; i  val-type-length; i++) {
  + copy_constant_array_to_storage(storage, val-array_elements[i],
  +idx, array_elements, boolean_true);
  +  }
  +   } else {
  +  const enum glsl_base_type base_type =
  +val-array_elements[0]-type-base_type;
  +  const unsigned int elements = 
  val-array_elements[0]-type-components();
  +  unsigned dmul = (base_type == GLSL_TYPE_DOUBLE) ? 2 : 1;
  +  unsigned int length = MIN2(val-type-length,
  + (storage-array_elements - 
  *array_elements));
  +
  +  for (unsigned int i = 0; i  length; i++) {
  + copy_constant_to_storage( storage-storage[*idx],
  +  val-array_elements[i],
  +  base_type,
  +  elements,
  +  boolean_true);
  + *idx += elements * dmul;
  + *array_elements = *array_elements + 1;
  +  }
  +   }
  +}
  +
  +void
   set_sampler_binding(gl_shader_program *prog, const char *name, int binding)
   {
  struct gl_uniform_storage *const storage =
  @@ -178,7 +210,7 @@ set_uniform_initializer(void *mem_ctx, 
  gl_shader_program *prog,
   field_constant = (ir_constant *)field_constant-next;
 }
 return;
  -   } else if (type-is_array()  type-fields.array-is_record()) {
  +   } else if (type-without_array()-is_record()) {
 
 That's not what the old code looked for... it looked for array 
 array-of-record. You changed it to record ||-array-of-record ||
 array-of-array-of-record || ... . You've done this several times
 throughout this change. Are all of these changes safe?

Yeah it's safe. In each case you will see that the non array version
would be found in a preceding if statement so all we are really checking
for is
array-of-record || array-of-array-of-record || ...  

 
 const glsl_type *const element_type = type-fields.array;
 
 for (unsigned int i = 0; i  type-length; i++) {
  @@ -201,22 +233,11 @@ set_uniform_initializer(void *mem_ctx, 
  gl_shader_program *prog,
  }
 
  if (val-type-is_array()) {
  -  const enum glsl_base_type base_type =
  -val-array_elements[0]-type-base_type;
  -  const unsigned int elements = 
  val-array_elements[0]-type-components();
 unsigned int idx = 0;
  -  unsigned dmul = (base_type == GLSL_TYPE_DOUBLE) ? 2 : 1;
  +  unsigned int array_elements = 0;
 
 What is this used for? I don't see it used here or in the function (as
 temp shared storage).

It's used in the function to calculate the amount of room left in
storage so we don't overflow if the array is to big. Maybe it should be
renamed to something better storage_count? used_storage_elements?
total_array_elements?
Or maybe I could just add a comment to the function:
/* Used to calculate the space left in storage so we don't
 * overflow if the array is to big.
 */

 
 
  -  assert(val-type-length = storage-array_elements);
  -  for (unsigned int i = 0; i  storage-array_elements; i++) {
  -copy_constant_to_storage( storage-storage[idx],
  - val-array_elements[i],
  - base_type,
  -  elements,
  -  boolean_true);
  -
  -idx += elements * dmul;
  -  }
  +  copy_constant_array_to_storage(storage, val, idx,
  + array_elements, boolean_true);
  } else {
 copy_constant_to_storage(storage-storage,
 val,
  diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
  index 799c74b..654a1ca 100644
  --- a/src/glsl/link_uniforms.cpp
  +++ b/src/glsl/link_uniforms.cpp
  @@ -49,8 +49,8 @@ values_for_type(const glsl_type *type)
   {
  if (type-is_sampler()) {

Re: [Mesa-dev] [RFC PATCH 07/12] glsl: Add support for linking uniform arrays of arrays

2015-03-21 Thread Ilia Mirkin
Perhaps I'm blind, but I don't see where that array var is used beyond just
being incremented. Mind pointing it out?
On Mar 21, 2015 11:31 PM, Timothy Arceri t_arc...@yahoo.com.au wrote:

 On Sat, 2015-03-21 at 19:46 -0400, Ilia Mirkin wrote:
  On Sat, Mar 21, 2015 at 5:49 AM, Timothy Arceri t_arc...@yahoo.com.au
 wrote:
   ---
src/glsl/link_uniform_initializers.cpp | 51
 --
src/glsl/link_uniforms.cpp | 28 +++
2 files changed, 52 insertions(+), 27 deletions(-)
  
   diff --git a/src/glsl/link_uniform_initializers.cpp
 b/src/glsl/link_uniform_initializers.cpp
   index 6907384..7817314 100644
   --- a/src/glsl/link_uniform_initializers.cpp
   +++ b/src/glsl/link_uniform_initializers.cpp
   @@ -100,6 +100,38 @@ copy_constant_to_storage(union gl_constant_value
 *storage,
}
  
void
   +copy_constant_array_to_storage(struct gl_uniform_storage *const
 storage,
   +   const ir_constant *val,
   +   unsigned int *idx,
   +   unsigned int *array_elements,
   +   unsigned int boolean_true)
   +{
   +   if (val-type-fields.array-is_array()) {
   +  for (unsigned int i = 0; i  val-type-length; i++) {
   + copy_constant_array_to_storage(storage,
 val-array_elements[i],
   +idx, array_elements,
 boolean_true);
   +  }
   +   } else {
   +  const enum glsl_base_type base_type =
   +val-array_elements[0]-type-base_type;
   +  const unsigned int elements =
 val-array_elements[0]-type-components();
   +  unsigned dmul = (base_type == GLSL_TYPE_DOUBLE) ? 2 : 1;
   +  unsigned int length = MIN2(val-type-length,
   + (storage-array_elements -
 *array_elements));
   +
   +  for (unsigned int i = 0; i  length; i++) {
   + copy_constant_to_storage( storage-storage[*idx],
   +  val-array_elements[i],
   +  base_type,
   +  elements,
   +  boolean_true);
   + *idx += elements * dmul;
   + *array_elements = *array_elements + 1;
   +  }
   +   }
   +}
   +
   +void
set_sampler_binding(gl_shader_program *prog, const char *name, int
 binding)
{
   struct gl_uniform_storage *const storage =
   @@ -178,7 +210,7 @@ set_uniform_initializer(void *mem_ctx,
 gl_shader_program *prog,
field_constant = (ir_constant *)field_constant-next;
  }
  return;
   -   } else if (type-is_array()  type-fields.array-is_record()) {
   +   } else if (type-without_array()-is_record()) {
 
  That's not what the old code looked for... it looked for array 
  array-of-record. You changed it to record ||-array-of-record ||
  array-of-array-of-record || ... . You've done this several times
  throughout this change. Are all of these changes safe?

 Yeah it's safe. In each case you will see that the non array version
 would be found in a preceding if statement so all we are really checking
 for is
 array-of-record || array-of-array-of-record || ...

 
  const glsl_type *const element_type = type-fields.array;
  
  for (unsigned int i = 0; i  type-length; i++) {
   @@ -201,22 +233,11 @@ set_uniform_initializer(void *mem_ctx,
 gl_shader_program *prog,
   }
  
   if (val-type-is_array()) {
   -  const enum glsl_base_type base_type =
   -val-array_elements[0]-type-base_type;
   -  const unsigned int elements =
 val-array_elements[0]-type-components();
  unsigned int idx = 0;
   -  unsigned dmul = (base_type == GLSL_TYPE_DOUBLE) ? 2 : 1;
   +  unsigned int array_elements = 0;
 
  What is this used for? I don't see it used here or in the function (as
  temp shared storage).

 It's used in the function to calculate the amount of room left in
 storage so we don't overflow if the array is to big. Maybe it should be
 renamed to something better storage_count? used_storage_elements?
 total_array_elements?
 Or maybe I could just add a comment to the function:
 /* Used to calculate the space left in storage so we don't
  * overflow if the array is to big.
  */

 
  
   -  assert(val-type-length = storage-array_elements);
   -  for (unsigned int i = 0; i  storage-array_elements; i++) {
   -copy_constant_to_storage( storage-storage[idx],
   - val-array_elements[i],
   - base_type,
   -  elements,
   -  boolean_true);
   -
   -idx += elements * dmul;
   -  }
   +  copy_constant_array_to_storage(storage, val, idx,
   + array_elements, boolean_true);
   } else {
  copy_constant_to_storage(storage-storage,
 

Re: [Mesa-dev] [RFC PATCH 07/12] glsl: Add support for linking uniform arrays of arrays

2015-03-21 Thread Timothy Arceri
On Sat, 2015-03-21 at 23:35 -0400, Ilia Mirkin wrote:
 Perhaps I'm blind, but I don't see where that array var is used beyond
 just being incremented. Mind pointing it out?

No problem.

unsigned int length = MIN2(val-type-length, (storage-array_elements -
*array_elements));
 
 On Mar 21, 2015 11:31 PM, Timothy Arceri t_arc...@yahoo.com.au
 wrote:
 On Sat, 2015-03-21 at 19:46 -0400, Ilia Mirkin wrote:
  On Sat, Mar 21, 2015 at 5:49 AM, Timothy Arceri
 t_arc...@yahoo.com.au wrote:
   ---
src/glsl/link_uniform_initializers.cpp | 51
 --
src/glsl/link_uniforms.cpp | 28
 +++
2 files changed, 52 insertions(+), 27 deletions(-)
  
   diff --git a/src/glsl/link_uniform_initializers.cpp
 b/src/glsl/link_uniform_initializers.cpp
   index 6907384..7817314 100644
   --- a/src/glsl/link_uniform_initializers.cpp
   +++ b/src/glsl/link_uniform_initializers.cpp
   @@ -100,6 +100,38 @@ copy_constant_to_storage(union
 gl_constant_value *storage,
}
  
void
   +copy_constant_array_to_storage(struct gl_uniform_storage
 *const storage,
   +   const ir_constant *val,
   +   unsigned int *idx,
   +   unsigned int
 *array_elements,
   +   unsigned int boolean_true)
   +{
   +   if (val-type-fields.array-is_array()) {
   +  for (unsigned int i = 0; i  val-type-length; i
 ++) {
   + copy_constant_array_to_storage(storage,
 val-array_elements[i],
   +idx,
 array_elements, boolean_true);
   +  }
   +   } else {
   +  const enum glsl_base_type base_type =
   +val-array_elements[0]-type-base_type;
   +  const unsigned int elements =
 val-array_elements[0]-type-components();
   +  unsigned dmul = (base_type == GLSL_TYPE_DOUBLE) ?
 2 : 1;
   +  unsigned int length = MIN2(val-type-length,
   + (storage-array_elements
 - *array_elements));
   +
   +  for (unsigned int i = 0; i  length; i++) {
   + copy_constant_to_storage(
 storage-storage[*idx],
   +  val-array_elements[i],
   +  base_type,
   +  elements,
   +  boolean_true);
   + *idx += elements * dmul;
   + *array_elements = *array_elements + 1;
   +  }
   +   }
   +}
   +
   +void
set_sampler_binding(gl_shader_program *prog, const char
 *name, int binding)
{
   struct gl_uniform_storage *const storage =
   @@ -178,7 +210,7 @@ set_uniform_initializer(void *mem_ctx,
 gl_shader_program *prog,
field_constant = (ir_constant
 *)field_constant-next;
  }
  return;
   -   } else if (type-is_array() 
 type-fields.array-is_record()) {
   +   } else if (type-without_array()-is_record()) {
 
  That's not what the old code looked for... it looked for
 array 
  array-of-record. You changed it to record ||-array-of-record
 ||
  array-of-array-of-record || ... . You've done this several
 times
  throughout this change. Are all of these changes safe?
 
 Yeah it's safe. In each case you will see that the non array
 version
 would be found in a preceding if statement so all we are
 really checking
 for is
 array-of-record || array-of-array-of-record || ...
 
 
  const glsl_type *const element_type =
 type-fields.array;
  
  for (unsigned int i = 0; i  type-length; i++) {
   @@ -201,22 +233,11 @@ set_uniform_initializer(void
 *mem_ctx, gl_shader_program *prog,
   }
  
   if (val-type-is_array()) {
   -  const enum glsl_base_type base_type =
   -val-array_elements[0]-type-base_type;
   -  const unsigned int elements =
 val-array_elements[0]-type-components();
  unsigned int idx = 0;
   -  unsigned dmul = (base_type == GLSL_TYPE_DOUBLE) ?
 2 : 1;
   +  unsigned int array_elements = 0;
 
  What is this used for? I don't see it used here or in the
 function (as
  temp shared