<div dir="ltr"><div><div><div>Ilia, thanks for the gallium link.<br></div>Do you know any links to high level info with broad strokes about how this sync works? Frankly I do not know driver terminology and wanted to know more about how this sync is performed for my research. I'm using mesa as a reference because it has open implementation code. Occlusion query functionality probably waits for z-buffer to become ready. Problem is that usual synchronization techniques do not apply here. I'm thinking that driver code gets notifications about state change. I want to know what kind of notifications are available? Can query be performed in parallel with another frame being processed or does it need complete GPU pipeline flush?<br><br></div>Thanks,<br></div>Vyacheslav<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 6, 2015 at 8:32 PM, Ilia Mirkin <span dir="ltr"><<a href="mailto:imirkin@alum.mit.edu" target="_blank">imirkin@alum.mit.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Mon, Jul 6, 2015 at 11:29 AM, Vyacheslav Gonakhchyan<br>
<<a href="mailto:ytriffy@gmail.com">ytriffy@gmail.com</a>> wrote:<br>
> Hi, everyone.<br>
><br>
> Trying to understand method radeonQueryGetResult (more broadly GPU-CPU<br>
> sync).<br>
><br>
> static void radeonQueryGetResult(struct gl_context *ctx, struct<br>
> gl_query_object *q)<br>
> {<br>
>     struct radeon_query_object *query = (struct radeon_query_object *)q;<br>
>         uint32_t *result;<br>
>     int i;<br>
><br>
>     radeon_print(RADEON_STATE, RADEON_VERBOSE,<br>
>             "%s: query id %d, result %d\n",<br>
>             __func__, query->Base.Id, (int) query->Base.Result);<br>
><br>
>     radeon_bo_map(query->bo, GL_FALSE);<br>
>         result = query->bo->ptr;<br>
><br>
>     query->Base.Result = 0;<br>
>     for (i = 0; i < query->curr_offset/sizeof(uint32_t); ++i) {<br>
>         query->Base.Result += LE32_TO_CPU(result[i]);<br>
>         radeon_print(RADEON_STATE, RADEON_TRACE, "result[%d] = %d\n", i,<br>
> LE32_TO_CPU(result[i]));<br>
>     }<br>
><br>
>     radeon_bo_unmap(query->bo);<br>
> }<br>
><br>
> I don't know which part is responsible for blocking behavior (waiting for<br>
> response from GPU). I suspect that radeon_bo_map does this magic.<br>
> Can someone point in the right direction?<br>
<br>
</div></div>The radeon_bo_map defined in<br>
src/gallium/winsys/radeon/drm/radeon_drm_bo.c indeed has this magic.<br>
However the code in src/mesa/drivers/dri/radeon/radeon_queryobj.c<br>
references the radeon_bo_map in libdrm, which does not appear to wait.<br>
<br>
FWIW for nouveau, nouveau_bo_map will also implicitly do a<br>
nouveau_bo_wait, but that does not appear to be the case for radeon.<br>
<br>
Cheers,<br>
<br>
  -ilia<br>
</blockquote></div><br></div>