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