From 1cefda7cb4cdaf9a8bd7aba600403ac7040f1d27 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 6 Apr 2022 17:25:14 +0200 Subject: [PATCH] dzn: Fix exec_buf_stride calculation The stride depends on the indirect draw arguments which are different if triangle-fan emulation is required. Reviewed-by: Jesse Natalie Part-of: --- src/microsoft/vulkan/dzn_cmd_buffer.c | 5 ++++- src/microsoft/vulkan/dzn_nir.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c b/src/microsoft/vulkan/dzn_cmd_buffer.c index cb50daad21d..3a4d4841255 100644 --- a/src/microsoft/vulkan/dzn_cmd_buffer.c +++ b/src/microsoft/vulkan/dzn_cmd_buffer.c @@ -2785,10 +2785,13 @@ dzn_cmd_buffer_indirect_draw(struct dzn_cmd_buffer *cmdbuf, assert((draw_buf_stride & 3) == 0); uint32_t sysvals_stride = ALIGN_POT(sizeof(cmdbuf->state.sysvals.gfx), 256); - uint32_t exec_buf_stride = 32; uint32_t triangle_fan_index_buf_stride = dzn_cmd_buffer_triangle_fan_get_max_index_buf_size(cmdbuf, indexed) * sizeof(uint32_t); + uint32_t exec_buf_stride = + triangle_fan_index_buf_stride > 0 ? + sizeof(struct dzn_indirect_triangle_fan_draw_exec_params) : + sizeof(struct dzn_indirect_draw_exec_params); uint32_t triangle_fan_exec_buf_stride = sizeof(struct dzn_indirect_triangle_fan_rewrite_index_exec_params); ID3D12Resource *exec_buf; diff --git a/src/microsoft/vulkan/dzn_nir.c b/src/microsoft/vulkan/dzn_nir.c index d432731eb84..da626bcdc35 100644 --- a/src/microsoft/vulkan/dzn_nir.c +++ b/src/microsoft/vulkan/dzn_nir.c @@ -129,7 +129,10 @@ dzn_nir_indirect_draw_shader(enum dzn_indirect_draw_type type) .align_mul = 4, .align_offset = 0, .range_base = 0, .range = ~0); nir_ssa_def *draw_stride = nir_channel(&b, params, 0); - nir_ssa_def *exec_stride = nir_imm_int(&b, sizeof(struct dzn_indirect_draw_exec_params)); + nir_ssa_def *exec_stride = + triangle_fan ? + nir_imm_int(&b, sizeof(struct dzn_indirect_triangle_fan_draw_exec_params)) : + nir_imm_int(&b, sizeof(struct dzn_indirect_draw_exec_params)); nir_ssa_def *index = nir_channel(&b, nir_load_global_invocation_id(&b, 32), 0);