[Mesa-dev] [PATCH 1/2] radv: fix occlusion queries on VegaM
Bas Nieuwenhuizen
bas at basnieuwenhuizen.nl
Tue Jun 11 21:42:29 UTC 2019
So allowing disabled render backends without pre-setting them in the
reset procedure will break the OCCLUSION_QUERY packet. Luckily we
don't seem to use it for radv (yet?). Maybe find a way to comment that
somewhere?
Otherwise, r-b
On Tue, Jun 11, 2019 at 4:43 PM Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
>
> The number of render backends is 16 but the enabled mask is 0xaaaa.
>
> This fixes dEQP-VK.query_pool.* and dEQP-VK.multiview.*.
>
> Cc: 19.0 19.1 <mesa-stable at lists.freedesktop.org>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
> src/amd/vulkan/radv_query.c | 48 +++++++++++++++++++++----------------
> 1 file changed, 27 insertions(+), 21 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
> index ff9ceceb3ed..3bbd10cbb34 100644
> --- a/src/amd/vulkan/radv_query.c
> +++ b/src/amd/vulkan/radv_query.c
> @@ -40,18 +40,6 @@
> static const int pipelinestat_block_size = 11 * 8;
> static const unsigned pipeline_statistics_indices[] = {7, 6, 3, 4, 5, 2, 1, 0, 8, 9, 10};
>
> -static unsigned get_max_db(struct radv_device *device)
> -{
> - unsigned num_db = device->physical_device->rad_info.num_render_backends;
> - MAYBE_UNUSED unsigned rb_mask = device->physical_device->rad_info.enabled_rb_mask;
> -
> - /* Otherwise we need to change the query reset procedure */
> - assert(rb_mask == ((1ull << num_db) - 1));
> -
> - return num_db;
> -}
> -
> -
> static nir_ssa_def *nir_test_flag(nir_builder *b, nir_ssa_def *flags, uint32_t flag)
> {
> return nir_i2b(b, nir_iand(b, flags, nir_imm_int(b, flag)));
> @@ -108,12 +96,14 @@ build_occlusion_query_shader(struct radv_device *device) {
> * uint64_t dst_offset = dst_stride * global_id.x;
> * bool available = true;
> * for (int i = 0; i < db_count; ++i) {
> - * uint64_t start = src_buf[src_offset + 16 * i];
> - * uint64_t end = src_buf[src_offset + 16 * i + 8];
> - * if ((start & (1ull << 63)) && (end & (1ull << 63)))
> - * result += end - start;
> - * else
> - * available = false;
> + * if (enabled_rb_mask & (1 << i)) {
> + * uint64_t start = src_buf[src_offset + 16 * i];
> + * uint64_t end = src_buf[src_offset + 16 * i + 8];
> + * if ((start & (1ull << 63)) && (end & (1ull << 63)))
> + * result += end - start;
> + * else
> + * available = false;
> + * }
> * }
> * uint32_t elem_size = flags & VK_QUERY_RESULT_64_BIT ? 8 : 4;
> * if ((flags & VK_QUERY_RESULT_PARTIAL_BIT) || available) {
> @@ -139,7 +129,8 @@ build_occlusion_query_shader(struct radv_device *device) {
> nir_variable *start = nir_local_variable_create(b.impl, glsl_uint64_t_type(), "start");
> nir_variable *end = nir_local_variable_create(b.impl, glsl_uint64_t_type(), "end");
> nir_variable *available = nir_local_variable_create(b.impl, glsl_bool_type(), "available");
> - unsigned db_count = get_max_db(device);
> + unsigned enabled_rb_mask = device->physical_device->rad_info.enabled_rb_mask;
> + unsigned db_count = device->physical_device->rad_info.num_render_backends;
>
> nir_ssa_def *flags = radv_load_push_int(&b, 0, "flags");
>
> @@ -187,6 +178,16 @@ build_occlusion_query_shader(struct radv_device *device) {
> nir_ssa_def *current_outer_count = nir_load_var(&b, outer_counter);
> radv_break_on_count(&b, outer_counter, nir_imm_int(&b, db_count));
>
> + nir_ssa_def *enabled_cond =
> + nir_iand(&b, nir_imm_int(&b, enabled_rb_mask),
> + nir_ishl(&b, nir_imm_int(&b, 1), current_outer_count));
> +
> + nir_if *enabled_if = nir_if_create(b.shader);
> + enabled_if->condition = nir_src_for_ssa(nir_i2b(&b, enabled_cond));
> + nir_cf_node_insert(b.cursor, &enabled_if->cf_node);
> +
> + b.cursor = nir_after_cf_list(&enabled_if->then_list);
> +
> nir_ssa_def *load_offset = nir_imul(&b, current_outer_count, nir_imm_int(&b, 16));
> load_offset = nir_iadd(&b, input_base, load_offset);
>
> @@ -1042,7 +1043,7 @@ VkResult radv_CreateQueryPool(
>
> switch(pCreateInfo->queryType) {
> case VK_QUERY_TYPE_OCCLUSION:
> - pool->stride = 16 * get_max_db(device);
> + pool->stride = 16 * device->physical_device->rad_info.num_render_backends;
> break;
> case VK_QUERY_TYPE_PIPELINE_STATISTICS:
> pool->stride = pipelinestat_block_size * 2;
> @@ -1147,12 +1148,17 @@ VkResult radv_GetQueryPoolResults(
> }
> case VK_QUERY_TYPE_OCCLUSION: {
> volatile uint64_t const *src64 = (volatile uint64_t const *)src;
> + uint32_t db_count = device->physical_device->rad_info.num_render_backends;
> + uint32_t enabled_rb_mask = device->physical_device->rad_info.enabled_rb_mask;
> uint64_t sample_count = 0;
> - int db_count = get_max_db(device);
> available = 1;
>
> for (int i = 0; i < db_count; ++i) {
> uint64_t start, end;
> +
> + if (!(enabled_rb_mask & (1 << i)))
> + continue;
> +
> do {
> start = src64[2 * i];
> end = src64[2 * i + 1];
> --
> 2.22.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list