diff options
author | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2017-06-25 19:01:13 +0200 |
---|---|---|
committer | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2017-07-31 14:55:43 +0200 |
commit | 25ff22e390d645a7df8e641d0b17cf6fbf551976 (patch) | |
tree | 0e3355d483d9b3f4bbb193f3cc7229c5e1cfc411 | |
parent | a69afb68c9a54b475dd2f2588c6c54676b43f9dd (diff) |
radeonsi: tweak next-shader assumptions when streamout is used
VS with streamout is always a HW VS.
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_shaders.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 8a795c0fae..daf4af5b28 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -1740,6 +1740,7 @@ static int si_shader_select(struct pipe_context *ctx, } static void si_parse_next_shader_property(const struct tgsi_shader_info *info, + bool streamout, struct si_shader_key *key) { unsigned next_shader = info->properties[TGSI_PROPERTY_NEXT_SHADER]; @@ -1755,11 +1756,12 @@ static void si_parse_next_shader_property(const struct tgsi_shader_info *info, key->as_ls = 1; break; default: - /* If POSITION isn't written, it can't be a HW VS. - * Assume that it's a HW LS. (the next shader is TCS) + /* If POSITION isn't written, it can only be a HW VS + * if streamout is used. If streamout isn't used, + * assume that it's a HW LS. (the next shader is TCS) * This heuristic is needed for separate shader objects. */ - if (!info->writes_position) + if (!info->writes_position && !streamout) key->as_ls = 1; } break; @@ -1808,7 +1810,9 @@ void si_init_shader_selector_async(void *job, int thread_index) } shader->selector = sel; - si_parse_next_shader_property(&sel->info, &shader->key); + si_parse_next_shader_property(&sel->info, + sel->so.num_outputs != 0, + &shader->key); if (sel->tokens) tgsi_binary = si_get_tgsi_binary(sel); @@ -1890,7 +1894,9 @@ void si_init_shader_selector_async(void *job, int thread_index) struct si_shader_key key; memset(&key, 0, sizeof(key)); - si_parse_next_shader_property(&sel->info, &key); + si_parse_next_shader_property(&sel->info, + sel->so.num_outputs != 0, + &key); /* Set reasonable defaults, so that the shader key doesn't * cause any code to be eliminated. |