diff options
author | Dave Airlie <[email protected]> | 2017-06-20 13:21:04 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2017-06-26 08:45:30 +1000 |
commit | 6a68170c8360d702a25e59740d04f79a4f8323a7 (patch) | |
tree | 64fbdaf11d2657331de0e29746a774f0e0e5aab6 /src/amd/vulkan/radv_pipeline.c | |
parent | 2a87ddbdcb3129606f237d4eedf9cad588b5b4d9 (diff) |
radv: handle primitive id input into fragment shader with no geom shader
Fixes:
dEQP-VK.pipeline.framebuffer_attachment.no_attachments
dEQP-VK.pipeline.framebuffer_attachment.no_attachments_ms
Reviewed-by: Kenneth Graunke <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/amd/vulkan/radv_pipeline.c')
-rw-r--r-- | src/amd/vulkan/radv_pipeline.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index e58ada68cc9..0c262799f0c 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -605,11 +605,14 @@ radv_pipeline_compile(struct radv_pipeline *pipeline, } static union ac_shader_variant_key -radv_compute_tes_key(bool as_es) +radv_compute_tes_key(bool as_es, bool export_prim_id) { union ac_shader_variant_key key; memset(&key, 0, sizeof(key)); key.tes.as_es = as_es; + /* export prim id only happens when no geom shader */ + if (!as_es) + key.tes.export_prim_id = export_prim_id; return key; } @@ -640,10 +643,12 @@ radv_tess_pipeline_compile(struct radv_pipeline *pipeline, nir_shader *tes_nir, *tcs_nir; void *tes_code = NULL, *tcs_code = NULL; unsigned tes_code_size = 0, tcs_code_size = 0; - union ac_shader_variant_key tes_key = radv_compute_tes_key(radv_pipeline_has_gs(pipeline)); + union ac_shader_variant_key tes_key; union ac_shader_variant_key tcs_key; bool dump = (pipeline->device->debug_flags & RADV_DEBUG_DUMP_SHADERS); + tes_key = radv_compute_tes_key(radv_pipeline_has_gs(pipeline), + pipeline->shaders[MESA_SHADER_FRAGMENT]->info.fs.prim_id_input); if (tes_module->nir) _mesa_sha1_compute(tes_module->nir->info.name, strlen(tes_module->nir->info.name), @@ -1606,7 +1611,7 @@ radv_pipeline_init_dynamic_state(struct radv_pipeline *pipeline, } static union ac_shader_variant_key -radv_compute_vs_key(const VkGraphicsPipelineCreateInfo *pCreateInfo, bool as_es, bool as_ls) +radv_compute_vs_key(const VkGraphicsPipelineCreateInfo *pCreateInfo, bool as_es, bool as_ls, bool export_prim_id) { union ac_shader_variant_key key; const VkPipelineVertexInputStateCreateInfo *input_state = @@ -1616,6 +1621,7 @@ radv_compute_vs_key(const VkGraphicsPipelineCreateInfo *pCreateInfo, bool as_es, key.vs.instance_rate_inputs = 0; key.vs.as_es = as_es; key.vs.as_ls = as_ls; + key.vs.export_prim_id = export_prim_id; for (unsigned i = 0; i < input_state->vertexAttributeDescriptionCount; ++i) { unsigned binding; @@ -1857,6 +1863,24 @@ static uint32_t si_vgt_gs_mode(struct radv_shader_variant *gs) S_028A40_GS_WRITE_OPTIMIZE(1); } +static void calculate_vgt_gs_mode(struct radv_pipeline *pipeline) +{ + struct radv_shader_variant *vs; + vs = radv_pipeline_has_gs(pipeline) ? pipeline->gs_copy_shader : (radv_pipeline_has_tess(pipeline) ? pipeline->shaders[MESA_SHADER_TESS_EVAL] : pipeline->shaders[MESA_SHADER_VERTEX]); + + struct ac_vs_output_info *outinfo = &vs->info.vs.outinfo; + + pipeline->graphics.vgt_primitiveid_en = false; + pipeline->graphics.vgt_gs_mode = 0; + + if (radv_pipeline_has_gs(pipeline)) { + pipeline->graphics.vgt_gs_mode = si_vgt_gs_mode(pipeline->shaders[MESA_SHADER_GEOMETRY]); + } else if (outinfo->export_prim_id) { + pipeline->graphics.vgt_gs_mode = S_028A40_MODE(V_028A40_GS_SCENARIO_A); + pipeline->graphics.vgt_primitiveid_en = true; + } +} + static void calculate_pa_cl_vs_out_cntl(struct radv_pipeline *pipeline) { struct radv_shader_variant *vs; @@ -2018,11 +2042,14 @@ radv_pipeline_init(struct radv_pipeline *pipeline, if (modules[MESA_SHADER_VERTEX]) { bool as_es = false; bool as_ls = false; + bool export_prim_id = false; if (modules[MESA_SHADER_TESS_CTRL]) as_ls = true; else if (modules[MESA_SHADER_GEOMETRY]) as_es = true; - union ac_shader_variant_key key = radv_compute_vs_key(pCreateInfo, as_es, as_ls); + else if (pipeline->shaders[MESA_SHADER_FRAGMENT]->info.fs.prim_id_input) + export_prim_id = true; + union ac_shader_variant_key key = radv_compute_vs_key(pCreateInfo, as_es, as_ls, export_prim_id); pipeline->shaders[MESA_SHADER_VERTEX] = radv_pipeline_compile(pipeline, cache, modules[MESA_SHADER_VERTEX], @@ -2035,7 +2062,7 @@ radv_pipeline_init(struct radv_pipeline *pipeline, } if (modules[MESA_SHADER_GEOMETRY]) { - union ac_shader_variant_key key = radv_compute_vs_key(pCreateInfo, false, false); + union ac_shader_variant_key key = radv_compute_vs_key(pCreateInfo, false, false, false); pipeline->shaders[MESA_SHADER_GEOMETRY] = radv_pipeline_compile(pipeline, cache, modules[MESA_SHADER_GEOMETRY], @@ -2045,10 +2072,7 @@ radv_pipeline_init(struct radv_pipeline *pipeline, pipeline->layout, &key); pipeline->active_stages |= mesa_to_vk_shader_stage(MESA_SHADER_GEOMETRY); - - pipeline->graphics.vgt_gs_mode = si_vgt_gs_mode(pipeline->shaders[MESA_SHADER_GEOMETRY]); - } else - pipeline->graphics.vgt_gs_mode = 0; + } if (modules[MESA_SHADER_TESS_EVAL]) { assert(modules[MESA_SHADER_TESS_CTRL]); @@ -2130,6 +2154,7 @@ radv_pipeline_init(struct radv_pipeline *pipeline, ps->info.fs.writes_z ? V_028710_SPI_SHADER_32_R : V_028710_SPI_SHADER_ZERO; + calculate_vgt_gs_mode(pipeline); calculate_pa_cl_vs_out_cntl(pipeline); calculate_ps_inputs(pipeline); |