radeonsi: tweak next-shader assumptions when streamout is used
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sun, 25 Jun 2017 17:01:13 +0000 (19:01 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 31 Jul 2017 12:55:43 +0000 (14:55 +0200)
VS with streamout is always a HW VS.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_state_shaders.c

index 8a795c0faefe17f9f5e50ba7912647642314ee70..daf4af5b28bd76e1600aabad8d0a4ae07b74c6ce 100644 (file)
@@ -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.