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_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
@@ -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 */
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user