Mesa (asm-shader-rework-3): NV vp3 parser: Enable texture instructions added by NV_vp3

Ian Romanick idr at kemper.freedesktop.org
Thu Oct 1 22:32:21 UTC 2009


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

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Thu Oct  1 15:28:31 2009 -0700

NV vp3 parser: Enable texture instructions added by NV_vp3

---

 src/mesa/shader/program_lexer.l |   14 ++++++----
 src/mesa/shader/program_parse.y |   53 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 6 deletions(-)

diff --git a/src/mesa/shader/program_lexer.l b/src/mesa/shader/program_lexer.l
index 4324a4e..a271bde 100644
--- a/src/mesa/shader/program_lexer.l
+++ b/src/mesa/shader/program_lexer.l
@@ -33,6 +33,7 @@
 #define require_ARB_fp (yyextra->mode == ARB_fragment)
 #define require_NV_fp  (yyextra->option.NV_fragment)
 #define require_NV_vp2 (yyextra->option.NV_vertex2)
+#define require_NV_vp3 (yyextra->option.NV_vertex3)
 #define require_shadow (yyextra->option.Shadow)
 #define require_rect   (yyextra->option.TexRect)
 #define require_texarray        (yyextra->option.TexArray)
@@ -234,10 +235,11 @@ STR{sz}{cc}{sat}   { return_opcode(require_NV_fp || require_NV_vp2,  BIN_OP, STR
 SUB{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, SUB, 3); }
 SWZ{sat}           { return_opcode(             1, SWZ, SWZ, 3); }
 
-TEX{cc}{sat}       { return_opcode(require_ARB_fp, SAMPLE_OP, TEX, 3); }
-TXB{cc}{sat}       { return_opcode(require_ARB_fp, SAMPLE_OP, TXB, 3); }
+TEX{cc}{sat}       { return_opcode(require_ARB_fp || require_NV_vp3, SAMPLE_OP, TEX, 3); }
+TXB{cc}{sat}       { return_opcode(require_ARB_fp || require_NV_vp3, SAMPLE_OP, TXB, 3); }
 TXD{cc}{sat}       { return_opcode(require_NV_fp,  TXD_OP, TXD, 3); }
-TXP{cc}{sat}       { return_opcode(require_ARB_fp, SAMPLE_OP, TXP, 3); }
+TXL{cc}            { return_opcode(require_NV_vp3, SAMPLE_OP, TXP, 3); }
+TXP{cc}{sat}       { return_opcode(require_ARB_fp || require_NV_vp3, SAMPLE_OP, TXP, 3); }
 
 UP2H{cc}{sat}      { return_opcode(require_NV_fp,  SCALAR_OP, UP2H, 4); }
 UP2US{cc}{sat}     { return_opcode(require_NV_fp,  SCALAR_OP, UP2US, 5); }
@@ -310,9 +312,9 @@ result                    { return RESULT; }
 {dot}weight               { return_token_or_DOT(require_ARB_vp, WEIGHT); }
 
 texture                   { return_token_or_IDENTIFIER(require_ARB_fp, TEXTURE_UNIT); }
-1D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_1D); }
-2D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_2D); }
-3D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_3D); }
+1D                        { return_token_or_IDENTIFIER(require_ARB_fp || require_NV_vp3, TEX_1D); }
+2D                        { return_token_or_IDENTIFIER(require_ARB_fp || require_NV_vp3, TEX_2D); }
+3D                        { return_token_or_IDENTIFIER(require_ARB_fp || require_NV_vp3, TEX_3D); }
 CUBE                      { return_token_or_IDENTIFIER(require_ARB_fp, TEX_CUBE); }
 RECT                      { return_token_or_IDENTIFIER(require_ARB_fp && require_rect, TEX_RECT); }
 SHADOW1D                  { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow, TEX_SHADOW1D); }
diff --git a/src/mesa/shader/program_parse.y b/src/mesa/shader/program_parse.y
index 6b0f3d3..45254f6 100644
--- a/src/mesa/shader/program_parse.y
+++ b/src/mesa/shader/program_parse.y
@@ -521,6 +521,21 @@ texImageUnit: TEXTURE_UNIT optTexImageUnitNum
 	{
 	   $$ = $2;
 	}
+	| string optTexImageUnitNum
+	{
+	   /* The NV_vertex_program3 spec is just plain broken.  While
+	    * ARB_fragment_program correctly makes "texture" a reserved word,
+	    * NV_vp3 does not.  To work around this, the lexer treats it as
+	    * IDENTIFIER or USED_IDENTIFIER, and the parser has to do the
+	    * matching.
+	    */
+	   if (strcmp("texture", $1) == 0) {
+	      $$ = $2;
+	   } else {
+	      yyerror(& @1, state, "expected \"texture\", got IDENTIFIER");
+	      YYERROR;
+	   }
+	}
 	;
 
 texTarget: TEX_1D  { $$ = TEXTURE_1D_INDEX; }
@@ -535,6 +550,44 @@ texTarget: TEX_1D  { $$ = TEXTURE_1D_INDEX; }
 	| TEX_ARRAY2D         { $$ = TEXTURE_2D_ARRAY_INDEX; }
 	| TEX_ARRAYSHADOW1D   { $$ = -TEXTURE_1D_ARRAY_INDEX; }
 	| TEX_ARRAYSHADOW2D   { $$ = -TEXTURE_2D_ARRAY_INDEX; }
+	| string
+	{
+	   int valid = 0;
+
+	   /* The NV_vertex_program3 spec is just plain broken.  While
+	    * ARB_fragment_program correctly makes SHADOW1D, SHADOW2D, CUBE,
+	    * and RECT reserved words, NV_vp3 does not.  To work around this,
+	    * the lexer treats these as IDENTIFIER or USED_IDENTIFIER, and the
+	    * parser has to do the matching.
+	    */
+	   if (state->option.NV_vertex3) {
+	      if (strncmp("SHADOW", $1, 6) == 0) {
+		 const char *const subTarget = & $1[6];
+
+		 if (strcmp("1D", subTarget) == 0) {
+		    $$ = -TEXTURE_1D_INDEX;
+		    valid = state->option.Shadow;
+		 } else if (strcmp("2D", subTarget) == 0) {
+		    $$ = -TEXTURE_2D_INDEX;
+		    valid = state->option.Shadow;
+		 } else if (strcmp("RECT", subTarget) == 0) {
+		    $$ = -TEXTURE_RECT_INDEX;
+		    valid = state->option.Shadow && state->option.TexRect;
+		 }
+	      } else if (strcmp("CUBE", $1) == 0) {
+		 $$ = TEXTURE_CUBE_INDEX;
+		 valid = 1;
+	      } else if (strcmp("RECT", $1) == 0) {
+		 $$ = TEXTURE_RECT_INDEX;
+		 valid = state->option.TexRect;
+	      }
+	   }
+
+	   if (!valid) {
+	      yyerror(& @1, state, "invalid texture target");
+	      YYERROR;
+	   }
+	}
 	;
 
 SWZ_instruction: SWZ maskedDstReg ',' srcReg ',' extendedSwizzle




More information about the mesa-commit mailing list