util: simplify util_pstipple_create_fragment_shader() params

Pass and return tgsi_token buffers instead of pipe_shader_state.

And update softpipe driver (the only user of this function).

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
Brian Paul 2014-10-30 19:13:57 -06:00
parent e3ecb8206a
commit ccd1ea9d52
3 changed files with 28 additions and 38 deletions

View File

@ -398,23 +398,19 @@ pstip_transform_inst(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
*/
struct pipe_shader_state *
util_pstipple_create_fragment_shader(struct pipe_context *pipe,
struct pipe_shader_state *fs,
struct tgsi_token *
util_pstipple_create_fragment_shader(const struct tgsi_token *tokens,
unsigned *samplerUnitOut)
{
struct pipe_shader_state *new_fs;
struct pstip_transform_context transform;
const uint newLen = tgsi_num_tokens(fs->tokens) + NUM_NEW_TOKENS;
const uint newLen = tgsi_num_tokens(tokens) + NUM_NEW_TOKENS;
struct tgsi_token *new_tokens;
new_fs = MALLOC(sizeof(*new_fs));
if (!new_fs)
return NULL;
new_fs->tokens = tgsi_alloc_tokens(newLen);
if (!new_fs->tokens) {
FREE(new_fs);
new_tokens = tgsi_alloc_tokens(newLen);
if (!new_tokens) {
return NULL;
}
@ -430,14 +426,12 @@ util_pstipple_create_fragment_shader(struct pipe_context *pipe,
transform.base.transform_declaration = pstip_transform_decl;
transform.base.transform_immediate = pstip_transform_immed;
tgsi_scan_shader(fs->tokens, &transform.info);
tgsi_scan_shader(tokens, &transform.info);
transform.coordOrigin =
transform.info.properties[TGSI_PROPERTY_FS_COORD_ORIGIN];
tgsi_transform_shader(fs->tokens,
(struct tgsi_token *) new_fs->tokens,
newLen, &transform.base);
tgsi_transform_shader(tokens, new_tokens, newLen, &transform.base);
#if 0 /* DEBUG */
tgsi_dump(fs->tokens, 0);
@ -447,6 +441,6 @@ util_pstipple_create_fragment_shader(struct pipe_context *pipe,
assert(transform.freeSampler < PIPE_MAX_SAMPLERS);
*samplerUnitOut = transform.freeSampler;
return new_fs;
return new_tokens;
}

View File

@ -47,9 +47,8 @@ util_pstipple_create_sampler_view(struct pipe_context *pipe,
extern void *
util_pstipple_create_sampler(struct pipe_context *pipe);
extern struct pipe_shader_state *
util_pstipple_create_fragment_shader(struct pipe_context *pipe,
struct pipe_shader_state *fs,
struct tgsi_token *
util_pstipple_create_fragment_shader(const struct tgsi_token *tokens,
unsigned *samplerUnitOut);

View File

@ -51,25 +51,27 @@ create_fs_variant(struct softpipe_context *softpipe,
const struct sp_fragment_shader_variant_key *key)
{
struct sp_fragment_shader_variant *var;
struct pipe_shader_state *stipple_fs = NULL, *curfs = &fs->shader;
unsigned unit = 0;
#if DO_PSTIPPLE_IN_HELPER_MODULE
if (key->polygon_stipple) {
/* get new shader that implements polygon stippling */
stipple_fs = util_pstipple_create_fragment_shader(&softpipe->pipe,
curfs, &unit);
curfs = stipple_fs;
}
#endif
struct pipe_shader_state *curfs = &fs->shader;
/* codegen, create variant object */
var = softpipe_create_fs_variant_exec(softpipe);
if (var) {
var->key = *key;
var->tokens = tgsi_dup_tokens(curfs->tokens);
var->stipple_sampler_unit = unit;
#if DO_PSTIPPLE_IN_HELPER_MODULE
if (key->polygon_stipple) {
/* get new shader that implements polygon stippling */
var->tokens =
util_pstipple_create_fragment_shader(curfs->tokens,
&var->stipple_sampler_unit);
}
else
#endif
{
var->tokens = tgsi_dup_tokens(curfs->tokens);
var->stipple_sampler_unit = 0;
}
tgsi_scan_shader(var->tokens, &var->info);
@ -90,11 +92,6 @@ create_fs_variant(struct softpipe_context *softpipe,
fs->variants = var;
}
if (stipple_fs) {
FREE((void *) stipple_fs->tokens);
FREE(stipple_fs);
}
return var;
}