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

Michel Dänzer michel at daenzer.net
Mon Jul 6 20:07:41 PDT 2015


On 07.07.2015 01:32, Ilia Mirkin wrote:
> 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.

It does, see radeon_bo_gem.c:bo_map():

wait:
    boi->ptr = bo_gem->priv_ptr;
    r = bo_wait(boi);


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer


More information about the mesa-dev mailing list