[Mesa-dev] Fwd: GPU-CPU sync during radeonQueryGetResult

Ilia Mirkin imirkin at alum.mit.edu
Mon Jul 6 09:32:16 PDT 2015


On Mon, Jul 6, 2015 at 11:29 AM, Vyacheslav Gonakhchyan
<ytriffy at gmail.com> wrote:
> Hi, everyone.
>
> Trying to understand method radeonQueryGetResult (more broadly GPU-CPU
> sync).
>
> static void radeonQueryGetResult(struct gl_context *ctx, struct
> gl_query_object *q)
> {
>     struct radeon_query_object *query = (struct radeon_query_object *)q;
>         uint32_t *result;
>     int i;
>
>     radeon_print(RADEON_STATE, RADEON_VERBOSE,
>             "%s: query id %d, result %d\n",
>             __func__, query->Base.Id, (int) query->Base.Result);
>
>     radeon_bo_map(query->bo, GL_FALSE);
>         result = query->bo->ptr;
>
>     query->Base.Result = 0;
>     for (i = 0; i < query->curr_offset/sizeof(uint32_t); ++i) {
>         query->Base.Result += LE32_TO_CPU(result[i]);
>         radeon_print(RADEON_STATE, RADEON_TRACE, "result[%d] = %d\n", i,
> LE32_TO_CPU(result[i]));
>     }
>
>     radeon_bo_unmap(query->bo);
> }
>
> I don't know which part is responsible for blocking behavior (waiting for
> response from GPU). I suspect that radeon_bo_map does this magic.
> Can someone point in the right direction?

The radeon_bo_map defined in
src/gallium/winsys/radeon/drm/radeon_drm_bo.c indeed has this magic.
However the code in src/mesa/drivers/dri/radeon/radeon_queryobj.c
references the radeon_bo_map in libdrm, which does not appear to wait.

FWIW for nouveau, nouveau_bo_map will also implicitly do a
nouveau_bo_wait, but that does not appear to be the case for radeon.

Cheers,

  -ilia


More information about the mesa-dev mailing list