Does gbm_bo_map() implicitly synchronise?

Christian König christian.koenig at amd.com
Tue Jun 25 07:40:28 UTC 2024


Am 24.06.24 um 21:08 schrieb James Jones:
> FWIW, the NVIDIA binary driver's implementation of gbm_bo_map/unmap()
>
> 1) Don't do any synchronization against in-flight work. The assumption 
> is that if the content is going to be read, the API writing the data 
> has established that coherence. Likewise, if it's going to be written, 
> the API reading it afterwards does any invalidates or whatever are 
> needed for coherence.

That matches my assumption of what this function does, but is just the 
opposite of what Michel explained what it does.

Is it somewhere documented if gbm_bo_map() should wait for in-flight 
work or not?

Regards,
Christian.

>
> 2) We don't blit anything or format convert, because our GBM 
> implementation has no DMA engine access, and I'd like to keep it that 
> way. Setting up a DMA-capable driver instance is much more expensive 
> as far as runtime resources than setting up a simple allocator+mmap 
> driver, at least in our driver architecture. Our GBM map just does an 
> mmap(), and if it's not linear, you're not going to be able to 
> interpret the data unless you've read up on our tiling formats. I'm 
> aware this is different from Mesa, and no one has complained thus far. 
> If we were forced to fix it, I imagine we'd do something like ask a 
> shared engine in the kernel to do the blit on userspace's behalf, 
> which would probably be slow but save resources.
>
> Basically, don't use gbm_bo_map() for anything non-trivial on our 
> implementation. It's not the right tool for e.g., reading back or 
> populating OpenGL textures or X pixmaps. If you don't want to run on 
> the NV implementation, feel free to ignore this advice, but I'd still 
> suggest it's not the best tool for most jobs.
>
> Thanks,
> -James
>
> On 6/17/24 03:29, Pierre Ossman wrote:
>> On 17/06/2024 10:13, Christian König wrote:
>>>
>>> Let me try to clarify a couple of things:
>>>
>>> The DMA_BUF_IOCTL_SYNC function is to flush and invalidate caches so 
>>> that the GPU can see values written by the CPU and the CPU can see 
>>> values written by the GPU. But that IOCTL does *not* wait for any 
>>> async GPU operation to finish.
>>>
>>> If you want to wait for async GPU operations you either need to call 
>>> the OpenGL functions to read pixels or do a select() (or poll, epoll 
>>> etc...) call on the DMA-buf file descriptor.
>>>
>>
>> Thanks for the clarification!
>>
>> Just to avoid any uncertainty, are both of these things done 
>> implicitly by gbm_bo_map()/gbm_bo_unmap()?
>>
>> I did test adding those steps just in case, but unfortunately did not 
>> see an improvement. My order was:
>>
>> 1. gbm_bo_import(GBM_BO_USE_RENDERING)
>> 2. gbm_bo_get_fd()
>> 3. Wait for client to request displaying the buffer
>> 4. gbm_bo_map(GBM_BO_TRANSFER_READ)
>> 5. select(fd+1, &fds, NULL, NULL, NULL)
>> 6. ioctl(DMA_BUF_IOCTL_SYNC, &{ .flags = DMA_BUF_SYNC_START | 
>> DMA_BUF_SYNC_READ })
>> 7. pixman_blt()
>> 8. gbm_bo_unmap()
>>
>>> So if you want to do some rendering with OpenGL and then see the 
>>> result in a buffer memory mapping the correct sequence would be the 
>>> following:
>>>
>>> 1. Issue OpenGL rendering commands.
>>> 2. Call glFlush() to make sure the hw actually starts working on the 
>>> rendering.
>>> 3. Call select() on the DMA-buf file descriptor to wait for the 
>>> rendering to complete.
>>> 4. Use DMA_BUF_IOCTL_SYNC to make the rendering result CPU visible.
>>>
>>
>> What I want to do is implement the X server side of DRI3 in just CPU. 
>> It works for every application I've tested except gnome-shell.
>>
>> I would assume that 1. and 2. are supposed to be done by the X 
>> client, i.e. gnome-shell?
>>
>> What I need to be able to do is access the result of that, once the X 
>> client tries to draw using that GBM backed pixmap (e.g. using 
>> PresentPixmap).
>>
>> So far, we've only tested Intel GPUs, but we are setting up Nvidia 
>> and AMD GPUs at the moment. It will be interesting to see if the 
>> issue remains on those or not.
>>
>> Regards



More information about the mesa-dev mailing list