glsl2: Make ir_assignment derive from ir_instruction, not ir_rvalue.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 22 Jul 2010 23:40:35 +0000 (16:40 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 22 Jul 2010 23:50:37 +0000 (16:50 -0700)
Assignments can only exist at the top level instruction stream; the
residual value is handled by assigning the value to a temporary and
returning an ir_dereference_variable of that temporary.

src/glsl/ir.h
src/glsl/ir_reader.cpp

index c73bf4ce8b2b622a94479ec5de2c3d8296565876..3fd3a7660bc7f1b668e2c28b4fc79e91531d048c 100644 (file)
@@ -506,7 +506,7 @@ public:
 };
 
 
-class ir_assignment : public ir_rvalue {
+class ir_assignment : public ir_instruction {
 public:
    ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
 
index 2248e926d5d5740d20e6650343ddb6d4e441799b..14bd2d62fd780937fa85276e8be8265a51273e86 100644 (file)
@@ -357,6 +357,8 @@ read_instruction(_mesa_glsl_parse_state *st, s_expression *expr,
    ir_instruction *inst = NULL;
    if (strcmp(tag->value(), "declare") == 0) {
       inst = read_declaration(st, list);
+   } else if (strcmp(tag->value(), "assign") == 0) {
+      inst = read_assignment(st, list);
    } else if (strcmp(tag->value(), "if") == 0) {
       inst = read_if(st, list, loop_ctx);
    } else if (strcmp(tag->value(), "loop") == 0) {
@@ -546,8 +548,6 @@ read_rvalue(_mesa_glsl_parse_state *st, s_expression *expr)
       return rvalue;
    else if (strcmp(tag->value(), "swiz") == 0) {
       rvalue = read_swizzle(st, list);
-   } else if (strcmp(tag->value(), "assign") == 0) {
-      rvalue = read_assignment(st, list);
    } else if (strcmp(tag->value(), "expression") == 0) {
       rvalue = read_expression(st, list);
    } else if (strcmp(tag->value(), "call") == 0) {