summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2014-10-30 19:13:57 -0600
committerBrian Paul <[email protected]>2014-10-31 15:29:59 -0600
commitccd1ea9d52bc7fd11d9f05dc23ae7289fd0b9a99 (patch)
tree2ca58e6898ad77622c0a47813f9ddf7d5ad78371 /src
parente3ecb8206ac4cd50bbcd27fafa578a11b0b9f11a (diff)
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/util/u_pstipple.c28
-rw-r--r--src/gallium/auxiliary/util/u_pstipple.h5
-rw-r--r--src/gallium/drivers/softpipe/sp_state_shader.c33
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;
}