ARB prog parser: Add support for GL_ARB_fragment_program_shadow

Passes the piglit asmparsertest shadow-0[123].txt tests and
progs/demos/shadowtex.
This commit is contained in:
Ian Romanick
2009-07-27 16:24:49 -07:00
parent 88018e2e07
commit 1edd13bf23
5 changed files with 1763 additions and 1636 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -29,6 +29,7 @@
#define require_ARB_vp (yyextra->mode == ARB_vertex) #define require_ARB_vp (yyextra->mode == ARB_vertex)
#define require_ARB_fp (yyextra->mode == ARB_fragment) #define require_ARB_fp (yyextra->mode == ARB_fragment)
#define require_shadow (yyextra->option.Shadow)
#define require_rect (yyextra->option.TexRect) #define require_rect (yyextra->option.TexRect)
#define return_token_or_IDENTIFIER(condition, token) \ #define return_token_or_IDENTIFIER(condition, token) \
@@ -295,6 +296,9 @@ texture { return_token_or_IDENTIFIER(require_ARB_fp, TEXTURE_U
3D { return_token_or_IDENTIFIER(require_ARB_fp, TEX_3D); } 3D { return_token_or_IDENTIFIER(require_ARB_fp, TEX_3D); }
CUBE { return_token_or_IDENTIFIER(require_ARB_fp, TEX_CUBE); } CUBE { return_token_or_IDENTIFIER(require_ARB_fp, TEX_CUBE); }
RECT { return_token_or_IDENTIFIER(require_ARB_fp && require_rect, TEX_RECT); } RECT { return_token_or_IDENTIFIER(require_ARB_fp && require_rect, TEX_RECT); }
SHADOW1D { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow, TEX_SHADOW1D); }
SHADOW2D { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow, TEX_SHADOW2D); }
SHADOWRECT { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow && require_rect, TEX_SHADOWRECT); }
[_a-zA-Z$][_a-zA-Z0-9$]* { [_a-zA-Z$][_a-zA-Z0-9$]* {
yylval->string = strdup(yytext); yylval->string = strdup(yytext);

File diff suppressed because it is too large Load Diff

View File

@@ -124,17 +124,20 @@
TEX_3D = 340, TEX_3D = 340,
TEX_CUBE = 341, TEX_CUBE = 341,
TEX_RECT = 342, TEX_RECT = 342,
VERTEX = 343, TEX_SHADOW1D = 343,
VTXATTRIB = 344, TEX_SHADOW2D = 344,
WEIGHT = 345, TEX_SHADOWRECT = 345,
IDENTIFIER = 346, VERTEX = 346,
MASK4 = 347, VTXATTRIB = 347,
MASK3 = 348, WEIGHT = 348,
MASK2 = 349, IDENTIFIER = 349,
MASK1 = 350, MASK4 = 350,
SWIZZLE = 351, MASK3 = 351,
DOT_DOT = 352, MASK2 = 352,
DOT = 353 MASK1 = 353,
SWIZZLE = 354,
DOT_DOT = 355,
DOT = 356
}; };
#endif #endif
@@ -167,7 +170,7 @@ typedef union YYSTYPE
/* Line 1676 of yacc.c */ /* Line 1676 of yacc.c */
#line 171 "program_parse.tab.h" #line 174 "program_parse.tab.h"
} YYSTYPE; } YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define yystype YYSTYPE /* obsolescent; will be withdrawn */

View File

@@ -157,6 +157,7 @@ static struct asm_instruction *asm_instruction_ctor(gl_inst_opcode op,
%token SCENECOLOR SECONDARY SHININESS SIZE SPECULAR SPOT STATE %token SCENECOLOR SECONDARY SHININESS SIZE SPECULAR SPOT STATE
%token TEXCOORD TEXENV TEXGEN TEXGEN_Q TEXGEN_R TEXGEN_S TEXGEN_T TEXTURE TRANSPOSE %token TEXCOORD TEXENV TEXGEN TEXGEN_Q TEXGEN_R TEXGEN_S TEXGEN_T TEXTURE TRANSPOSE
%token TEXTURE_UNIT TEX_1D TEX_2D TEX_3D TEX_CUBE TEX_RECT %token TEXTURE_UNIT TEX_1D TEX_2D TEX_3D TEX_CUBE TEX_RECT
%token TEX_SHADOW1D TEX_SHADOW2D TEX_SHADOWRECT
%token VERTEX VTXATTRIB %token VERTEX VTXATTRIB
%token WEIGHT %token WEIGHT
@@ -383,11 +384,43 @@ SAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',
{ {
$$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL); $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL);
if ($$ != NULL) { if ($$ != NULL) {
const GLbitfield tex_mask = (1U << $6);
GLbitfield shadow_tex = 0;
GLbitfield target_mask = 0;
$$->Base.SaturateMode = $1.SaturateMode; $$->Base.SaturateMode = $1.SaturateMode;
$$->Base.TexSrcUnit = $6; $$->Base.TexSrcUnit = $6;
$$->Base.TexSrcTarget = $8;
state->prog->TexturesUsed[$6] |= (1U << $8); if ($8 < 0) {
shadow_tex = tex_mask;
$$->Base.TexSrcTarget = -$8;
$$->Base.TexShadow = 1;
} else {
$$->Base.TexSrcTarget = $8;
}
target_mask = (1U << $$->Base.TexSrcTarget);
/* If this texture unit was previously accessed and that access
* had a different texture target, generate an error.
*
* If this texture unit was previously accessed and that access
* had a different shadow mode, generate an error.
*/
if ((state->prog->TexturesUsed[$6] != 0)
&& ((state->prog->TexturesUsed[$6] != target_mask)
|| ((state->prog->ShadowSamplers & tex_mask)
!= shadow_tex))) {
yyerror(& @8, state,
"multiple targets used on one texture image unit");
YYERROR;
}
state->prog->TexturesUsed[$6] |= target_mask;
state->prog->ShadowSamplers |= shadow_tex;
} }
} }
; ;
@@ -410,6 +443,9 @@ texTarget: TEX_1D { $$ = TEXTURE_1D_INDEX; }
| TEX_3D { $$ = TEXTURE_3D_INDEX; } | TEX_3D { $$ = TEXTURE_3D_INDEX; }
| TEX_CUBE { $$ = TEXTURE_CUBE_INDEX; } | TEX_CUBE { $$ = TEXTURE_CUBE_INDEX; }
| TEX_RECT { $$ = TEXTURE_RECT_INDEX; } | TEX_RECT { $$ = TEXTURE_RECT_INDEX; }
| TEX_SHADOW1D { $$ = -TEXTURE_1D_INDEX; }
| TEX_SHADOW2D { $$ = -TEXTURE_2D_INDEX; }
| TEX_SHADOWRECT { $$ = -TEXTURE_RECT_INDEX; }
; ;
SWZ_instruction: SWZ maskedDstReg ',' srcReg ',' extendedSwizzle SWZ_instruction: SWZ maskedDstReg ',' srcReg ',' extendedSwizzle