summaryrefslogtreecommitdiffstats
path: root/src/mesa/shader/program_parse.y
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2009-07-27 16:24:49 -0700
committerIan Romanick <[email protected]>2009-07-27 16:24:49 -0700
commit1edd13bf23c7a9dad00420f519a35f75b27e853b (patch)
treed13dcc3a11e2f712d80b77f3c504dad144c9835c /src/mesa/shader/program_parse.y
parent88018e2e073909ae807f16707f2701e068900926 (diff)
ARB prog parser: Add support for GL_ARB_fragment_program_shadow
Passes the piglit asmparsertest shadow-0[123].txt tests and progs/demos/shadowtex.
Diffstat (limited to 'src/mesa/shader/program_parse.y')
-rw-r--r--src/mesa/shader/program_parse.y40
1 files changed, 38 insertions, 2 deletions
diff --git a/src/mesa/shader/program_parse.y b/src/mesa/shader/program_parse.y
index f4a1de0487a..5008446514d 100644
--- a/src/mesa/shader/program_parse.y
+++ b/src/mesa/shader/program_parse.y
@@ -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