diff options
author | Marek Olšák <marek.olsak@amd.com> | 2015-01-31 18:56:54 +0100 |
---|---|---|
committer | Marek Olšák <marek.olsak@amd.com> | 2015-02-04 14:34:13 +0100 |
commit | 8fc542aa8904339c52a4aec0ebaf42f498ba6ae8 (patch) | |
tree | 18f31c84ded403134fcaff9908bbb58ba96a7a60 /src/gallium | |
parent | 50433ea526942dbeac75cc415becadea157e5d33 (diff) | |
download | external_mesa3d-8fc542aa8904339c52a4aec0ebaf42f498ba6ae8.zip external_mesa3d-8fc542aa8904339c52a4aec0ebaf42f498ba6ae8.tar.gz external_mesa3d-8fc542aa8904339c52a4aec0ebaf42f498ba6ae8.tar.bz2 |
gallium/u_pstipple: add ability to specify a fixed texture unit
E.g. r600g can use slot 17, which is outside of the API range.
Reviewed-by: Glenn Kennard <glenn.kennard@gmail.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/auxiliary/util/u_pstipple.c | 25 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_pstipple.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/softpipe/sp_state_shader.c | 2 |
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 |