Module: Mesa Branch: asm-shader-rework-3 Commit: c066e696a75c6e66c6210fe22b7427c244e97af0 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c066e696a75c6e66c6210fe22b7427c244e97af0
Author: Ian Romanick <[email protected]> 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 _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
