Mesa (master): glsl: Properly handle nested structure types.
Kenneth Graunke
kwg at kemper.freedesktop.org
Sat Sep 18 09:21:34 UTC 2010
Module: Mesa
Branch: master
Commit: ca92ae2699c4aad21c0811b9a5562b9223816caf
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ca92ae2699c4aad21c0811b9a5562b9223816caf
Author: Kenneth Graunke <kenneth at whitecape.org>
Date: Sat Sep 18 11:11:09 2010 +0200
glsl: Properly handle nested structure types.
Fixes piglit test CorrectFull.frag.
---
src/glsl/ast_to_hir.cpp | 31 ++++++-------------------------
src/glsl/glsl_parser_extras.cpp | 5 +++++
2 files changed, 11 insertions(+), 25 deletions(-)
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 9638544..0cbb431 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -1534,17 +1534,12 @@ ast_type_specifier::glsl_type(const char **name,
{
const struct glsl_type *type;
- if ((this->type_specifier == ast_struct) && (this->type_name == NULL)) {
- /* FINISHME: Handle annonymous structures. */
- type = NULL;
- } else {
- type = state->symbols->get_type(this->type_name);
- *name = this->type_name;
+ type = state->symbols->get_type(this->type_name);
+ *name = this->type_name;
- if (this->is_array) {
- YYLTYPE loc = this->get_location();
- type = process_array_type(&loc, type, this->array_size, state);
- }
+ if (this->is_array) {
+ YYLTYPE loc = this->get_location();
+ type = process_array_type(&loc, type, this->array_size, state);
}
return type;
@@ -2705,7 +2700,6 @@ ast_struct_specifier::hir(exec_list *instructions,
}
}
-
/* Allocate storage for the structure fields and process the field
* declarations. As the declarations are processed, try to also convert
* the types to HIR. This ensures that structure definitions embedded in
@@ -2750,21 +2744,8 @@ ast_struct_specifier::hir(exec_list *instructions,
assert(i == decl_count);
- const char *name;
- if (this->name == NULL) {
- static unsigned anon_count = 1;
- char buf[32];
-
- snprintf(buf, sizeof(buf), "#anon_struct_%04x", anon_count);
- anon_count++;
-
- name = strdup(buf);
- } else {
- name = this->name;
- }
-
const glsl_type *t =
- glsl_type::get_record_instance(fields, decl_count, name);
+ glsl_type::get_record_instance(fields, decl_count, this->name);
YYLTYPE loc = this->get_location();
if (!state->symbols->add_type(name, t)) {
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index 4ac062b..33ea664 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -680,6 +680,11 @@ ast_struct_specifier::print(void) const
ast_struct_specifier::ast_struct_specifier(char *identifier,
ast_node *declarator_list)
{
+ if (identifier == NULL) {
+ static unsigned anon_count = 1;
+ identifier = talloc_asprintf(this, "#anon_struct_%04x", anon_count);
+ anon_count++;
+ }
name = identifier;
this->declarations.push_degenerate_list_at_head(&declarator_list->link);
}
More information about the mesa-commit
mailing list