From: Ian Romanick Date: Wed, 28 Apr 2010 20:14:53 +0000 (-0700) Subject: Track and print user defined structure types X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a2c6df556655e3619f5a0cd82b0d11aac37c5692;p=mesa.git Track and print user defined structure types --- diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp index e0913dd9729..357683f0c3d 100644 --- a/ast_to_hir.cpp +++ b/ast_to_hir.cpp @@ -2375,6 +2375,16 @@ ast_struct_specifier::hir(exec_list *instructions, } else { t->generate_constructor(state->symbols); } + + const glsl_type **s = (const glsl_type **) + realloc(state->user_structures, + sizeof(state->user_structures[0]) * + (state->num_user_structures + 1)); + if (s != NULL) { + s[state->num_user_structures] = t; + state->user_structures = s; + state->num_user_structures++; + } } /* Structure type definitions do not have r-values. diff --git a/glsl_parser_extras.h b/glsl_parser_extras.h index 55bcc72e940..125c675a921 100644 --- a/glsl_parser_extras.h +++ b/glsl_parser_extras.h @@ -61,6 +61,10 @@ struct _mesa_glsl_parse_state { /** Loop or switch statement containing the current instructions. */ class ir_instruction *loop_or_switch_nesting; + /** List of structures defined in user code. */ + const glsl_type **user_structures; + unsigned num_user_structures; + /** * \name Enable bits for GLSL extensions */ diff --git a/ir_print_visitor.cpp b/ir_print_visitor.cpp index 272e892a1ec..9edb6803853 100644 --- a/ir_print_visitor.cpp +++ b/ir_print_visitor.cpp @@ -23,12 +23,29 @@ #include #include "ir_print_visitor.h" #include "glsl_types.h" +#include "glsl_parser_extras.h" + +static void print_type(const glsl_type *t); void _mesa_print_ir(exec_list *instructions, struct _mesa_glsl_parse_state *state) { - (void) state; + for (unsigned i = 0; i < state->num_user_structures; i++) { + const glsl_type *const s = state->user_structures[i]; + + printf("(structure (%s) (%s@%08x) (%u) (\n", + s->name, s->name, (unsigned) s, s->length + ); + + for (unsigned j = 0; j < s->length; j++) { + printf("\t(("); + print_type(s->fields.structure[j].type); + printf(")(%s))\n", s->fields.structure[j].name); + } + + printf(")\n"); + } printf("(\n"); foreach_iter(exec_list_iterator, iter, *instructions) { @@ -47,6 +64,9 @@ print_type(const glsl_type *t) printf("(array "); print_type(t->fields.array); printf(" %u)", t->length); + } else if ((t->base_type == GLSL_TYPE_STRUCT) + && (strncmp("gl_", t->name, 3) != 0)) { + printf("%s@%08x", t->name, (unsigned) t); } else { printf("%s", t->name); }