From 042c135a9934c78a0c3bc2d6fb0d64ce3284b43c Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Wed, 21 Sep 2022 13:46:27 +0200 Subject: [PATCH] tu: Fix param_stride placement Even though it's tessellation-related, it's set based on the tessellation variant which is only known after linking. The param stride may change due to LTO if fast linking is not used. Fixes: e9f5de11d40 ("tu: Initial implementation of VK_EXT_graphics_pipeline_library") Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.c | 2 +- src/freedreno/vulkan/tu_pipeline.c | 5 ++++- src/freedreno/vulkan/tu_pipeline.h | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index 073c70f3f1e..062f9253a43 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -2566,7 +2566,7 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer, /* maximum number of patches that can fit in tess factor/param buffers */ uint32_t subdraw_size = MIN2(TU_TESS_FACTOR_SIZE / ir3_tess_factor_stride(pipeline->tess.patch_type), - TU_TESS_PARAM_SIZE / pipeline->tess.param_stride); + TU_TESS_PARAM_SIZE / pipeline->program.hs_param_stride); /* convert from # of patches to draw count */ subdraw_size *= pipeline->tess.patch_control_points; diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index 9b00058cbc7..eaacc374733 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -3858,6 +3858,10 @@ tu_pipeline_builder_parse_shader_stages(struct tu_pipeline_builder *builder, &builder->const_state[i], builder->variants[i]); } + + struct ir3_shader_variant *hs = builder->variants[MESA_SHADER_TESS_CTRL]; + if (hs) + pipeline->program.hs_param_stride = hs->output_size * 4; } static bool @@ -3975,7 +3979,6 @@ tu_pipeline_builder_parse_tessellation(struct tu_pipeline_builder *builder, pipeline->tess.upper_left_domain_origin = !domain_info || domain_info->domainOrigin == VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT; const struct ir3_shader_variant *hs = builder->variants[MESA_SHADER_TESS_CTRL]; - pipeline->tess.param_stride = hs->output_size * 4; } static void diff --git a/src/freedreno/vulkan/tu_pipeline.h b/src/freedreno/vulkan/tu_pipeline.h index 332d36110dc..507f111246c 100644 --- a/src/freedreno/vulkan/tu_pipeline.h +++ b/src/freedreno/vulkan/tu_pipeline.h @@ -205,6 +205,8 @@ struct tu_pipeline struct tu_draw_state binning_state; struct tu_program_descriptor_linkage link[MESA_SHADER_STAGES]; + + uint32_t hs_param_stride; } program; struct @@ -217,7 +219,6 @@ struct tu_pipeline { uint32_t patch_type; uint32_t patch_control_points; - uint32_t param_stride; bool upper_left_domain_origin; } tess;