Re: [Mesa-dev] [PATCH] radv: Fix multiview queries.

2018-05-14 Thread Samuel Pitoiset



On 05/13/2018 10:07 PM, Bas Nieuwenhuizen wrote:

This moves the extra queries to after the main query ended, instead
of doing it after the begin and hence doing nesting.

We also emit only (view count - 1) extra queries, as the main query
is already there for the first view.

This fixes the CTS occasiionally getting stuck in


occasionally.

Those tests don't stuck for me and I run CTS really often, maybe I was 
just lucky.


Anyway,

Reviewed-by: Samuel Pitoiset 


dEQP-VK.multiview.queries* waiting on results.

Fixes: 32b4f3c38dc "radv/query: handle multiview queries properly. (v3)"
C: 18.1 
---
  src/amd/vulkan/radv_query.c | 39 +++--
  1 file changed, 20 insertions(+), 19 deletions(-)

diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
index 2b2e80f4e5b..3749e2f43d1 100644
--- a/src/amd/vulkan/radv_query.c
+++ b/src/amd/vulkan/radv_query.c
@@ -1204,25 +1204,6 @@ void radv_CmdBeginQuery(
va += pool->stride * query;
  
  	emit_begin_query(cmd_buffer, va, pool->type, flags);

-
-   /*
-* For multiview we have to emit a query for each bit in the mask,
-* however the first query we emit will get the totals for all the
-* operations, so we don't want to get a real value in the other
-* queries. This emits a fake begin/end sequence so the waiting
-* code gets a completed query value and doesn't hang, but the
-* query returns 0.
-*/
-   if (cmd_buffer->state.subpass && cmd_buffer->state.subpass->view_mask) {
-   uint64_t avail_va = va + pool->availability_offset + 4 * query;
-
-   for (unsigned i = 0; i < 
util_bitcount(cmd_buffer->state.subpass->view_mask); i++) {
-   va += pool->stride;
-   avail_va += 4;
-   emit_begin_query(cmd_buffer, va, pool->type, flags);
-   emit_end_query(cmd_buffer, va, avail_va, pool->type);
-   }
-   }
  }
  
  
@@ -1241,6 +1222,26 @@ void radv_CmdEndQuery(

 * currently be active, which means the BO is already in the list.
 */
emit_end_query(cmd_buffer, va, avail_va, pool->type);
+
+   /*
+* For multiview we have to emit a query for each bit in the mask,
+* however the first query we emit will get the totals for all the
+* operations, so we don't want to get a real value in the other
+* queries. This emits a fake begin/end sequence so the waiting
+* code gets a completed query value and doesn't hang, but the
+* query returns 0.
+*/
+   if (cmd_buffer->state.subpass && cmd_buffer->state.subpass->view_mask) {
+   uint64_t avail_va = va + pool->availability_offset + 4 * query;
+
+
+   for (unsigned i = 1; i < 
util_bitcount(cmd_buffer->state.subpass->view_mask); i++) {
+   va += pool->stride;
+   avail_va += 4;
+   emit_begin_query(cmd_buffer, va, pool->type, 0);
+   emit_end_query(cmd_buffer, va, avail_va, pool->type);
+   }
+   }
  }
  
  void radv_CmdWriteTimestamp(



___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] radv: Fix multiview queries.

2018-05-13 Thread Dave Airlie
On 14 May 2018 at 06:07, Bas Nieuwenhuizen  wrote:
> This moves the extra queries to after the main query ended, instead
> of doing it after the begin and hence doing nesting.
>
> We also emit only (view count - 1) extra queries, as the main query
> is already there for the first view.
>
> This fixes the CTS occasiionally getting stuck in
> dEQP-VK.multiview.queries* waiting on results.
>
> Fixes: 32b4f3c38dc "radv/query: handle multiview queries properly. (v3)"
> C: 18.1 

Seems sane:

Reviewed-by: Dave Airlie 

> ---
>  src/amd/vulkan/radv_query.c | 39 +++--
>  1 file changed, 20 insertions(+), 19 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
> index 2b2e80f4e5b..3749e2f43d1 100644
> --- a/src/amd/vulkan/radv_query.c
> +++ b/src/amd/vulkan/radv_query.c
> @@ -1204,25 +1204,6 @@ void radv_CmdBeginQuery(
> va += pool->stride * query;
>
> emit_begin_query(cmd_buffer, va, pool->type, flags);
> -
> -   /*
> -* For multiview we have to emit a query for each bit in the mask,
> -* however the first query we emit will get the totals for all the
> -* operations, so we don't want to get a real value in the other
> -* queries. This emits a fake begin/end sequence so the waiting
> -* code gets a completed query value and doesn't hang, but the
> -* query returns 0.
> -*/
> -   if (cmd_buffer->state.subpass && 
> cmd_buffer->state.subpass->view_mask) {
> -   uint64_t avail_va = va + pool->availability_offset + 4 * 
> query;
> -
> -   for (unsigned i = 0; i < 
> util_bitcount(cmd_buffer->state.subpass->view_mask); i++) {
> -   va += pool->stride;
> -   avail_va += 4;
> -   emit_begin_query(cmd_buffer, va, pool->type, flags);
> -   emit_end_query(cmd_buffer, va, avail_va, pool->type);
> -   }
> -   }
>  }
>
>
> @@ -1241,6 +1222,26 @@ void radv_CmdEndQuery(
>  * currently be active, which means the BO is already in the list.
>  */
> emit_end_query(cmd_buffer, va, avail_va, pool->type);
> +
> +   /*
> +* For multiview we have to emit a query for each bit in the mask,
> +* however the first query we emit will get the totals for all the
> +* operations, so we don't want to get a real value in the other
> +* queries. This emits a fake begin/end sequence so the waiting
> +* code gets a completed query value and doesn't hang, but the
> +* query returns 0.
> +*/
> +   if (cmd_buffer->state.subpass && 
> cmd_buffer->state.subpass->view_mask) {
> +   uint64_t avail_va = va + pool->availability_offset + 4 * 
> query;
> +
> +
> +   for (unsigned i = 1; i < 
> util_bitcount(cmd_buffer->state.subpass->view_mask); i++) {
> +   va += pool->stride;
> +   avail_va += 4;
> +   emit_begin_query(cmd_buffer, va, pool->type, 0);
> +   emit_end_query(cmd_buffer, va, avail_va, pool->type);
> +   }
> +   }
>  }
>
>  void radv_CmdWriteTimestamp(
> --
> 2.17.0
>
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] radv: Fix multiview queries.

2018-05-13 Thread Bas Nieuwenhuizen
This moves the extra queries to after the main query ended, instead
of doing it after the begin and hence doing nesting.

We also emit only (view count - 1) extra queries, as the main query
is already there for the first view.

This fixes the CTS occasiionally getting stuck in
dEQP-VK.multiview.queries* waiting on results.

Fixes: 32b4f3c38dc "radv/query: handle multiview queries properly. (v3)"
C: 18.1 
---
 src/amd/vulkan/radv_query.c | 39 +++--
 1 file changed, 20 insertions(+), 19 deletions(-)

diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
index 2b2e80f4e5b..3749e2f43d1 100644
--- a/src/amd/vulkan/radv_query.c
+++ b/src/amd/vulkan/radv_query.c
@@ -1204,25 +1204,6 @@ void radv_CmdBeginQuery(
va += pool->stride * query;
 
emit_begin_query(cmd_buffer, va, pool->type, flags);
-
-   /*
-* For multiview we have to emit a query for each bit in the mask,
-* however the first query we emit will get the totals for all the
-* operations, so we don't want to get a real value in the other
-* queries. This emits a fake begin/end sequence so the waiting
-* code gets a completed query value and doesn't hang, but the
-* query returns 0.
-*/
-   if (cmd_buffer->state.subpass && cmd_buffer->state.subpass->view_mask) {
-   uint64_t avail_va = va + pool->availability_offset + 4 * query;
-
-   for (unsigned i = 0; i < 
util_bitcount(cmd_buffer->state.subpass->view_mask); i++) {
-   va += pool->stride;
-   avail_va += 4;
-   emit_begin_query(cmd_buffer, va, pool->type, flags);
-   emit_end_query(cmd_buffer, va, avail_va, pool->type);
-   }
-   }
 }
 
 
@@ -1241,6 +1222,26 @@ void radv_CmdEndQuery(
 * currently be active, which means the BO is already in the list.
 */
emit_end_query(cmd_buffer, va, avail_va, pool->type);
+
+   /*
+* For multiview we have to emit a query for each bit in the mask,
+* however the first query we emit will get the totals for all the
+* operations, so we don't want to get a real value in the other
+* queries. This emits a fake begin/end sequence so the waiting
+* code gets a completed query value and doesn't hang, but the
+* query returns 0.
+*/
+   if (cmd_buffer->state.subpass && cmd_buffer->state.subpass->view_mask) {
+   uint64_t avail_va = va + pool->availability_offset + 4 * query;
+
+
+   for (unsigned i = 1; i < 
util_bitcount(cmd_buffer->state.subpass->view_mask); i++) {
+   va += pool->stride;
+   avail_va += 4;
+   emit_begin_query(cmd_buffer, va, pool->type, 0);
+   emit_end_query(cmd_buffer, va, avail_va, pool->type);
+   }
+   }
 }
 
 void radv_CmdWriteTimestamp(
-- 
2.17.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev