radeonsi: skip generic out/in indices without a shader IO index
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 10 May 2017 11:26:39 +0000 (13:26 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 12 May 2017 08:46:05 +0000 (10:46 +0200)
OpenGL uses at most 32 generic outputs/inputs in any stage, and they always
have a shader IO index and therefore fit into the outputs_written/
inputs_read/kill_outputs fields.

However, Nine uses semantic indices more liberally. We support that
in VS-PS pipelines, except that the optimization of killing outputs
must be skipped.

Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_state_shaders.c

index bdc9cc10fab39630d329f1ae8978244e2b54b7b4..98292867c8db16dd93f793975cc937e0a6ad46a0 100644 (file)
@@ -2293,6 +2293,10 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
                case TGSI_SEMANTIC_EDGEFLAG:
                        break;
                case TGSI_SEMANTIC_GENERIC:
+                       /* don't process indices the function can't handle */
+                       if (semantic_index >= SI_MAX_IO_GENERIC)
+                               break;
+                       /* fall through */
                case TGSI_SEMANTIC_CLIPDIST:
                        if (shader->key.opt.hw_vs.kill_outputs &
                            (1ull << si_shader_io_get_unique_index(semantic_name, semantic_index)))
index 8193fe041dd1aaa54de827b8a34ec40239197659..6020bec9c0f26485304770945c0fbadbb9966449 100644 (file)
@@ -2032,8 +2032,12 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
                        unsigned index = sel->info.input_semantic_index[i];
 
                        switch (name) {
-                       case TGSI_SEMANTIC_CLIPDIST:
                        case TGSI_SEMANTIC_GENERIC:
+                               /* don't process indices the function can't handle */
+                               if (index >= SI_MAX_IO_GENERIC)
+                                       break;
+                               /* fall through */
+                       case TGSI_SEMANTIC_CLIPDIST:
                                sel->inputs_read |=
                                        1llu << si_shader_io_get_unique_index(name, index);
                                break;