From: Nicolai Hähnle <nicolai.haeh...@amd.com>

VS with streamout is always a HW VS.
---
 src/gallium/drivers/radeonsi/si_state_shaders.c | 16 +++++++++++-----
 1 file 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 afa78eb..af19cfc 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -1730,40 +1730,42 @@ static int si_shader_select(struct pipe_context *ctx,
 {
        struct si_context *sctx = (struct si_context *)ctx;
        struct si_shader_key key;
 
        si_shader_selector_key(ctx, state->cso, &key);
        return si_shader_select_with_key(sctx->screen, state, compiler_state,
                                         &key, -1);
 }
 
 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];
 
        switch (info->processor) {
        case PIPE_SHADER_VERTEX:
                switch (next_shader) {
                case PIPE_SHADER_GEOMETRY:
                        key->as_es = 1;
                        break;
                case PIPE_SHADER_TESS_CTRL:
                case PIPE_SHADER_TESS_EVAL:
                        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;
 
        case PIPE_SHADER_TESS_EVAL:
                if (next_shader == PIPE_SHADER_GEOMETRY ||
                    !info->writes_position)
                        key->as_es = 1;
                break;
        }
@@ -1798,21 +1800,23 @@ void si_init_shader_selector_async(void *job, int 
thread_index)
        if (!sscreen->use_monolithic_shaders) {
                struct si_shader *shader = CALLOC_STRUCT(si_shader);
                void *tgsi_binary = NULL;
 
                if (!shader) {
                        fprintf(stderr, "radeonsi: can't allocate a main shader 
part\n");
                        return;
                }
 
                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);
 
                /* Try to load the shader from the shader cache. */
                mtx_lock(&sscreen->shader_cache_mutex);
 
                if (tgsi_binary &&
                    si_shader_cache_load_shader(sscreen, tgsi_binary, shader)) {
                        mtx_unlock(&sscreen->shader_cache_mutex);
@@ -1880,21 +1884,23 @@ void si_init_shader_selector_async(void *job, int 
thread_index)
                        }
                }
        }
 
        /* Pre-compilation. */
        if (sscreen->b.debug_flags & DBG_PRECOMPILE) {
                struct si_shader_ctx_state state = {sel};
                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.
                 */
                switch (sel->type) {
                case PIPE_SHADER_TESS_CTRL:
                        key.part.tcs.epilog.prim_mode = PIPE_PRIM_TRIANGLES;
                        break;
                case PIPE_SHADER_FRAGMENT:
                        key.part.ps.prolog.bc_optimize_for_persp =
-- 
2.9.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to