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:
File diff suppressed because it is too large
Load Diff
@@ -29,6 +29,7 @@
|
||||
|
||||
#define require_ARB_vp (yyextra->mode == ARB_vertex)
|
||||
#define require_ARB_fp (yyextra->mode == ARB_fragment)
|
||||
#define require_shadow (yyextra->option.Shadow)
|
||||
#define require_rect (yyextra->option.TexRect)
|
||||
|
||||
#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); }
|
||||
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); }
|
||||
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$]* {
|
||||
yylval->string = strdup(yytext);
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -124,17 +124,20 @@
|
||||
TEX_3D = 340,
|
||||
TEX_CUBE = 341,
|
||||
TEX_RECT = 342,
|
||||
VERTEX = 343,
|
||||
VTXATTRIB = 344,
|
||||
WEIGHT = 345,
|
||||
IDENTIFIER = 346,
|
||||
MASK4 = 347,
|
||||
MASK3 = 348,
|
||||
MASK2 = 349,
|
||||
MASK1 = 350,
|
||||
SWIZZLE = 351,
|
||||
DOT_DOT = 352,
|
||||
DOT = 353
|
||||
TEX_SHADOW1D = 343,
|
||||
TEX_SHADOW2D = 344,
|
||||
TEX_SHADOWRECT = 345,
|
||||
VERTEX = 346,
|
||||
VTXATTRIB = 347,
|
||||
WEIGHT = 348,
|
||||
IDENTIFIER = 349,
|
||||
MASK4 = 350,
|
||||
MASK3 = 351,
|
||||
MASK2 = 352,
|
||||
MASK1 = 353,
|
||||
SWIZZLE = 354,
|
||||
DOT_DOT = 355,
|
||||
DOT = 356
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -167,7 +170,7 @@ typedef union YYSTYPE
|
||||
|
||||
|
||||
/* Line 1676 of yacc.c */
|
||||
#line 171 "program_parse.tab.h"
|
||||
#line 174 "program_parse.tab.h"
|
||||
} YYSTYPE;
|
||||
# define YYSTYPE_IS_TRIVIAL 1
|
||||
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||
|
@@ -157,6 +157,7 @@ static struct asm_instruction *asm_instruction_ctor(gl_inst_opcode op,
|
||||
%token SCENECOLOR SECONDARY SHININESS SIZE SPECULAR SPOT STATE
|
||||
%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 TEX_SHADOW1D TEX_SHADOW2D TEX_SHADOWRECT
|
||||
%token VERTEX VTXATTRIB
|
||||
%token WEIGHT
|
||||
|
||||
@@ -383,11 +384,43 @@ SAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',
|
||||
{
|
||||
$$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL);
|
||||
if ($$ != NULL) {
|
||||
const GLbitfield tex_mask = (1U << $6);
|
||||
GLbitfield shadow_tex = 0;
|
||||
GLbitfield target_mask = 0;
|
||||
|
||||
|
||||
$$->Base.SaturateMode = $1.SaturateMode;
|
||||
$$->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_CUBE { $$ = TEXTURE_CUBE_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
|
||||
|
Reference in New Issue
Block a user