[Mesa-dev] [RFC PATCH 07/12] glsl: Add support for linking uniform arrays of arrays
--- 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
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
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
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
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