summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ast_to_hir.cpp10
-rw-r--r--glsl_parser_extras.h4
-rw-r--r--ir_print_visitor.cpp22
3 files changed, 35 insertions, 1 deletions
diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp
index e0913dd972..357683f0c3 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 55bcc72e94..125c675a92 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 272e892a1e..9edb680385 100644
--- a/ir_print_visitor.cpp
+++ b/ir_print_visitor.cpp
@@ -23,12 +23,29 @@
#include <cstdio>
#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);
}