summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/auxiliary/util/u_pstipple.c25
-rw-r--r--src/gallium/auxiliary/util/u_pstipple.h3
-rw-r--r--src/gallium/drivers/softpipe/sp_state_shader.c2
3 files changed, 21 insertions, 9 deletions
diff --git a/src/gallium/auxiliary/util/u_pstipple.c b/src/gallium/auxiliary/util/u_pstipple.c
index 1e1ec4a..0a20bdb 100644
--- a/src/gallium/auxiliary/util/u_pstipple.c
+++ b/src/gallium/auxiliary/util/u_pstipple.c
@@ -182,6 +182,8 @@ struct pstip_transform_context {
int freeSampler; /** an available sampler for the pstipple */
int numImmed;
uint coordOrigin;
+ unsigned fixedUnit;
+ bool hasFixedUnit;
};
@@ -279,7 +281,8 @@ pstip_transform_prolog(struct tgsi_transform_context *ctx)
}
/* declare new sampler */
- tgsi_transform_sampler_decl(ctx, pctx->freeSampler);
+ tgsi_transform_sampler_decl(ctx,
+ pctx->hasFixedUnit ? pctx->fixedUnit : pctx->freeSampler);
/* Declare temp[0] reg if not already declared.
* We can always use temp[0] since this code is before
@@ -318,7 +321,8 @@ pstip_transform_prolog(struct tgsi_transform_context *ctx)
tgsi_transform_tex_2d_inst(ctx,
TGSI_FILE_TEMPORARY, texTemp,
TGSI_FILE_TEMPORARY, texTemp,
- pctx->freeSampler);
+ pctx->hasFixedUnit ? pctx->fixedUnit
+ : pctx->freeSampler);
/* KILL_IF -texTemp; # if -texTemp < 0, kill fragment */
tgsi_transform_kill_inst(ctx,
@@ -330,12 +334,16 @@ pstip_transform_prolog(struct tgsi_transform_context *ctx)
/**
* Given a fragment shader, return a new fragment shader which
* samples a stipple texture and executes KILL.
+ *
* \param samplerUnitOut returns the index of the sampler unit which
- * will be used to sample the stipple texture
+ * will be used to sample the stipple texture;
+ * if NULL, the fixed unit is used
+ * \param fixedUnit fixed texture unit used for the stipple texture
*/
struct tgsi_token *
util_pstipple_create_fragment_shader(const struct tgsi_token *tokens,
- unsigned *samplerUnitOut)
+ unsigned *samplerUnitOut,
+ unsigned fixedUnit)
{
struct pstip_transform_context transform;
const uint newLen = tgsi_num_tokens(tokens) + NUM_NEW_TOKENS;
@@ -352,6 +360,8 @@ util_pstipple_create_fragment_shader(const struct tgsi_token *tokens,
transform.wincoordInput = -1;
transform.maxInput = -1;
transform.coordOrigin = TGSI_FS_COORD_ORIGIN_UPPER_LEFT;
+ transform.hasFixedUnit = !samplerUnitOut;
+ transform.fixedUnit = fixedUnit;
transform.base.prolog = pstip_transform_prolog;
transform.base.transform_declaration = pstip_transform_decl;
transform.base.transform_immediate = pstip_transform_immed;
@@ -368,9 +378,10 @@ util_pstipple_create_fragment_shader(const struct tgsi_token *tokens,
tgsi_dump(new_fs->tokens, 0);
#endif
- assert(transform.freeSampler < PIPE_MAX_SAMPLERS);
- *samplerUnitOut = transform.freeSampler;
+ if (samplerUnitOut) {
+ assert(transform.freeSampler < PIPE_MAX_SAMPLERS);
+ *samplerUnitOut = transform.freeSampler;
+ }
return new_tokens;
}
-
diff --git a/src/gallium/auxiliary/util/u_pstipple.h b/src/gallium/auxiliary/util/u_pstipple.h
index 13155e7..249c58b 100644
--- a/src/gallium/auxiliary/util/u_pstipple.h
+++ b/src/gallium/auxiliary/util/u_pstipple.h
@@ -49,7 +49,8 @@ util_pstipple_create_sampler(struct pipe_context *pipe);
struct tgsi_token *
util_pstipple_create_fragment_shader(const struct tgsi_token *tokens,
- unsigned *samplerUnitOut);
+ unsigned *samplerUnitOut,
+ unsigned fixed_unit);
#endif
diff --git a/src/gallium/drivers/softpipe/sp_state_shader.c b/src/gallium/drivers/softpipe/sp_state_shader.c
index 58a2498..8ab2903 100644
--- a/src/gallium/drivers/softpipe/sp_state_shader.c
+++ b/src/gallium/drivers/softpipe/sp_state_shader.c
@@ -64,7 +64,7 @@ create_fs_variant(struct softpipe_context *softpipe,
/* get new shader that implements polygon stippling */
var->tokens =
util_pstipple_create_fragment_shader(curfs->tokens,
- &var->stipple_sampler_unit);
+ &var->stipple_sampler_unit, 0);
}
else
#endif