Add generate_temporary to generate an anonymous temporary
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 29 Mar 2010 22:20:42 +0000 (15:20 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 29 Mar 2010 22:20:42 +0000 (15:20 -0700)
ast_to_hir.cpp
glsl_parser_extras.cpp
glsl_parser_extras.h

index 4674cfcdd52c606efe2df19e0f1a87486dafb4dc..80489d371980cd6c9244aa8927c503e607f8bd49 100644 (file)
@@ -388,6 +388,26 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
    return rhs;
 }
 
+
+/**
+ * Generate a new temporary and add its declaration to the instruction stream
+ */
+static ir_variable *
+generate_temporary(const glsl_type *type, exec_list *instructions,
+                  struct _mesa_glsl_parse_state *state)
+{
+   char *name = (char *) malloc(sizeof(char) * 13);
+
+   snprintf(name, 13, "tmp_%08X", state->temp_index);
+   state->temp_index++;
+
+   ir_variable *const var = new ir_variable(type, name);
+   instructions->push_tail(var);
+
+   return var;
+}
+
+
 static ir_rvalue *
 get_lvalue_copy(exec_list *instructions, struct _mesa_glsl_parse_state *state,
                ir_rvalue *lvalue, YYLTYPE loc)
index d57a68efb7551040cb2b67f5a1e8d31ce022885a..1ddc2ee9ddd221a54187ef1aeb559f2ff0531370 100644 (file)
@@ -634,6 +634,7 @@ main(int argc, char **argv)
    make_empty_list(& state.translation_unit);
    state.symbols = new glsl_symbol_table;
    state.error = false;
+   state.temp_index = 0;
 
    _mesa_glsl_lexer_ctor(& state, shader, shader_len);
    _mesa_glsl_parse(& state);
index dbe7c17302a61775dae790137eff93f9b6f03a61..96c975ba117495b8ad24b97998b2917717dae010 100644 (file)
@@ -53,6 +53,9 @@ struct _mesa_glsl_parse_state {
 
    /** Was there an error during compilation? */
    bool error;
+
+   /** Index of last generated anonymous temporary. */
+   unsigned temp_index;
 };
 
 typedef struct YYLTYPE {