[Mesa-dev] [PATCH 06/12] anv/query: Move the available bits to the front

Lionel Landwerlin lionel.g.landwerlin at intel.com
Thu Mar 16 10:37:38 UTC 2017


It feels like using offsetof() would prevent surprises in case we change 
the order again.

On 16/03/17 00:03, Jason Ekstrand wrote:
> We're about to make slots variable-length and always having the
> available bits at the front makes certain operations substantially
> easier once we do that.
> ---
>   src/intel/vulkan/anv_private.h |  2 +-
>   src/intel/vulkan/genX_query.c  | 43 +++++++++++++++++-------------------------
>   2 files changed, 18 insertions(+), 27 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
> index 7682bfc..795fd24 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -1985,9 +1985,9 @@ struct anv_render_pass {
>   };
>   
>   struct anv_query_pool_slot {
> +   uint64_t available;
>      uint64_t begin;
>      uint64_t end;
> -   uint64_t available;
>   };
>   
>   struct anv_query_pool {
> diff --git a/src/intel/vulkan/genX_query.c b/src/intel/vulkan/genX_query.c
> index a311b4b..9338209 100644
> --- a/src/intel/vulkan/genX_query.c
> +++ b/src/intel/vulkan/genX_query.c
> @@ -232,21 +232,12 @@ void genX(CmdResetQueryPool)(
>      ANV_FROM_HANDLE(anv_query_pool, pool, queryPool);
>   
>      for (uint32_t i = 0; i < queryCount; i++) {
> -      switch (pool->type) {
> -      case VK_QUERY_TYPE_OCCLUSION:
> -      case VK_QUERY_TYPE_TIMESTAMP: {
> -         anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_DATA_IMM), sdm) {
> -            sdm.Address = (struct anv_address) {
> -               .bo = &pool->bo,
> -               .offset = (firstQuery + i) * sizeof(struct anv_query_pool_slot) +
> -                         offsetof(struct anv_query_pool_slot, available),
> -            };
> -            sdm.ImmediateData = 0;
> -         }
> -         break;
> -      }
> -      default:
> -         assert(!"Invalid query type");
> +      anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_DATA_IMM), sdm) {
> +         sdm.Address = (struct anv_address) {
> +            .bo = &pool->bo,
> +            .offset = (firstQuery + i) * sizeof(struct anv_query_pool_slot),
> +         };
> +         sdm.ImmediateData = 0;
>         }
>      }
>   }
> @@ -277,7 +268,7 @@ void genX(CmdBeginQuery)(
>      switch (pool->type) {
>      case VK_QUERY_TYPE_OCCLUSION:
>         emit_ps_depth_count(cmd_buffer, &pool->bo,
> -                          query * sizeof(struct anv_query_pool_slot));
> +                          query * sizeof(struct anv_query_pool_slot) + 8);
>         break;
>   
>      case VK_QUERY_TYPE_PIPELINE_STATISTICS:
> @@ -297,10 +288,10 @@ void genX(CmdEndQuery)(
>      switch (pool->type) {
>      case VK_QUERY_TYPE_OCCLUSION:
>         emit_ps_depth_count(cmd_buffer, &pool->bo,
> -                          query * sizeof(struct anv_query_pool_slot) + 8);
> +                          query * sizeof(struct anv_query_pool_slot) + 16);
>   
>         emit_query_availability(cmd_buffer, &pool->bo,
> -                              query * sizeof(struct anv_query_pool_slot) + 16);
> +                              query * sizeof(struct anv_query_pool_slot));
>         break;
>   
>      case VK_QUERY_TYPE_PIPELINE_STATISTICS:
> @@ -327,11 +318,11 @@ void genX(CmdWriteTimestamp)(
>      case VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT:
>         anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_REGISTER_MEM), srm) {
>            srm.RegisterAddress  = TIMESTAMP;
> -         srm.MemoryAddress    = (struct anv_address) { &pool->bo, offset };
> +         srm.MemoryAddress    = (struct anv_address) { &pool->bo, offset + 8 };
>         }
>         anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_REGISTER_MEM), srm) {
>            srm.RegisterAddress  = TIMESTAMP + 4;
> -         srm.MemoryAddress    = (struct anv_address) { &pool->bo, offset + 4 };
> +         srm.MemoryAddress    = (struct anv_address) { &pool->bo, offset + 12 };
>         }
>         break;
>   
> @@ -340,7 +331,7 @@ void genX(CmdWriteTimestamp)(
>         anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
>            pc.DestinationAddressType  = DAT_PPGTT;
>            pc.PostSyncOperation       = WriteTimestamp;
> -         pc.Address = (struct anv_address) { &pool->bo, offset };
> +         pc.Address = (struct anv_address) { &pool->bo, offset + 8 };
>   
>            if (GEN_GEN == 9 && cmd_buffer->device->info.gt == 4)
>               pc.CommandStreamerStallEnable = true;
> @@ -348,7 +339,7 @@ void genX(CmdWriteTimestamp)(
>         break;
>      }
>   
> -   emit_query_availability(cmd_buffer, &pool->bo, offset + 16);
> +   emit_query_availability(cmd_buffer, &pool->bo, offset);
>   }
>   
>   #if GEN_GEN > 7 || GEN_IS_HASWELL
> @@ -445,9 +436,9 @@ void genX(CmdCopyQueryPoolResults)(
>         switch (pool->type) {
>         case VK_QUERY_TYPE_OCCLUSION:
>            emit_load_alu_reg_u64(&cmd_buffer->batch,
> -                               CS_GPR(0), &pool->bo, slot_offset);
> +                               CS_GPR(0), &pool->bo, slot_offset + 8);
>            emit_load_alu_reg_u64(&cmd_buffer->batch,
> -                               CS_GPR(1), &pool->bo, slot_offset + 8);
> +                               CS_GPR(1), &pool->bo, slot_offset + 16);
>   
>            /* FIXME: We need to clamp the result for 32 bit. */
>   
> @@ -460,7 +451,7 @@ void genX(CmdCopyQueryPoolResults)(
>   
>         case VK_QUERY_TYPE_TIMESTAMP:
>            emit_load_alu_reg_u64(&cmd_buffer->batch,
> -                               CS_GPR(2), &pool->bo, slot_offset);
> +                               CS_GPR(2), &pool->bo, slot_offset + 8);
>            break;
>   
>         default:
> @@ -472,7 +463,7 @@ void genX(CmdCopyQueryPoolResults)(
>   
>         if (flags & VK_QUERY_RESULT_WITH_AVAILABILITY_BIT) {
>            emit_load_alu_reg_u64(&cmd_buffer->batch, CS_GPR(0),
> -                               &pool->bo, slot_offset + 16);
> +                               &pool->bo, slot_offset);
>            if (flags & VK_QUERY_RESULT_64_BIT)
>               store_query_result(&cmd_buffer->batch,
>                                  CS_GPR(0), buffer->bo, dst_offset + 8, flags);




More information about the mesa-dev mailing list