Revert "ac/shader: gather If TES reads TESSINNER or TESSOUTER"
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 15 Jan 2018 12:47:18 +0000 (13:47 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 15 Jan 2018 12:47:18 +0000 (13:47 +0100)
This can't work for two reasons:
- TESSINNER/TESSOUTER are shader input values, so never translated
to the intrinsic ops
- the shader info pass scans the current stage but we want to know
in TCS, if TES reads the tess factors.

This fixes 6 regressions related to
deqp-vk/tessellation/shader_input_output/tess_level_{inner,outer}_XXX_tes

This reverts commit 5ba1a61648e2dea96f621a5886ad8b937a471ab4.

src/amd/common/ac_nir_to_llvm.c
src/amd/common/ac_nir_to_llvm.h
src/amd/common/ac_shader_info.c
src/amd/common/ac_shader_info.h
src/amd/vulkan/radv_pipeline.c

index d4c24342d7b7b73cdfc73699b116ae8a6ac0faea..20340395434feef2d6d6cbcb387c5f3b37b58c20 100644 (file)
@@ -6310,7 +6310,7 @@ write_tess_factors(struct nir_to_llvm_context *ctx)
                                            16 + tf_offset, 1, 0, true, false);
 
        //store to offchip for TES to read - only if TES reads them
-       if (ctx->shader_info->info.tes.reads_tess_factors) {
+       if (ctx->options->key.tcs.tes_reads_tess_factors) {
                LLVMValueRef inner_vec, outer_vec, tf_outer_offset;
                LLVMValueRef tf_inner_offset;
                unsigned param_outer, param_inner;
index 70cecd6a624baf0f5d3bc11d7ae768de473be8c0..1737866166ea7e0d23a5000afc0132f08553ca10 100644 (file)
@@ -55,6 +55,7 @@ struct ac_tcs_variant_key {
        struct ac_vs_variant_key vs_key;
        unsigned primitive_mode;
        unsigned input_vertices;
+       uint32_t tes_reads_tess_factors:1;
 };
 
 struct ac_fs_variant_key {
index 7261261850512ce78d611b5e3479e7641c7ca26a..5716ec043d56c14d7fd55535cf1bc74df7aab97f 100644 (file)
@@ -106,10 +106,6 @@ gather_intrinsic_info(const nir_intrinsic_instr *instr,
                mark_sampler_desc(instr->variables[0]->var, info);
                break;
        }
-       case nir_intrinsic_load_tess_level_inner:
-       case nir_intrinsic_load_tess_level_outer:
-               info->tes.reads_tess_factors = true;
-               break;
        default:
                break;
        }
index fbafeb9f0e75f349664e4addf304d7c7a3e2c319..2be61679fc71121c6db91c3ab251fa89987bdbd5 100644 (file)
@@ -49,9 +49,6 @@ struct ac_shader_info {
                bool uses_thread_id[3];
                bool uses_local_invocation_idx;
        } cs;
-       struct {
-               bool reads_tess_factors;
-       } tes;
 };
 
 /* A NIR pass to gather all the info needed to optimise the allocation patterns
index 0bb1cd9dff3fc02fe056be1605248cfe2372247d..c3c17af8500d60ab1c7ef033cd44a7582c1aba95 100644 (file)
@@ -1759,6 +1759,8 @@ radv_fill_shader_keys(struct ac_shader_variant_key *keys,
                keys[MESA_SHADER_VERTEX].vs.as_ls = true;
                keys[MESA_SHADER_TESS_CTRL].tcs.input_vertices = key->tess_input_vertices;
                keys[MESA_SHADER_TESS_CTRL].tcs.primitive_mode = nir[MESA_SHADER_TESS_EVAL]->info.tess.primitive_mode;
+
+               keys[MESA_SHADER_TESS_CTRL].tcs.tes_reads_tess_factors = !!(nir[MESA_SHADER_TESS_EVAL]->info.inputs_read & (VARYING_BIT_TESS_LEVEL_INNER | VARYING_BIT_TESS_LEVEL_OUTER));
        }
 
        if (nir[MESA_SHADER_GEOMETRY]) {