parser: Track a few more frag prog related values
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 22 Jul 2009 23:21:54 +0000 (16:21 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 22 Jul 2009 23:21:54 +0000 (16:21 -0700)
src/mesa/shader/program_parse.tab.c
src/mesa/shader/program_parse.y

index 0ea0e241066322982b2d6d186f723e8ae8d892e0..452782e832ed54a264fafa89999e6f87d06a8ec0 100644 (file)
@@ -739,31 +739,31 @@ static const yytype_int16 yyrhs[] =
 static const yytype_uint16 yyrline[] =
 {
        0,   240,   240,   243,   251,   260,   261,   264,   282,   283,
-     286,   301,   304,   305,   308,   309,   310,   311,   312,   313,
-     314,   317,   318,   321,   327,   334,   341,   349,   356,   364,
-     375,   381,   387,   388,   389,   390,   391,   394,   406,   419,
-     432,   454,   463,   472,   479,   488,   516,   558,   569,   590,
-     600,   606,   630,   647,   647,   649,   656,   668,   669,   670,
-     673,   685,   697,   715,   726,   738,   740,   741,   742,   743,
-     746,   746,   746,   746,   747,   750,   751,   752,   753,   754,
-     755,   758,   776,   780,   786,   790,   794,   798,   802,   806,
-     810,   814,   820,   831,   831,   832,   834,   838,   842,   846,
-     852,   852,   854,   870,   893,   896,   907,   913,   919,   920,
-     927,   933,   939,   947,   953,   959,   967,   973,   979,   987,
-     988,   991,   992,   993,   994,   995,   996,   997,   998,   999,
-    1000,  1003,  1012,  1016,  1020,  1026,  1035,  1039,  1043,  1047,
-    1051,  1057,  1063,  1070,  1075,  1083,  1093,  1095,  1103,  1109,
-    1113,  1117,  1123,  1134,  1143,  1147,  1152,  1156,  1160,  1164,
-    1170,  1177,  1181,  1187,  1195,  1206,  1213,  1217,  1223,  1233,
-    1244,  1248,  1266,  1275,  1278,  1284,  1288,  1292,  1298,  1309,
-    1314,  1319,  1324,  1329,  1333,  1341,  1344,  1349,  1362,  1370,
-    1383,  1383,  1385,  1385,  1387,  1397,  1402,  1409,  1419,  1428,
-    1433,  1440,  1450,  1460,  1472,  1472,  1473,  1473,  1475,  1482,
-    1487,  1494,  1499,  1505,  1513,  1524,  1528,  1534,  1535,  1536,
-    1539,  1539,  1542,  1542,  1545,  1551,  1559,  1572,  1581,  1590,
-    1594,  1603,  1612,  1623,  1630,  1635,  1644,  1656,  1659,  1668,
-    1679,  1680,  1681,  1684,  1685,  1686,  1689,  1690,  1693,  1694,
-    1697,  1698,  1701,  1712,  1723,  1734
+     286,   301,   304,   309,   316,   317,   318,   319,   320,   321,
+     322,   325,   326,   329,   335,   342,   349,   357,   364,   372,
+     385,   392,   398,   399,   400,   401,   402,   405,   417,   430,
+     443,   465,   474,   483,   490,   499,   527,   569,   580,   601,
+     611,   617,   641,   658,   658,   660,   667,   679,   680,   681,
+     684,   696,   708,   726,   737,   749,   751,   752,   753,   754,
+     757,   757,   757,   757,   758,   761,   762,   763,   764,   765,
+     766,   769,   787,   791,   797,   801,   805,   809,   813,   817,
+     821,   825,   831,   842,   842,   843,   845,   849,   853,   857,
+     863,   863,   865,   881,   904,   907,   918,   924,   930,   931,
+     938,   944,   950,   958,   964,   970,   978,   984,   990,   998,
+     999,  1002,  1003,  1004,  1005,  1006,  1007,  1008,  1009,  1010,
+    1011,  1014,  1023,  1027,  1031,  1037,  1046,  1050,  1054,  1058,
+    1062,  1068,  1074,  1081,  1086,  1094,  1104,  1106,  1114,  1120,
+    1124,  1128,  1134,  1145,  1154,  1158,  1163,  1167,  1171,  1175,
+    1181,  1188,  1192,  1198,  1206,  1217,  1224,  1228,  1234,  1244,
+    1255,  1259,  1277,  1286,  1289,  1295,  1299,  1303,  1309,  1320,
+    1325,  1330,  1335,  1340,  1344,  1352,  1355,  1360,  1373,  1381,
+    1394,  1394,  1396,  1396,  1398,  1408,  1413,  1420,  1430,  1439,
+    1444,  1451,  1461,  1471,  1483,  1483,  1484,  1484,  1486,  1493,
+    1498,  1505,  1510,  1516,  1524,  1535,  1539,  1545,  1546,  1547,
+    1550,  1550,  1553,  1553,  1556,  1562,  1570,  1583,  1592,  1601,
+    1605,  1614,  1623,  1634,  1641,  1646,  1655,  1667,  1670,  1679,
+    1690,  1691,  1692,  1695,  1696,  1697,  1700,  1701,  1704,  1705,
+    1708,  1709,  1712,  1723,  1734,  1745
 };
 #endif
 
@@ -2094,10 +2094,30 @@ yyreduce:
        ;}
     break;
 
+  case 12:
+
+/* Line 1455 of yacc.c  */
+#line 305 "program_parse.y"
+    {
+          (yyval.inst) = (yyvsp[(1) - (1)].inst);
+          state->prog->NumAluInstructions++;
+       ;}
+    break;
+
+  case 13:
+
+/* Line 1455 of yacc.c  */
+#line 310 "program_parse.y"
+    {
+          (yyval.inst) = (yyvsp[(1) - (1)].inst);
+          state->prog->NumTexInstructions++;
+       ;}
+    break;
+
   case 23:
 
 /* Line 1455 of yacc.c  */
-#line 322 "program_parse.y"
+#line 330 "program_parse.y"
     {
           (yyval.inst) = asm_instruction_ctor(OPCODE_ARL, & (yyvsp[(2) - (4)].dst_reg), & (yyvsp[(4) - (4)].src_reg), NULL, NULL);
        ;}
@@ -2106,7 +2126,7 @@ yyreduce:
   case 24:
 
 /* Line 1455 of yacc.c  */
-#line 328 "program_parse.y"
+#line 336 "program_parse.y"
     {
           (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (4)].temp_inst).Opcode, & (yyvsp[(2) - (4)].dst_reg), & (yyvsp[(4) - (4)].src_reg), NULL, NULL);
           (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (4)].temp_inst).SaturateMode;
@@ -2116,7 +2136,7 @@ yyreduce:
   case 25:
 
 /* Line 1455 of yacc.c  */
-#line 335 "program_parse.y"
+#line 343 "program_parse.y"
     {
           (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (4)].temp_inst).Opcode, & (yyvsp[(2) - (4)].dst_reg), & (yyvsp[(4) - (4)].src_reg), NULL, NULL);
           (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (4)].temp_inst).SaturateMode;
@@ -2126,7 +2146,7 @@ yyreduce:
   case 26:
 
 /* Line 1455 of yacc.c  */
-#line 342 "program_parse.y"
+#line 350 "program_parse.y"
     {
           (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (6)].temp_inst).Opcode, & (yyvsp[(2) - (6)].dst_reg), & (yyvsp[(4) - (6)].src_reg), & (yyvsp[(6) - (6)].src_reg), NULL);
           (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (6)].temp_inst).SaturateMode;
@@ -2136,7 +2156,7 @@ yyreduce:
   case 27:
 
 /* Line 1455 of yacc.c  */
-#line 350 "program_parse.y"
+#line 358 "program_parse.y"
     {
           (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (6)].temp_inst).Opcode, & (yyvsp[(2) - (6)].dst_reg), & (yyvsp[(4) - (6)].src_reg), & (yyvsp[(6) - (6)].src_reg), NULL);
           (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (6)].temp_inst).SaturateMode;
@@ -2146,7 +2166,7 @@ yyreduce:
   case 28:
 
 /* Line 1455 of yacc.c  */
-#line 358 "program_parse.y"
+#line 366 "program_parse.y"
     {
           (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (8)].temp_inst).Opcode, & (yyvsp[(2) - (8)].dst_reg), & (yyvsp[(4) - (8)].src_reg), & (yyvsp[(6) - (8)].src_reg), & (yyvsp[(8) - (8)].src_reg));
           (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (8)].temp_inst).SaturateMode;
@@ -2156,13 +2176,15 @@ yyreduce:
   case 29:
 
 /* Line 1455 of yacc.c  */
-#line 365 "program_parse.y"
+#line 373 "program_parse.y"
     {
           (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (8)].temp_inst).Opcode, & (yyvsp[(2) - (8)].dst_reg), & (yyvsp[(4) - (8)].src_reg), NULL, NULL);
           if ((yyval.inst) != NULL) {
              (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (8)].temp_inst).SaturateMode;
              (yyval.inst)->Base.TexSrcUnit = (yyvsp[(6) - (8)].integer);
              (yyval.inst)->Base.TexSrcTarget = (yyvsp[(8) - (8)].integer);
+
+             state->prog->TexturesUsed[(yyvsp[(6) - (8)].integer)] |= (1U << (yyvsp[(8) - (8)].integer));
           }
        ;}
     break;
@@ -2170,16 +2192,17 @@ yyreduce:
   case 30:
 
 /* Line 1455 of yacc.c  */
-#line 376 "program_parse.y"
+#line 386 "program_parse.y"
     {
           (yyval.inst) = asm_instruction_ctor(OPCODE_KIL, NULL, & (yyvsp[(2) - (2)].src_reg), NULL, NULL);
+          state->fragment.UsesKill = 1;
        ;}
     break;
 
   case 31:
 
 /* Line 1455 of yacc.c  */
-#line 382 "program_parse.y"
+#line 393 "program_parse.y"
     {
           (yyval.integer) = (yyvsp[(2) - (2)].integer);
        ;}
@@ -2188,42 +2211,42 @@ yyreduce:
   case 32:
 
 /* Line 1455 of yacc.c  */
-#line 387 "program_parse.y"
+#line 398 "program_parse.y"
     { (yyval.integer) = TEXTURE_1D_INDEX; ;}
     break;
 
   case 33:
 
 /* Line 1455 of yacc.c  */
-#line 388 "program_parse.y"
+#line 399 "program_parse.y"
     { (yyval.integer) = TEXTURE_2D_INDEX; ;}
     break;
 
   case 34:
 
 /* Line 1455 of yacc.c  */
-#line 389 "program_parse.y"
+#line 400 "program_parse.y"
     { (yyval.integer) = TEXTURE_3D_INDEX; ;}
     break;
 
   case 35:
 
 /* Line 1455 of yacc.c  */
-#line 390 "program_parse.y"
+#line 401 "program_parse.y"
     { (yyval.integer) = TEXTURE_CUBE_INDEX; ;}
     break;
 
   case 36:
 
 /* Line 1455 of yacc.c  */
-#line 391 "program_parse.y"
+#line 402 "program_parse.y"
     { (yyval.integer) = TEXTURE_RECT_INDEX; ;}
     break;
 
   case 37:
 
 /* Line 1455 of yacc.c  */
-#line 395 "program_parse.y"
+#line 406 "program_parse.y"
     {
           /* FIXME: Is this correct?  Should the extenedSwizzle be applied
            * FIXME: to the existing swizzle?
@@ -2238,7 +2261,7 @@ yyreduce:
   case 38:
 
 /* Line 1455 of yacc.c  */
-#line 407 "program_parse.y"
+#line 418 "program_parse.y"
     {
           (yyval.src_reg) = (yyvsp[(2) - (3)].src_reg);
 
@@ -2254,7 +2277,7 @@ yyreduce:
   case 39:
 
 /* Line 1455 of yacc.c  */
-#line 420 "program_parse.y"
+#line 431 "program_parse.y"
     {
           (yyval.src_reg) = (yyvsp[(2) - (3)].src_reg);
 
@@ -2270,7 +2293,7 @@ yyreduce:
   case 40:
 
 /* Line 1455 of yacc.c  */
-#line 433 "program_parse.y"
+#line 444 "program_parse.y"
     {
           (yyval.dst_reg) = (yyvsp[(1) - (2)].dst_reg);
           (yyval.dst_reg).WriteMask = (yyvsp[(2) - (2)].swiz_mask).mask;
@@ -2295,7 +2318,7 @@ yyreduce:
   case 41:
 
 /* Line 1455 of yacc.c  */
-#line 455 "program_parse.y"
+#line 466 "program_parse.y"
     {
           init_dst_reg(& (yyval.dst_reg));
           (yyval.dst_reg).File = PROGRAM_ADDRESS;
@@ -2307,7 +2330,7 @@ yyreduce:
   case 42:
 
 /* Line 1455 of yacc.c  */
-#line 464 "program_parse.y"
+#line 475 "program_parse.y"
     {
           (yyval.swiz_mask).swizzle = MAKE_SWIZZLE4((yyvsp[(1) - (7)].swiz_mask).swizzle, (yyvsp[(3) - (7)].swiz_mask).swizzle,
                                      (yyvsp[(5) - (7)].swiz_mask).swizzle, (yyvsp[(7) - (7)].swiz_mask).swizzle);
@@ -2319,7 +2342,7 @@ yyreduce:
   case 43:
 
 /* Line 1455 of yacc.c  */
-#line 473 "program_parse.y"
+#line 484 "program_parse.y"
     {
           (yyval.swiz_mask).swizzle = (yyvsp[(2) - (2)].integer);
           (yyval.swiz_mask).mask = ((yyvsp[(1) - (2)].negate)) ? 1 : 0;
@@ -2329,7 +2352,7 @@ yyreduce:
   case 44:
 
 /* Line 1455 of yacc.c  */
-#line 480 "program_parse.y"
+#line 491 "program_parse.y"
     {
           if (((yyvsp[(1) - (1)].integer) != 0) && ((yyvsp[(1) - (1)].integer) != 1)) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid extended swizzle selector");
@@ -2343,7 +2366,7 @@ yyreduce:
   case 45:
 
 /* Line 1455 of yacc.c  */
-#line 489 "program_parse.y"
+#line 500 "program_parse.y"
     {
           if (strlen((yyvsp[(1) - (1)].string)) > 1) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid extended swizzle selector");
@@ -2374,7 +2397,7 @@ yyreduce:
   case 46:
 
 /* Line 1455 of yacc.c  */
-#line 517 "program_parse.y"
+#line 528 "program_parse.y"
     {
           struct asm_symbol *const s = (struct asm_symbol *)
              _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(1) - (1)].string));
@@ -2421,7 +2444,7 @@ yyreduce:
   case 47:
 
 /* Line 1455 of yacc.c  */
-#line 559 "program_parse.y"
+#line 570 "program_parse.y"
     {
           init_src_reg(& (yyval.src_reg));
           (yyval.src_reg).Base.File = PROGRAM_INPUT;
@@ -2437,7 +2460,7 @@ yyreduce:
   case 48:
 
 /* Line 1455 of yacc.c  */
-#line 570 "program_parse.y"
+#line 581 "program_parse.y"
     {
           if (! (yyvsp[(3) - (4)].src_reg).Base.RelAddr
               && ((yyvsp[(3) - (4)].src_reg).Base.Index >= (yyvsp[(1) - (4)].sym)->param_binding_length)) {
@@ -2463,7 +2486,7 @@ yyreduce:
   case 49:
 
 /* Line 1455 of yacc.c  */
-#line 591 "program_parse.y"
+#line 602 "program_parse.y"
     {
           init_src_reg(& (yyval.src_reg));
           (yyval.src_reg).Base.File = ((yyvsp[(1) - (1)].temp_sym).name != NULL) 
@@ -2476,7 +2499,7 @@ yyreduce:
   case 50:
 
 /* Line 1455 of yacc.c  */
-#line 601 "program_parse.y"
+#line 612 "program_parse.y"
     {
           init_dst_reg(& (yyval.dst_reg));
           (yyval.dst_reg).File = PROGRAM_OUTPUT;
@@ -2487,7 +2510,7 @@ yyreduce:
   case 51:
 
 /* Line 1455 of yacc.c  */
-#line 607 "program_parse.y"
+#line 618 "program_parse.y"
     {
           struct asm_symbol *const s = (struct asm_symbol *)
              _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(1) - (1)].string));
@@ -2514,7 +2537,7 @@ yyreduce:
   case 52:
 
 /* Line 1455 of yacc.c  */
-#line 631 "program_parse.y"
+#line 642 "program_parse.y"
     {
           struct asm_symbol *const s = (struct asm_symbol *)
              _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(1) - (1)].string));
@@ -2534,7 +2557,7 @@ yyreduce:
   case 55:
 
 /* Line 1455 of yacc.c  */
-#line 650 "program_parse.y"
+#line 661 "program_parse.y"
     {
           init_src_reg(& (yyval.src_reg));
           (yyval.src_reg).Base.Index = (yyvsp[(1) - (1)].integer);
@@ -2544,7 +2567,7 @@ yyreduce:
   case 56:
 
 /* Line 1455 of yacc.c  */
-#line 657 "program_parse.y"
+#line 668 "program_parse.y"
     {
           /* FINISHME: Add support for multiple address registers.
            */
@@ -2559,28 +2582,28 @@ yyreduce:
   case 57:
 
 /* Line 1455 of yacc.c  */
-#line 668 "program_parse.y"
+#line 679 "program_parse.y"
     { (yyval.integer) = 0; ;}
     break;
 
   case 58:
 
 /* Line 1455 of yacc.c  */
-#line 669 "program_parse.y"
+#line 680 "program_parse.y"
     { (yyval.integer) = (yyvsp[(2) - (2)].integer); ;}
     break;
 
   case 59:
 
 /* Line 1455 of yacc.c  */
-#line 670 "program_parse.y"
+#line 681 "program_parse.y"
     { (yyval.integer) = -(yyvsp[(2) - (2)].integer); ;}
     break;
 
   case 60:
 
 /* Line 1455 of yacc.c  */
-#line 674 "program_parse.y"
+#line 685 "program_parse.y"
     {
           if (((yyvsp[(1) - (1)].integer) < 0) || ((yyvsp[(1) - (1)].integer) > 63)) {
              yyerror(& (yylsp[(1) - (1)]), state,
@@ -2595,7 +2618,7 @@ yyreduce:
   case 61:
 
 /* Line 1455 of yacc.c  */
-#line 686 "program_parse.y"
+#line 697 "program_parse.y"
     {
           if (((yyvsp[(1) - (1)].integer) < 0) || ((yyvsp[(1) - (1)].integer) > 64)) {
              yyerror(& (yylsp[(1) - (1)]), state,
@@ -2610,7 +2633,7 @@ yyreduce:
   case 62:
 
 /* Line 1455 of yacc.c  */
-#line 698 "program_parse.y"
+#line 709 "program_parse.y"
     {
           struct asm_symbol *const s = (struct asm_symbol *)
              _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(1) - (1)].string));
@@ -2631,7 +2654,7 @@ yyreduce:
   case 63:
 
 /* Line 1455 of yacc.c  */
-#line 716 "program_parse.y"
+#line 727 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].swiz_mask).mask != WRITEMASK_X) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid address component selector");
@@ -2645,7 +2668,7 @@ yyreduce:
   case 64:
 
 /* Line 1455 of yacc.c  */
-#line 727 "program_parse.y"
+#line 738 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].swiz_mask).mask != WRITEMASK_X) {
              yyerror(& (yylsp[(1) - (1)]), state,
@@ -2660,21 +2683,21 @@ yyreduce:
   case 69:
 
 /* Line 1455 of yacc.c  */
-#line 743 "program_parse.y"
+#line 754 "program_parse.y"
     { (yyval.swiz_mask).swizzle = SWIZZLE_NOOP; (yyval.swiz_mask).mask = WRITEMASK_XYZW; ;}
     break;
 
   case 74:
 
 /* Line 1455 of yacc.c  */
-#line 747 "program_parse.y"
+#line 758 "program_parse.y"
     { (yyval.swiz_mask).swizzle = SWIZZLE_NOOP; (yyval.swiz_mask).mask = WRITEMASK_XYZW; ;}
     break;
 
   case 81:
 
 /* Line 1455 of yacc.c  */
-#line 759 "program_parse.y"
+#line 770 "program_parse.y"
     {
           struct asm_symbol *const s =
              declare_variable(state, (yyvsp[(2) - (4)].string), at_attrib, & (yylsp[(2) - (4)]));
@@ -2695,7 +2718,7 @@ yyreduce:
   case 82:
 
 /* Line 1455 of yacc.c  */
-#line 777 "program_parse.y"
+#line 788 "program_parse.y"
     {
           (yyval.attrib) = (yyvsp[(2) - (2)].attrib);
        ;}
@@ -2704,7 +2727,7 @@ yyreduce:
   case 83:
 
 /* Line 1455 of yacc.c  */
-#line 781 "program_parse.y"
+#line 792 "program_parse.y"
     {
           (yyval.attrib) = (yyvsp[(2) - (2)].attrib);
        ;}
@@ -2713,7 +2736,7 @@ yyreduce:
   case 84:
 
 /* Line 1455 of yacc.c  */
-#line 787 "program_parse.y"
+#line 798 "program_parse.y"
     {
           (yyval.attrib) = VERT_ATTRIB_POS;
        ;}
@@ -2722,7 +2745,7 @@ yyreduce:
   case 85:
 
 /* Line 1455 of yacc.c  */
-#line 791 "program_parse.y"
+#line 802 "program_parse.y"
     {
           (yyval.attrib) = VERT_ATTRIB_WEIGHT;
        ;}
@@ -2731,7 +2754,7 @@ yyreduce:
   case 86:
 
 /* Line 1455 of yacc.c  */
-#line 795 "program_parse.y"
+#line 806 "program_parse.y"
     {
           (yyval.attrib) = VERT_ATTRIB_NORMAL;
        ;}
@@ -2740,7 +2763,7 @@ yyreduce:
   case 87:
 
 /* Line 1455 of yacc.c  */
-#line 799 "program_parse.y"
+#line 810 "program_parse.y"
     {
           (yyval.attrib) = VERT_ATTRIB_COLOR0 + (yyvsp[(2) - (2)].integer);
        ;}
@@ -2749,7 +2772,7 @@ yyreduce:
   case 88:
 
 /* Line 1455 of yacc.c  */
-#line 803 "program_parse.y"
+#line 814 "program_parse.y"
     {
           (yyval.attrib) = VERT_ATTRIB_FOG;
        ;}
@@ -2758,7 +2781,7 @@ yyreduce:
   case 89:
 
 /* Line 1455 of yacc.c  */
-#line 807 "program_parse.y"
+#line 818 "program_parse.y"
     {
           (yyval.attrib) = VERT_ATTRIB_TEX0 + (yyvsp[(2) - (2)].integer);
        ;}
@@ -2767,7 +2790,7 @@ yyreduce:
   case 90:
 
 /* Line 1455 of yacc.c  */
-#line 811 "program_parse.y"
+#line 822 "program_parse.y"
     {
           YYERROR;
        ;}
@@ -2776,7 +2799,7 @@ yyreduce:
   case 91:
 
 /* Line 1455 of yacc.c  */
-#line 815 "program_parse.y"
+#line 826 "program_parse.y"
     {
           (yyval.attrib) = VERT_ATTRIB_GENERIC0 + (yyvsp[(3) - (4)].integer);
        ;}
@@ -2785,7 +2808,7 @@ yyreduce:
   case 92:
 
 /* Line 1455 of yacc.c  */
-#line 821 "program_parse.y"
+#line 832 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].integer) >= state->limits->MaxAttribs) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid vertex attribute reference");
@@ -2799,7 +2822,7 @@ yyreduce:
   case 96:
 
 /* Line 1455 of yacc.c  */
-#line 835 "program_parse.y"
+#line 846 "program_parse.y"
     {
           (yyval.attrib) = FRAG_ATTRIB_WPOS;
        ;}
@@ -2808,7 +2831,7 @@ yyreduce:
   case 97:
 
 /* Line 1455 of yacc.c  */
-#line 839 "program_parse.y"
+#line 850 "program_parse.y"
     {
           (yyval.attrib) = FRAG_ATTRIB_COL0 + (yyvsp[(2) - (2)].integer);
        ;}
@@ -2817,7 +2840,7 @@ yyreduce:
   case 98:
 
 /* Line 1455 of yacc.c  */
-#line 843 "program_parse.y"
+#line 854 "program_parse.y"
     {
           (yyval.attrib) = FRAG_ATTRIB_FOGC;
        ;}
@@ -2826,7 +2849,7 @@ yyreduce:
   case 99:
 
 /* Line 1455 of yacc.c  */
-#line 847 "program_parse.y"
+#line 858 "program_parse.y"
     {
           (yyval.attrib) = FRAG_ATTRIB_TEX0 + (yyvsp[(2) - (2)].integer);
        ;}
@@ -2835,7 +2858,7 @@ yyreduce:
   case 102:
 
 /* Line 1455 of yacc.c  */
-#line 855 "program_parse.y"
+#line 866 "program_parse.y"
     {
           struct asm_symbol *const s =
              declare_variable(state, (yyvsp[(2) - (3)].string), at_param, & (yylsp[(2) - (3)]));
@@ -2854,7 +2877,7 @@ yyreduce:
   case 103:
 
 /* Line 1455 of yacc.c  */
-#line 871 "program_parse.y"
+#line 882 "program_parse.y"
     {
           if (((yyvsp[(4) - (6)].integer) != 0) && ((yyvsp[(4) - (6)].integer) != (yyvsp[(6) - (6)].temp_sym).param_binding_length)) {
              yyerror(& (yylsp[(4) - (6)]), state, 
@@ -2879,7 +2902,7 @@ yyreduce:
   case 104:
 
 /* Line 1455 of yacc.c  */
-#line 893 "program_parse.y"
+#line 904 "program_parse.y"
     {
           (yyval.integer) = 0;
        ;}
@@ -2888,7 +2911,7 @@ yyreduce:
   case 105:
 
 /* Line 1455 of yacc.c  */
-#line 897 "program_parse.y"
+#line 908 "program_parse.y"
     {
           if (((yyvsp[(1) - (1)].integer) < 1) || ((yyvsp[(1) - (1)].integer) >= state->limits->MaxParameters)) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid parameter array size");
@@ -2902,7 +2925,7 @@ yyreduce:
   case 106:
 
 /* Line 1455 of yacc.c  */
-#line 908 "program_parse.y"
+#line 919 "program_parse.y"
     {
           (yyval.temp_sym) = (yyvsp[(2) - (2)].temp_sym);
        ;}
@@ -2911,7 +2934,7 @@ yyreduce:
   case 107:
 
 /* Line 1455 of yacc.c  */
-#line 914 "program_parse.y"
+#line 925 "program_parse.y"
     {
           (yyval.temp_sym) = (yyvsp[(3) - (4)].temp_sym);
        ;}
@@ -2920,7 +2943,7 @@ yyreduce:
   case 109:
 
 /* Line 1455 of yacc.c  */
-#line 921 "program_parse.y"
+#line 932 "program_parse.y"
     {
           (yyvsp[(1) - (3)].temp_sym).param_binding_length += (yyvsp[(3) - (3)].temp_sym).param_binding_length;
           (yyval.temp_sym) = (yyvsp[(1) - (3)].temp_sym);
@@ -2930,7 +2953,7 @@ yyreduce:
   case 110:
 
 /* Line 1455 of yacc.c  */
-#line 928 "program_parse.y"
+#line 939 "program_parse.y"
     {
           memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));
           (yyval.temp_sym).param_binding_begin = ~0;
@@ -2941,7 +2964,7 @@ yyreduce:
   case 111:
 
 /* Line 1455 of yacc.c  */
-#line 934 "program_parse.y"
+#line 945 "program_parse.y"
     {
           memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));
           (yyval.temp_sym).param_binding_begin = ~0;
@@ -2952,7 +2975,7 @@ yyreduce:
   case 112:
 
 /* Line 1455 of yacc.c  */
-#line 940 "program_parse.y"
+#line 951 "program_parse.y"
     {
           memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));
           (yyval.temp_sym).param_binding_begin = ~0;
@@ -2963,7 +2986,7 @@ yyreduce:
   case 113:
 
 /* Line 1455 of yacc.c  */
-#line 948 "program_parse.y"
+#line 959 "program_parse.y"
     {
           memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));
           (yyval.temp_sym).param_binding_begin = ~0;
@@ -2974,7 +2997,7 @@ yyreduce:
   case 114:
 
 /* Line 1455 of yacc.c  */
-#line 954 "program_parse.y"
+#line 965 "program_parse.y"
     {
           memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));
           (yyval.temp_sym).param_binding_begin = ~0;
@@ -2985,7 +3008,7 @@ yyreduce:
   case 115:
 
 /* Line 1455 of yacc.c  */
-#line 960 "program_parse.y"
+#line 971 "program_parse.y"
     {
           memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));
           (yyval.temp_sym).param_binding_begin = ~0;
@@ -2996,7 +3019,7 @@ yyreduce:
   case 116:
 
 /* Line 1455 of yacc.c  */
-#line 968 "program_parse.y"
+#line 979 "program_parse.y"
     {
           memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));
           (yyval.temp_sym).param_binding_begin = ~0;
@@ -3007,7 +3030,7 @@ yyreduce:
   case 117:
 
 /* Line 1455 of yacc.c  */
-#line 974 "program_parse.y"
+#line 985 "program_parse.y"
     {
           memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));
           (yyval.temp_sym).param_binding_begin = ~0;
@@ -3018,7 +3041,7 @@ yyreduce:
   case 118:
 
 /* Line 1455 of yacc.c  */
-#line 980 "program_parse.y"
+#line 991 "program_parse.y"
     {
           memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym)));
           (yyval.temp_sym).param_binding_begin = ~0;
@@ -3029,91 +3052,91 @@ yyreduce:
   case 119:
 
 /* Line 1455 of yacc.c  */
-#line 987 "program_parse.y"
+#line 998 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(1) - (1)].state), sizeof((yyval.state))); ;}
     break;
 
   case 120:
 
 /* Line 1455 of yacc.c  */
-#line 988 "program_parse.y"
+#line 999 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 121:
 
 /* Line 1455 of yacc.c  */
-#line 991 "program_parse.y"
+#line 1002 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 122:
 
 /* Line 1455 of yacc.c  */
-#line 992 "program_parse.y"
+#line 1003 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 123:
 
 /* Line 1455 of yacc.c  */
-#line 993 "program_parse.y"
+#line 1004 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 124:
 
 /* Line 1455 of yacc.c  */
-#line 994 "program_parse.y"
+#line 1005 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 125:
 
 /* Line 1455 of yacc.c  */
-#line 995 "program_parse.y"
+#line 1006 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 126:
 
 /* Line 1455 of yacc.c  */
-#line 996 "program_parse.y"
+#line 1007 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 127:
 
 /* Line 1455 of yacc.c  */
-#line 997 "program_parse.y"
+#line 1008 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 128:
 
 /* Line 1455 of yacc.c  */
-#line 998 "program_parse.y"
+#line 1009 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 129:
 
 /* Line 1455 of yacc.c  */
-#line 999 "program_parse.y"
+#line 1010 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 130:
 
 /* Line 1455 of yacc.c  */
-#line 1000 "program_parse.y"
+#line 1011 "program_parse.y"
     { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;}
     break;
 
   case 131:
 
 /* Line 1455 of yacc.c  */
-#line 1004 "program_parse.y"
+#line 1015 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = STATE_MATERIAL;
@@ -3125,7 +3148,7 @@ yyreduce:
   case 132:
 
 /* Line 1455 of yacc.c  */
-#line 1013 "program_parse.y"
+#line 1024 "program_parse.y"
     {
           (yyval.integer) = (yyvsp[(1) - (1)].integer);
        ;}
@@ -3134,7 +3157,7 @@ yyreduce:
   case 133:
 
 /* Line 1455 of yacc.c  */
-#line 1017 "program_parse.y"
+#line 1028 "program_parse.y"
     {
           (yyval.integer) = STATE_EMISSION;
        ;}
@@ -3143,7 +3166,7 @@ yyreduce:
   case 134:
 
 /* Line 1455 of yacc.c  */
-#line 1021 "program_parse.y"
+#line 1032 "program_parse.y"
     {
           (yyval.integer) = STATE_SHININESS;
        ;}
@@ -3152,7 +3175,7 @@ yyreduce:
   case 135:
 
 /* Line 1455 of yacc.c  */
-#line 1027 "program_parse.y"
+#line 1038 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = STATE_LIGHT;
@@ -3164,7 +3187,7 @@ yyreduce:
   case 136:
 
 /* Line 1455 of yacc.c  */
-#line 1036 "program_parse.y"
+#line 1047 "program_parse.y"
     {
           (yyval.integer) = (yyvsp[(1) - (1)].integer);
        ;}
@@ -3173,7 +3196,7 @@ yyreduce:
   case 137:
 
 /* Line 1455 of yacc.c  */
-#line 1040 "program_parse.y"
+#line 1051 "program_parse.y"
     {
           (yyval.integer) = STATE_POSITION;
        ;}
@@ -3182,7 +3205,7 @@ yyreduce:
   case 138:
 
 /* Line 1455 of yacc.c  */
-#line 1044 "program_parse.y"
+#line 1055 "program_parse.y"
     {
           (yyval.integer) = STATE_ATTENUATION;
        ;}
@@ -3191,7 +3214,7 @@ yyreduce:
   case 139:
 
 /* Line 1455 of yacc.c  */
-#line 1048 "program_parse.y"
+#line 1059 "program_parse.y"
     {
           (yyval.integer) = (yyvsp[(2) - (2)].integer);
        ;}
@@ -3200,7 +3223,7 @@ yyreduce:
   case 140:
 
 /* Line 1455 of yacc.c  */
-#line 1052 "program_parse.y"
+#line 1063 "program_parse.y"
     {
           (yyval.integer) = STATE_HALF_VECTOR;
        ;}
@@ -3209,7 +3232,7 @@ yyreduce:
   case 141:
 
 /* Line 1455 of yacc.c  */
-#line 1058 "program_parse.y"
+#line 1069 "program_parse.y"
     {
           (yyval.integer) = STATE_SPOT_DIRECTION;
        ;}
@@ -3218,7 +3241,7 @@ yyreduce:
   case 142:
 
 /* Line 1455 of yacc.c  */
-#line 1064 "program_parse.y"
+#line 1075 "program_parse.y"
     {
           (yyval.state)[0] = (yyvsp[(2) - (2)].state)[0];
           (yyval.state)[1] = (yyvsp[(2) - (2)].state)[1];
@@ -3228,7 +3251,7 @@ yyreduce:
   case 143:
 
 /* Line 1455 of yacc.c  */
-#line 1071 "program_parse.y"
+#line 1082 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = STATE_LIGHTMODEL_AMBIENT;
@@ -3238,7 +3261,7 @@ yyreduce:
   case 144:
 
 /* Line 1455 of yacc.c  */
-#line 1076 "program_parse.y"
+#line 1087 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = STATE_LIGHTMODEL_SCENECOLOR;
@@ -3249,7 +3272,7 @@ yyreduce:
   case 145:
 
 /* Line 1455 of yacc.c  */
-#line 1084 "program_parse.y"
+#line 1095 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = STATE_LIGHTPROD;
@@ -3262,7 +3285,7 @@ yyreduce:
   case 147:
 
 /* Line 1455 of yacc.c  */
-#line 1096 "program_parse.y"
+#line 1107 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = (yyvsp[(3) - (3)].integer);
@@ -3273,7 +3296,7 @@ yyreduce:
   case 148:
 
 /* Line 1455 of yacc.c  */
-#line 1104 "program_parse.y"
+#line 1115 "program_parse.y"
     {
           (yyval.integer) = STATE_TEXENV_COLOR;
        ;}
@@ -3282,7 +3305,7 @@ yyreduce:
   case 149:
 
 /* Line 1455 of yacc.c  */
-#line 1110 "program_parse.y"
+#line 1121 "program_parse.y"
     {
           (yyval.integer) = STATE_AMBIENT;
        ;}
@@ -3291,7 +3314,7 @@ yyreduce:
   case 150:
 
 /* Line 1455 of yacc.c  */
-#line 1114 "program_parse.y"
+#line 1125 "program_parse.y"
     {
           (yyval.integer) = STATE_DIFFUSE;
        ;}
@@ -3300,7 +3323,7 @@ yyreduce:
   case 151:
 
 /* Line 1455 of yacc.c  */
-#line 1118 "program_parse.y"
+#line 1129 "program_parse.y"
     {
           (yyval.integer) = STATE_SPECULAR;
        ;}
@@ -3309,7 +3332,7 @@ yyreduce:
   case 152:
 
 /* Line 1455 of yacc.c  */
-#line 1124 "program_parse.y"
+#line 1135 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].integer) >= state->MaxLights) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid light selector");
@@ -3323,7 +3346,7 @@ yyreduce:
   case 153:
 
 /* Line 1455 of yacc.c  */
-#line 1135 "program_parse.y"
+#line 1146 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = STATE_TEXGEN;
@@ -3335,7 +3358,7 @@ yyreduce:
   case 154:
 
 /* Line 1455 of yacc.c  */
-#line 1144 "program_parse.y"
+#line 1155 "program_parse.y"
     {
           (yyval.integer) = STATE_TEXGEN_EYE_S;
        ;}
@@ -3344,7 +3367,7 @@ yyreduce:
   case 155:
 
 /* Line 1455 of yacc.c  */
-#line 1148 "program_parse.y"
+#line 1159 "program_parse.y"
     {
           (yyval.integer) = STATE_TEXGEN_OBJECT_S;
        ;}
@@ -3353,7 +3376,7 @@ yyreduce:
   case 156:
 
 /* Line 1455 of yacc.c  */
-#line 1153 "program_parse.y"
+#line 1164 "program_parse.y"
     {
           (yyval.integer) = STATE_TEXGEN_EYE_S - STATE_TEXGEN_EYE_S;
        ;}
@@ -3362,7 +3385,7 @@ yyreduce:
   case 157:
 
 /* Line 1455 of yacc.c  */
-#line 1157 "program_parse.y"
+#line 1168 "program_parse.y"
     {
           (yyval.integer) = STATE_TEXGEN_EYE_T - STATE_TEXGEN_EYE_S;
        ;}
@@ -3371,7 +3394,7 @@ yyreduce:
   case 158:
 
 /* Line 1455 of yacc.c  */
-#line 1161 "program_parse.y"
+#line 1172 "program_parse.y"
     {
           (yyval.integer) = STATE_TEXGEN_EYE_R - STATE_TEXGEN_EYE_S;
        ;}
@@ -3380,7 +3403,7 @@ yyreduce:
   case 159:
 
 /* Line 1455 of yacc.c  */
-#line 1165 "program_parse.y"
+#line 1176 "program_parse.y"
     {
           (yyval.integer) = STATE_TEXGEN_EYE_Q - STATE_TEXGEN_EYE_S;
        ;}
@@ -3389,7 +3412,7 @@ yyreduce:
   case 160:
 
 /* Line 1455 of yacc.c  */
-#line 1171 "program_parse.y"
+#line 1182 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = (yyvsp[(2) - (2)].integer);
@@ -3399,7 +3422,7 @@ yyreduce:
   case 161:
 
 /* Line 1455 of yacc.c  */
-#line 1178 "program_parse.y"
+#line 1189 "program_parse.y"
     {
           (yyval.integer) = STATE_FOG_COLOR;
        ;}
@@ -3408,7 +3431,7 @@ yyreduce:
   case 162:
 
 /* Line 1455 of yacc.c  */
-#line 1182 "program_parse.y"
+#line 1193 "program_parse.y"
     {
           (yyval.integer) = STATE_FOG_PARAMS;
        ;}
@@ -3417,7 +3440,7 @@ yyreduce:
   case 163:
 
 /* Line 1455 of yacc.c  */
-#line 1188 "program_parse.y"
+#line 1199 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = STATE_CLIPPLANE;
@@ -3428,7 +3451,7 @@ yyreduce:
   case 164:
 
 /* Line 1455 of yacc.c  */
-#line 1196 "program_parse.y"
+#line 1207 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].integer) >= state->MaxClipPlanes) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid clip plane selector");
@@ -3442,7 +3465,7 @@ yyreduce:
   case 165:
 
 /* Line 1455 of yacc.c  */
-#line 1207 "program_parse.y"
+#line 1218 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = (yyvsp[(2) - (2)].integer);
@@ -3452,7 +3475,7 @@ yyreduce:
   case 166:
 
 /* Line 1455 of yacc.c  */
-#line 1214 "program_parse.y"
+#line 1225 "program_parse.y"
     {
           (yyval.integer) = STATE_POINT_SIZE;
        ;}
@@ -3461,7 +3484,7 @@ yyreduce:
   case 167:
 
 /* Line 1455 of yacc.c  */
-#line 1218 "program_parse.y"
+#line 1229 "program_parse.y"
     {
           (yyval.integer) = STATE_POINT_ATTENUATION;
        ;}
@@ -3470,7 +3493,7 @@ yyreduce:
   case 168:
 
 /* Line 1455 of yacc.c  */
-#line 1224 "program_parse.y"
+#line 1235 "program_parse.y"
     {
           (yyval.state)[0] = (yyvsp[(1) - (5)].state)[0];
           (yyval.state)[1] = (yyvsp[(1) - (5)].state)[1];
@@ -3483,7 +3506,7 @@ yyreduce:
   case 169:
 
 /* Line 1455 of yacc.c  */
-#line 1234 "program_parse.y"
+#line 1245 "program_parse.y"
     {
           (yyval.state)[0] = (yyvsp[(1) - (2)].state)[0];
           (yyval.state)[1] = (yyvsp[(1) - (2)].state)[1];
@@ -3496,7 +3519,7 @@ yyreduce:
   case 170:
 
 /* Line 1455 of yacc.c  */
-#line 1244 "program_parse.y"
+#line 1255 "program_parse.y"
     {
           (yyval.state)[2] = 0;
           (yyval.state)[3] = 3;
@@ -3506,7 +3529,7 @@ yyreduce:
   case 171:
 
 /* Line 1455 of yacc.c  */
-#line 1249 "program_parse.y"
+#line 1260 "program_parse.y"
     {
           /* It seems logical that the matrix row range specifier would have
            * to specify a range or more than one row (i.e., $5 > $3).
@@ -3527,7 +3550,7 @@ yyreduce:
   case 172:
 
 /* Line 1455 of yacc.c  */
-#line 1267 "program_parse.y"
+#line 1278 "program_parse.y"
     {
           (yyval.state)[0] = (yyvsp[(2) - (3)].state)[0];
           (yyval.state)[1] = (yyvsp[(2) - (3)].state)[1];
@@ -3538,7 +3561,7 @@ yyreduce:
   case 173:
 
 /* Line 1455 of yacc.c  */
-#line 1275 "program_parse.y"
+#line 1286 "program_parse.y"
     {
           (yyval.integer) = 0;
        ;}
@@ -3547,7 +3570,7 @@ yyreduce:
   case 174:
 
 /* Line 1455 of yacc.c  */
-#line 1279 "program_parse.y"
+#line 1290 "program_parse.y"
     {
           (yyval.integer) = (yyvsp[(1) - (1)].integer);
        ;}
@@ -3556,7 +3579,7 @@ yyreduce:
   case 175:
 
 /* Line 1455 of yacc.c  */
-#line 1285 "program_parse.y"
+#line 1296 "program_parse.y"
     {
           (yyval.integer) = STATE_MATRIX_INVERSE;
        ;}
@@ -3565,7 +3588,7 @@ yyreduce:
   case 176:
 
 /* Line 1455 of yacc.c  */
-#line 1289 "program_parse.y"
+#line 1300 "program_parse.y"
     {
           (yyval.integer) = STATE_MATRIX_TRANSPOSE;
        ;}
@@ -3574,7 +3597,7 @@ yyreduce:
   case 177:
 
 /* Line 1455 of yacc.c  */
-#line 1293 "program_parse.y"
+#line 1304 "program_parse.y"
     {
           (yyval.integer) = STATE_MATRIX_INVTRANS;
        ;}
@@ -3583,7 +3606,7 @@ yyreduce:
   case 178:
 
 /* Line 1455 of yacc.c  */
-#line 1299 "program_parse.y"
+#line 1310 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].integer) > 3) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid matrix row reference");
@@ -3597,7 +3620,7 @@ yyreduce:
   case 179:
 
 /* Line 1455 of yacc.c  */
-#line 1310 "program_parse.y"
+#line 1321 "program_parse.y"
     {
           (yyval.state)[0] = STATE_MODELVIEW_MATRIX;
           (yyval.state)[1] = (yyvsp[(2) - (2)].integer);
@@ -3607,7 +3630,7 @@ yyreduce:
   case 180:
 
 /* Line 1455 of yacc.c  */
-#line 1315 "program_parse.y"
+#line 1326 "program_parse.y"
     {
           (yyval.state)[0] = STATE_PROJECTION_MATRIX;
           (yyval.state)[1] = 0;
@@ -3617,7 +3640,7 @@ yyreduce:
   case 181:
 
 /* Line 1455 of yacc.c  */
-#line 1320 "program_parse.y"
+#line 1331 "program_parse.y"
     {
           (yyval.state)[0] = STATE_MVP_MATRIX;
           (yyval.state)[1] = 0;
@@ -3627,7 +3650,7 @@ yyreduce:
   case 182:
 
 /* Line 1455 of yacc.c  */
-#line 1325 "program_parse.y"
+#line 1336 "program_parse.y"
     {
           (yyval.state)[0] = STATE_TEXTURE_MATRIX;
           (yyval.state)[1] = (yyvsp[(2) - (2)].integer);
@@ -3637,7 +3660,7 @@ yyreduce:
   case 183:
 
 /* Line 1455 of yacc.c  */
-#line 1330 "program_parse.y"
+#line 1341 "program_parse.y"
     {
           YYERROR;
        ;}
@@ -3646,7 +3669,7 @@ yyreduce:
   case 184:
 
 /* Line 1455 of yacc.c  */
-#line 1334 "program_parse.y"
+#line 1345 "program_parse.y"
     {
           (yyval.state)[0] = STATE_PROGRAM_MATRIX;
           (yyval.state)[1] = (yyvsp[(3) - (4)].integer);
@@ -3656,7 +3679,7 @@ yyreduce:
   case 185:
 
 /* Line 1455 of yacc.c  */
-#line 1341 "program_parse.y"
+#line 1352 "program_parse.y"
     {
           (yyval.integer) = 0;
        ;}
@@ -3665,7 +3688,7 @@ yyreduce:
   case 186:
 
 /* Line 1455 of yacc.c  */
-#line 1345 "program_parse.y"
+#line 1356 "program_parse.y"
     {
           (yyval.integer) = (yyvsp[(1) - (1)].integer);
        ;}
@@ -3674,7 +3697,7 @@ yyreduce:
   case 187:
 
 /* Line 1455 of yacc.c  */
-#line 1350 "program_parse.y"
+#line 1361 "program_parse.y"
     {
           /* Since GL_ARB_vertex_blend isn't supported, only modelview matrix
            * zero is valid.
@@ -3691,7 +3714,7 @@ yyreduce:
   case 188:
 
 /* Line 1455 of yacc.c  */
-#line 1363 "program_parse.y"
+#line 1374 "program_parse.y"
     {
           /* Since GL_ARB_matrix_palette isn't supported, just let any value
            * through here.  The error will be generated later.
@@ -3703,7 +3726,7 @@ yyreduce:
   case 189:
 
 /* Line 1455 of yacc.c  */
-#line 1371 "program_parse.y"
+#line 1382 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].integer) >= state->MaxProgramMatrices) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid program matrix selector");
@@ -3717,7 +3740,7 @@ yyreduce:
   case 194:
 
 /* Line 1455 of yacc.c  */
-#line 1388 "program_parse.y"
+#line 1399 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = state->state_param_enum;
@@ -3730,7 +3753,7 @@ yyreduce:
   case 195:
 
 /* Line 1455 of yacc.c  */
-#line 1398 "program_parse.y"
+#line 1409 "program_parse.y"
     {
           (yyval.state)[0] = (yyvsp[(1) - (1)].integer);
           (yyval.state)[1] = (yyvsp[(1) - (1)].integer);
@@ -3740,7 +3763,7 @@ yyreduce:
   case 196:
 
 /* Line 1455 of yacc.c  */
-#line 1403 "program_parse.y"
+#line 1414 "program_parse.y"
     {
           (yyval.state)[0] = (yyvsp[(1) - (3)].integer);
           (yyval.state)[1] = (yyvsp[(3) - (3)].integer);
@@ -3750,7 +3773,7 @@ yyreduce:
   case 197:
 
 /* Line 1455 of yacc.c  */
-#line 1410 "program_parse.y"
+#line 1421 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = state->state_param_enum;
@@ -3763,7 +3786,7 @@ yyreduce:
   case 198:
 
 /* Line 1455 of yacc.c  */
-#line 1420 "program_parse.y"
+#line 1431 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = state->state_param_enum;
@@ -3776,7 +3799,7 @@ yyreduce:
   case 199:
 
 /* Line 1455 of yacc.c  */
-#line 1429 "program_parse.y"
+#line 1440 "program_parse.y"
     {
           (yyval.state)[0] = (yyvsp[(1) - (1)].integer);
           (yyval.state)[1] = (yyvsp[(1) - (1)].integer);
@@ -3786,7 +3809,7 @@ yyreduce:
   case 200:
 
 /* Line 1455 of yacc.c  */
-#line 1434 "program_parse.y"
+#line 1445 "program_parse.y"
     {
           (yyval.state)[0] = (yyvsp[(1) - (3)].integer);
           (yyval.state)[1] = (yyvsp[(3) - (3)].integer);
@@ -3796,7 +3819,7 @@ yyreduce:
   case 201:
 
 /* Line 1455 of yacc.c  */
-#line 1441 "program_parse.y"
+#line 1452 "program_parse.y"
     {
           memset((yyval.state), 0, sizeof((yyval.state)));
           (yyval.state)[0] = state->state_param_enum;
@@ -3809,7 +3832,7 @@ yyreduce:
   case 202:
 
 /* Line 1455 of yacc.c  */
-#line 1451 "program_parse.y"
+#line 1462 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].integer) >= state->limits->MaxEnvParams) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid environment parameter reference");
@@ -3822,7 +3845,7 @@ yyreduce:
   case 203:
 
 /* Line 1455 of yacc.c  */
-#line 1461 "program_parse.y"
+#line 1472 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].integer) >= state->limits->MaxLocalParams) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid local parameter reference");
@@ -3835,7 +3858,7 @@ yyreduce:
   case 208:
 
 /* Line 1455 of yacc.c  */
-#line 1476 "program_parse.y"
+#line 1487 "program_parse.y"
     {
           (yyval.vector).count = 1;
           (yyval.vector).data[0] = (yyvsp[(1) - (1)].real);
@@ -3845,7 +3868,7 @@ yyreduce:
   case 209:
 
 /* Line 1455 of yacc.c  */
-#line 1483 "program_parse.y"
+#line 1494 "program_parse.y"
     {
           (yyval.vector).count = 1;
           (yyval.vector).data[0] = (yyvsp[(1) - (1)].real);
@@ -3855,7 +3878,7 @@ yyreduce:
   case 210:
 
 /* Line 1455 of yacc.c  */
-#line 1488 "program_parse.y"
+#line 1499 "program_parse.y"
     {
           (yyval.vector).count = 1;
           (yyval.vector).data[0] = (float) (yyvsp[(1) - (1)].integer);
@@ -3865,7 +3888,7 @@ yyreduce:
   case 211:
 
 /* Line 1455 of yacc.c  */
-#line 1495 "program_parse.y"
+#line 1506 "program_parse.y"
     {
           (yyval.vector).count = 1;
           (yyval.vector).data[0] = (yyvsp[(2) - (3)].real);
@@ -3875,7 +3898,7 @@ yyreduce:
   case 212:
 
 /* Line 1455 of yacc.c  */
-#line 1500 "program_parse.y"
+#line 1511 "program_parse.y"
     {
           (yyval.vector).count = 2;
           (yyval.vector).data[0] = (yyvsp[(2) - (5)].real);
@@ -3886,7 +3909,7 @@ yyreduce:
   case 213:
 
 /* Line 1455 of yacc.c  */
-#line 1507 "program_parse.y"
+#line 1518 "program_parse.y"
     {
           (yyval.vector).count = 3;
           (yyval.vector).data[0] = (yyvsp[(2) - (7)].real);
@@ -3898,7 +3921,7 @@ yyreduce:
   case 214:
 
 /* Line 1455 of yacc.c  */
-#line 1515 "program_parse.y"
+#line 1526 "program_parse.y"
     {
           (yyval.vector).count = 4;
           (yyval.vector).data[0] = (yyvsp[(2) - (9)].real);
@@ -3911,7 +3934,7 @@ yyreduce:
   case 215:
 
 /* Line 1455 of yacc.c  */
-#line 1525 "program_parse.y"
+#line 1536 "program_parse.y"
     {
           (yyval.real) = ((yyvsp[(1) - (2)].negate)) ? -(yyvsp[(2) - (2)].real) : (yyvsp[(2) - (2)].real);
        ;}
@@ -3920,7 +3943,7 @@ yyreduce:
   case 216:
 
 /* Line 1455 of yacc.c  */
-#line 1529 "program_parse.y"
+#line 1540 "program_parse.y"
     {
           (yyval.real) = (float)(((yyvsp[(1) - (2)].negate)) ? -(yyvsp[(2) - (2)].integer) : (yyvsp[(2) - (2)].integer));
        ;}
@@ -3929,42 +3952,42 @@ yyreduce:
   case 217:
 
 /* Line 1455 of yacc.c  */
-#line 1534 "program_parse.y"
+#line 1545 "program_parse.y"
     { (yyval.negate) = FALSE; ;}
     break;
 
   case 218:
 
 /* Line 1455 of yacc.c  */
-#line 1535 "program_parse.y"
+#line 1546 "program_parse.y"
     { (yyval.negate) = TRUE;  ;}
     break;
 
   case 219:
 
 /* Line 1455 of yacc.c  */
-#line 1536 "program_parse.y"
+#line 1547 "program_parse.y"
     { (yyval.negate) = FALSE; ;}
     break;
 
   case 220:
 
 /* Line 1455 of yacc.c  */
-#line 1539 "program_parse.y"
+#line 1550 "program_parse.y"
     { (yyval.integer) = (yyvsp[(1) - (1)].integer); ;}
     break;
 
   case 222:
 
 /* Line 1455 of yacc.c  */
-#line 1542 "program_parse.y"
+#line 1553 "program_parse.y"
     { (yyval.integer) = (yyvsp[(1) - (1)].integer); ;}
     break;
 
   case 224:
 
 /* Line 1455 of yacc.c  */
-#line 1546 "program_parse.y"
+#line 1557 "program_parse.y"
     {
           if (!declare_variable(state, (yyvsp[(3) - (3)].string), (yyvsp[(0) - (3)].integer), & (yylsp[(3) - (3)]))) {
              YYERROR;
@@ -3975,7 +3998,7 @@ yyreduce:
   case 225:
 
 /* Line 1455 of yacc.c  */
-#line 1552 "program_parse.y"
+#line 1563 "program_parse.y"
     {
           if (!declare_variable(state, (yyvsp[(1) - (1)].string), (yyvsp[(0) - (1)].integer), & (yylsp[(1) - (1)]))) {
              YYERROR;
@@ -3986,7 +4009,7 @@ yyreduce:
   case 226:
 
 /* Line 1455 of yacc.c  */
-#line 1560 "program_parse.y"
+#line 1571 "program_parse.y"
     {
           struct asm_symbol *const s =
              declare_variable(state, (yyvsp[(2) - (4)].string), at_output, & (yylsp[(2) - (4)]));
@@ -4002,7 +4025,7 @@ yyreduce:
   case 227:
 
 /* Line 1455 of yacc.c  */
-#line 1573 "program_parse.y"
+#line 1584 "program_parse.y"
     {
           if (state->mode == ARB_vertex) {
              (yyval.result) = VERT_RESULT_HPOS;
@@ -4016,7 +4039,7 @@ yyreduce:
   case 228:
 
 /* Line 1455 of yacc.c  */
-#line 1582 "program_parse.y"
+#line 1593 "program_parse.y"
     {
           if (state->mode == ARB_vertex) {
              (yyval.result) = VERT_RESULT_FOGC;
@@ -4030,7 +4053,7 @@ yyreduce:
   case 229:
 
 /* Line 1455 of yacc.c  */
-#line 1591 "program_parse.y"
+#line 1602 "program_parse.y"
     {
           (yyval.result) = (yyvsp[(2) - (2)].result);
        ;}
@@ -4039,7 +4062,7 @@ yyreduce:
   case 230:
 
 /* Line 1455 of yacc.c  */
-#line 1595 "program_parse.y"
+#line 1606 "program_parse.y"
     {
           if (state->mode == ARB_vertex) {
              (yyval.result) = VERT_RESULT_PSIZ;
@@ -4053,7 +4076,7 @@ yyreduce:
   case 231:
 
 /* Line 1455 of yacc.c  */
-#line 1604 "program_parse.y"
+#line 1615 "program_parse.y"
     {
           if (state->mode == ARB_vertex) {
              (yyval.result) = VERT_RESULT_TEX0 + (yyvsp[(3) - (3)].integer);
@@ -4067,7 +4090,7 @@ yyreduce:
   case 232:
 
 /* Line 1455 of yacc.c  */
-#line 1613 "program_parse.y"
+#line 1624 "program_parse.y"
     {
           if (state->mode == ARB_fragment) {
              (yyval.result) = FRAG_RESULT_DEPTH;
@@ -4081,7 +4104,7 @@ yyreduce:
   case 233:
 
 /* Line 1455 of yacc.c  */
-#line 1624 "program_parse.y"
+#line 1635 "program_parse.y"
     {
           (yyval.result) = (yyvsp[(2) - (3)].integer) + (yyvsp[(3) - (3)].integer);
        ;}
@@ -4090,7 +4113,7 @@ yyreduce:
   case 234:
 
 /* Line 1455 of yacc.c  */
-#line 1630 "program_parse.y"
+#line 1641 "program_parse.y"
     {
           (yyval.integer) = (state->mode == ARB_vertex)
              ? VERT_RESULT_COL0
@@ -4101,7 +4124,7 @@ yyreduce:
   case 235:
 
 /* Line 1455 of yacc.c  */
-#line 1636 "program_parse.y"
+#line 1647 "program_parse.y"
     {
           if (state->mode == ARB_vertex) {
              (yyval.integer) = VERT_RESULT_COL0;
@@ -4115,7 +4138,7 @@ yyreduce:
   case 236:
 
 /* Line 1455 of yacc.c  */
-#line 1645 "program_parse.y"
+#line 1656 "program_parse.y"
     {
           if (state->mode == ARB_vertex) {
              (yyval.integer) = VERT_RESULT_BFC0;
@@ -4129,7 +4152,7 @@ yyreduce:
   case 237:
 
 /* Line 1455 of yacc.c  */
-#line 1656 "program_parse.y"
+#line 1667 "program_parse.y"
     {
           (yyval.integer) = 0; 
        ;}
@@ -4138,7 +4161,7 @@ yyreduce:
   case 238:
 
 /* Line 1455 of yacc.c  */
-#line 1660 "program_parse.y"
+#line 1671 "program_parse.y"
     {
           if (state->mode == ARB_vertex) {
              (yyval.integer) = 0;
@@ -4152,7 +4175,7 @@ yyreduce:
   case 239:
 
 /* Line 1455 of yacc.c  */
-#line 1669 "program_parse.y"
+#line 1680 "program_parse.y"
     {
           if (state->mode == ARB_vertex) {
              (yyval.integer) = 1;
@@ -4166,91 +4189,91 @@ yyreduce:
   case 240:
 
 /* Line 1455 of yacc.c  */
-#line 1679 "program_parse.y"
+#line 1690 "program_parse.y"
     { (yyval.integer) = 0; ;}
     break;
 
   case 241:
 
 /* Line 1455 of yacc.c  */
-#line 1680 "program_parse.y"
+#line 1691 "program_parse.y"
     { (yyval.integer) = 0; ;}
     break;
 
   case 242:
 
 /* Line 1455 of yacc.c  */
-#line 1681 "program_parse.y"
+#line 1692 "program_parse.y"
     { (yyval.integer) = 1; ;}
     break;
 
   case 243:
 
 /* Line 1455 of yacc.c  */
-#line 1684 "program_parse.y"
+#line 1695 "program_parse.y"
     { (yyval.integer) = 0; ;}
     break;
 
   case 244:
 
 /* Line 1455 of yacc.c  */
-#line 1685 "program_parse.y"
+#line 1696 "program_parse.y"
     { (yyval.integer) = 0; ;}
     break;
 
   case 245:
 
 /* Line 1455 of yacc.c  */
-#line 1686 "program_parse.y"
+#line 1697 "program_parse.y"
     { (yyval.integer) = 1; ;}
     break;
 
   case 246:
 
 /* Line 1455 of yacc.c  */
-#line 1689 "program_parse.y"
+#line 1700 "program_parse.y"
     { (yyval.integer) = 0; ;}
     break;
 
   case 247:
 
 /* Line 1455 of yacc.c  */
-#line 1690 "program_parse.y"
+#line 1701 "program_parse.y"
     { (yyval.integer) = (yyvsp[(2) - (3)].integer); ;}
     break;
 
   case 248:
 
 /* Line 1455 of yacc.c  */
-#line 1693 "program_parse.y"
+#line 1704 "program_parse.y"
     { (yyval.integer) = 0; ;}
     break;
 
   case 249:
 
 /* Line 1455 of yacc.c  */
-#line 1694 "program_parse.y"
+#line 1705 "program_parse.y"
     { (yyval.integer) = (yyvsp[(2) - (3)].integer); ;}
     break;
 
   case 250:
 
 /* Line 1455 of yacc.c  */
-#line 1697 "program_parse.y"
+#line 1708 "program_parse.y"
     { (yyval.integer) = 0; ;}
     break;
 
   case 251:
 
 /* Line 1455 of yacc.c  */
-#line 1698 "program_parse.y"
+#line 1709 "program_parse.y"
     { (yyval.integer) = (yyvsp[(2) - (3)].integer); ;}
     break;
 
   case 252:
 
 /* Line 1455 of yacc.c  */
-#line 1702 "program_parse.y"
+#line 1713 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].integer) >= state->MaxTextureCoordUnits) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid texture coordinate unit selector");
@@ -4264,7 +4287,7 @@ yyreduce:
   case 253:
 
 /* Line 1455 of yacc.c  */
-#line 1713 "program_parse.y"
+#line 1724 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].integer) >= state->MaxTextureImageUnits) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid texture image unit selector");
@@ -4278,7 +4301,7 @@ yyreduce:
   case 254:
 
 /* Line 1455 of yacc.c  */
-#line 1724 "program_parse.y"
+#line 1735 "program_parse.y"
     {
           if ((yyvsp[(1) - (1)].integer) >= state->MaxTextureUnits) {
              yyerror(& (yylsp[(1) - (1)]), state, "invalid texture unit selector");
@@ -4292,7 +4315,7 @@ yyreduce:
   case 255:
 
 /* Line 1455 of yacc.c  */
-#line 1735 "program_parse.y"
+#line 1746 "program_parse.y"
     {
           struct asm_symbol *exist = (struct asm_symbol *)
              _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(2) - (4)].string));
@@ -4316,7 +4339,7 @@ yyreduce:
 
 
 /* Line 1455 of yacc.c  */
-#line 4320 "program_parse.tab.c"
+#line 4343 "program_parse.tab.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -4535,7 +4558,7 @@ yyreturn:
 
 
 /* Line 1675 of yacc.c  */
-#line 1755 "program_parse.y"
+#line 1766 "program_parse.y"
 
 
 struct asm_instruction *
index a0bec96924a91647fd1a9195c62dc6be838ad895..95d6c0ea31310816d16d459e0c2b3e5f97cfd9e0 100644 (file)
@@ -302,7 +302,15 @@ statement: instruction ';'
        ;
 
 instruction: ALU_instruction
+       {
+          $$ = $1;
+          state->prog->NumAluInstructions++;
+       }
        | TexInstruction
+       {
+          $$ = $1;
+          state->prog->NumTexInstructions++;
+       }
        ;
 
 ALU_instruction: ARL_instruction
@@ -368,6 +376,8 @@ SAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',
              $$->Base.SaturateMode = $1.SaturateMode;
              $$->Base.TexSrcUnit = $6;
              $$->Base.TexSrcTarget = $8;
+
+             state->prog->TexturesUsed[$6] |= (1U << $8);
           }
        }
        ;
@@ -375,6 +385,7 @@ SAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',
 KIL_instruction: KIL swizzleSrcReg
        {
           $$ = asm_instruction_ctor(OPCODE_KIL, NULL, & $2, NULL, NULL);
+          state->fragment.UsesKill = 1;
        }
        ;