Module: Mesa
Branch: asm-shader-rework-3
Commit: 1c7fd3564d2675c03c9688c38e31521956d5704b
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=1c7fd3564d2675c03c9688c38e31521956d5704b

Author: Ian Romanick <[email protected]>
Date:   Wed Sep 30 21:56:30 2009 -0700

NV vp3 parser: Parse condition codes using CC0 or CC1

---

 src/mesa/shader/program_parse.y       |   12 ++++--------
 src/mesa/shader/program_parse_extra.c |   30 ++++++++++++++++++++++++++++--
 src/mesa/shader/program_parser.h      |    3 ++-
 3 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/src/mesa/shader/program_parse.y b/src/mesa/shader/program_parse.y
index 5cf1c87..6b0f3d3 100644
--- a/src/mesa/shader/program_parse.y
+++ b/src/mesa/shader/program_parse.y
@@ -1110,8 +1110,8 @@ ccTest2: ccMaskRule2 swizzleSuffix
 
 ccMaskRule: IDENTIFIER
        {
-          const int cond = _mesa_parse_cc($1);
-          if ((cond == 0) || ($1[2] != '\0')) {
+          const int good_cond = _mesa_parse_cc(state, $1, & $$);
+          if (! good_cond) {
              char *const err_str =
                 make_error_string("invalid condition code \"%s\"", $1);
 
@@ -1125,16 +1125,14 @@ ccMaskRule: IDENTIFIER
              YYERROR;
           }
 
-          $$.CondMask = cond;
           $$.CondSwizzle = SWIZZLE_NOOP;
-          $$.CondSrc = 0;
        }
        ;
 
 ccMaskRule2: USED_IDENTIFIER
        {
-          const int cond = _mesa_parse_cc($1);
-          if ((cond == 0) || ($1[2] != '\0')) {
+          const int good_cond = _mesa_parse_cc(state, $1, & $$);
+          if (! good_cond) {
              char *const err_str =
                 make_error_string("invalid condition code \"%s\"", $1);
 
@@ -1148,9 +1146,7 @@ ccMaskRule2: USED_IDENTIFIER
              YYERROR;
           }
 
-          $$.CondMask = cond;
           $$.CondSwizzle = SWIZZLE_NOOP;
-          $$.CondSrc = 0;
        }
        ;
 
diff --git a/src/mesa/shader/program_parse_extra.c 
b/src/mesa/shader/program_parse_extra.c
index ae9c680..57da169 100644
--- a/src/mesa/shader/program_parse_extra.c
+++ b/src/mesa/shader/program_parse_extra.c
@@ -95,7 +95,8 @@ _mesa_parse_instruction_suffix(const struct asm_parser_state 
*state,
 
 
 int
-_mesa_parse_cc(const char *s)
+_mesa_parse_cc(const struct asm_parser_state *state, const char *s,
+              struct prog_dst_register *dst)
 {
    int cond = 0;
 
@@ -144,7 +145,32 @@ _mesa_parse_cc(const char *s)
       break;
    }
 
-   return ((cond == 0) || (s[2] != '\0')) ? 0 : cond;
+
+   /* The first part of the condition code failed to parse.
+    */
+   if (cond == 0) {
+      return 0;
+   }
+
+
+   if (state->option.NV_vertex3) {
+      if (((s[2] == '0') && (s[3] == '\0'))
+         || (s[2] == '\0')) {
+        dst->CondSrc = 0;
+        dst->CondMask = cond;
+        return 1;
+      } else if ((s[2] == '0') && (s[3] == '\0')) {
+        dst->CondSrc = 1;
+        dst->CondMask = cond;
+        return 1;
+      }
+   } else if (s[2] == '\0') {
+      dst->CondSrc = 0;
+      dst->CondMask = cond;
+      return 1;
+   }
+
+   return 0;
 }
 
 
diff --git a/src/mesa/shader/program_parser.h b/src/mesa/shader/program_parser.h
index 023a19c..cd057a2 100644
--- a/src/mesa/shader/program_parser.h
+++ b/src/mesa/shader/program_parser.h
@@ -292,6 +292,7 @@ extern int _mesa_parse_instruction_suffix(const struct 
asm_parser_state *state,
  * One of the \c COND_ macros defined in prog_instruction.h on success or zero
  * on failure.
  */
-extern int _mesa_parse_cc(const char *s);
+extern int _mesa_parse_cc(const struct asm_parser_state *state, const char *s,
+    struct prog_dst_register *dst);
 
 /*...@}*/

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to