From ccd1ea9d52bc7fd11d9f05dc23ae7289fd0b9a99 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 30 Oct 2014 19:13:57 -0600 Subject: [PATCH] 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 --- src/gallium/auxiliary/util/u_pstipple.c | 28 +++++++--------- src/gallium/auxiliary/util/u_pstipple.h | 5 ++- .../drivers/softpipe/sp_state_shader.c | 33 +++++++++---------- 3 files changed, 28 insertions(+), 38 deletions(-) diff --git a/src/gallium/auxiliary/util/u_pstipple.c b/src/gallium/auxiliary/util/u_pstipple.c index 509f815c53a..5c6c8fc20aa 100644 --- a/src/gallium/auxiliary/util/u_pstipple.c +++ b/src/gallium/auxiliary/util/u_pstipple.c @@ -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; } diff --git a/src/gallium/auxiliary/util/u_pstipple.h b/src/gallium/auxiliary/util/u_pstipple.h index 6fbed80cc93..13155e7f5dc 100644 --- a/src/gallium/auxiliary/util/u_pstipple.h +++ b/src/gallium/auxiliary/util/u_pstipple.h @@ -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); diff --git a/src/gallium/drivers/softpipe/sp_state_shader.c b/src/gallium/drivers/softpipe/sp_state_shader.c index 93c547d2911..8d18ca98d4d 100644 --- a/src/gallium/drivers/softpipe/sp_state_shader.c +++ b/src/gallium/drivers/softpipe/sp_state_shader.c @@ -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; }