From fa74389485b705955fa3fb826fb508a7a21fd65f Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Tue, 19 Jan 2021 18:29:03 +0200 Subject: [PATCH] turnip: don't emit tess consts if they are not used If tess consts aren't used they don't get included in constlen, and we risk overrunning consts of the next stage. Fixes: dEQP-VK.tessellation.invariance.outer_edge_index_independence.quads_fractional_even_spacing_ccw dEQP-VK.tessellation.invariance.outer_triangle_set.quads_fractional_odd_spacing dEQP-VK.tessellation.invariance.primitive_set.isolines_fractional_odd_spacing_ccw dEQP-VK.tessellation.invariance.primitive_set.quads_fractional_odd_spacing_cw Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/4117 Signed-off-by: Danylo Piliaiev Part-of: --- .gitlab-ci/deqp-freedreno-a630-fails.txt | 4 --- .gitlab-ci/deqp-freedreno-a630-skips.txt | 3 ++ src/freedreno/vulkan/tu_cmd_buffer.c | 54 +++++++++++++++++++------------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/.gitlab-ci/deqp-freedreno-a630-fails.txt b/.gitlab-ci/deqp-freedreno-a630-fails.txt index 31fa5a8..fa763fc 100644 --- a/.gitlab-ci/deqp-freedreno-a630-fails.txt +++ b/.gitlab-ci/deqp-freedreno-a630-fails.txt @@ -38,7 +38,3 @@ dEQP-VK.spirv_assembly.instruction.graphics.opquantize.negative_too_small_tesse, dEQP-VK.spirv_assembly.instruction.graphics.opquantize.round_to_inf_tesse,Fail dEQP-VK.spirv_assembly.instruction.graphics.opquantize.spec_const_carry_to_exponent_tesse,Fail dEQP-VK.spirv_assembly.instruction.graphics.opquantize.spec_const_negative_round_up_or_round_down_tesse,Fail -dEQP-VK.tessellation.invariance.outer_edge_index_independence.quads_fractional_even_spacing_ccw,Fail -dEQP-VK.tessellation.invariance.outer_triangle_set.quads_fractional_odd_spacing,Fail -dEQP-VK.tessellation.invariance.primitive_set.isolines_fractional_odd_spacing_ccw,Fail -dEQP-VK.tessellation.invariance.primitive_set.quads_fractional_odd_spacing_cw,Fail diff --git a/.gitlab-ci/deqp-freedreno-a630-skips.txt b/.gitlab-ci/deqp-freedreno-a630-skips.txt index c222d2c..cb45101 100644 --- a/.gitlab-ci/deqp-freedreno-a630-skips.txt +++ b/.gitlab-ci/deqp-freedreno-a630-skips.txt @@ -26,3 +26,6 @@ dEQP-VK.geometry.layered.cube_array.64_64_12.readback # Crashes likely caused by https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/2701 dEQP-VK.synchronization.cross_instance.*binary_semaphore_fence_fd + +# Timeouts, passes otherwise +dEQP-VK.tessellation.invariance.outer_triangle_set.quads_fractional_odd_spacing diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index 8e07f82..2c3be12 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -3182,10 +3182,18 @@ tu6_emit_tess_consts(struct tu_cmd_buffer *cmd, if (result != VK_SUCCESS) return result; + const struct tu_program_descriptor_linkage *hs_link = + &pipeline->program.link[MESA_SHADER_TESS_CTRL]; + bool hs_uses_bo = pipeline->tess.hs_bo_regid < hs_link->constlen; + + const struct tu_program_descriptor_linkage *ds_link = + &pipeline->program.link[MESA_SHADER_TESS_EVAL]; + bool ds_uses_bo = pipeline->tess.ds_bo_regid < ds_link->constlen; + uint64_t tess_factor_size = get_tess_factor_bo_size(pipeline, draw_count); uint64_t tess_param_size = get_tess_param_bo_size(pipeline, draw_count); uint64_t tess_bo_size = tess_factor_size + tess_param_size; - if (tess_bo_size > 0) { + if ((hs_uses_bo || ds_uses_bo) && tess_bo_size > 0) { struct tu_bo *tess_bo; result = tu_get_scratch_bo(cmd->device, tess_bo_size, &tess_bo); if (result != VK_SUCCESS) @@ -3194,27 +3202,31 @@ tu6_emit_tess_consts(struct tu_cmd_buffer *cmd, uint64_t tess_factor_iova = tess_bo->iova; uint64_t tess_param_iova = tess_factor_iova + tess_factor_size; - tu_cs_emit_pkt7(&cs, CP_LOAD_STATE6_GEOM, 3 + 4); - tu_cs_emit(&cs, CP_LOAD_STATE6_0_DST_OFF(pipeline->tess.hs_bo_regid) | - CP_LOAD_STATE6_0_STATE_TYPE(ST6_CONSTANTS) | - CP_LOAD_STATE6_0_STATE_SRC(SS6_DIRECT) | - CP_LOAD_STATE6_0_STATE_BLOCK(SB6_HS_SHADER) | - CP_LOAD_STATE6_0_NUM_UNIT(1)); - tu_cs_emit(&cs, CP_LOAD_STATE6_1_EXT_SRC_ADDR(0)); - tu_cs_emit(&cs, CP_LOAD_STATE6_2_EXT_SRC_ADDR_HI(0)); - tu_cs_emit_qw(&cs, tess_param_iova); - tu_cs_emit_qw(&cs, tess_factor_iova); + if (hs_uses_bo) { + tu_cs_emit_pkt7(&cs, CP_LOAD_STATE6_GEOM, 3 + 4); + tu_cs_emit(&cs, CP_LOAD_STATE6_0_DST_OFF(pipeline->tess.hs_bo_regid) | + CP_LOAD_STATE6_0_STATE_TYPE(ST6_CONSTANTS) | + CP_LOAD_STATE6_0_STATE_SRC(SS6_DIRECT) | + CP_LOAD_STATE6_0_STATE_BLOCK(SB6_HS_SHADER) | + CP_LOAD_STATE6_0_NUM_UNIT(1)); + tu_cs_emit(&cs, CP_LOAD_STATE6_1_EXT_SRC_ADDR(0)); + tu_cs_emit(&cs, CP_LOAD_STATE6_2_EXT_SRC_ADDR_HI(0)); + tu_cs_emit_qw(&cs, tess_param_iova); + tu_cs_emit_qw(&cs, tess_factor_iova); + } - tu_cs_emit_pkt7(&cs, CP_LOAD_STATE6_GEOM, 3 + 4); - tu_cs_emit(&cs, CP_LOAD_STATE6_0_DST_OFF(pipeline->tess.ds_bo_regid) | - CP_LOAD_STATE6_0_STATE_TYPE(ST6_CONSTANTS) | - CP_LOAD_STATE6_0_STATE_SRC(SS6_DIRECT) | - CP_LOAD_STATE6_0_STATE_BLOCK(SB6_DS_SHADER) | - CP_LOAD_STATE6_0_NUM_UNIT(1)); - tu_cs_emit(&cs, CP_LOAD_STATE6_1_EXT_SRC_ADDR(0)); - tu_cs_emit(&cs, CP_LOAD_STATE6_2_EXT_SRC_ADDR_HI(0)); - tu_cs_emit_qw(&cs, tess_param_iova); - tu_cs_emit_qw(&cs, tess_factor_iova); + if (ds_uses_bo) { + tu_cs_emit_pkt7(&cs, CP_LOAD_STATE6_GEOM, 3 + 4); + tu_cs_emit(&cs, CP_LOAD_STATE6_0_DST_OFF(pipeline->tess.ds_bo_regid) | + CP_LOAD_STATE6_0_STATE_TYPE(ST6_CONSTANTS) | + CP_LOAD_STATE6_0_STATE_SRC(SS6_DIRECT) | + CP_LOAD_STATE6_0_STATE_BLOCK(SB6_DS_SHADER) | + CP_LOAD_STATE6_0_NUM_UNIT(1)); + tu_cs_emit(&cs, CP_LOAD_STATE6_1_EXT_SRC_ADDR(0)); + tu_cs_emit(&cs, CP_LOAD_STATE6_2_EXT_SRC_ADDR_HI(0)); + tu_cs_emit_qw(&cs, tess_param_iova); + tu_cs_emit_qw(&cs, tess_factor_iova); + } *factor_iova = tess_factor_iova; } -- 2.7.4