[Mesa-dev] Proper implemtation of glFinish
Francisco Jerez
currojerez at riseup.net
Mon Jan 3 13:50:50 PST 2011
Bob Gleitsmann <rjgleits at bellsouth.net> writes:
> Hello everyone,
>
> When trying the demo program copytex for the first time recently, I noticed
> pathological behavior: after running for a long time it asserted out and
> locked up X. Investigation showed this to be due to the glFinish function
> acting like glFlush and not waiting as it is supposed to for completion of
> whatever commands had been issued. I took up the task of remedying this.
Thank you for having a look at this, I've been meaning to fix it for a while.
> There are, as usual, a variety of different ways of doing so. Influenced by
> the current gallium code, I planned a separate call to the kernel to wait
> for the fence created by the pushbuf flush ioctl to complete. After
> completing the implementation in this way, it occurred to me that it would
> be more economical to modify the pushbuf flush ioctl call with a flag to
> indicate whether it should wait for completion or not. This would require
> modifying the FIRE_RING inline which appears in numerous places. Perhaps my
> original plan is adequate. The code changes required for the original plan
> involve mesa, drm, and the kernel.
ATM the nouveau DRM API doesn't let you wait on a fence (it doesn't even have
the concept of "fence"), instead, you're supposed to wait for a specific
buffer using the CPU_PREP IOCTL. I think the simplest way to get nouveau an
implementation of the screen fence stuff would be something like:
| struct nouveau_fence {
| struct nouveau_bo *bo;
| boolean signalled;
| }
IOW, a fence would just hold a reference to a buffer object being rendered to
when the fence was created. nouveau_screen_fence_finish() would call
nouveau_bo_map()/unmap() with the BO as argument to make sure the fenced
rendering has landed. The BO selection process would look a bit like
r300_finish() and it could be done from nvfx/nv50_context.c.
> This forum seems like the best starting point to solicit feedback, since the
> whole thing is motivated by mesa. The Xorg nouveau driver does not seem to
> need anything of this nature. I have tested on my current hardware, x86-64
> dual opteron and 7300 GT card.
>
> The assert out noted in the beginning was due to timeout in the
> __nouveau_fence_wait function in the kernel. Unfortunately, it does not exit
> gracefully. The patches that I came up with eliminate the timeout in the case
> of copytex, but this is clearly a flaw that someday should have a more complete
> fix.
Perhaps, it sounds like the kernel is just misdetecting a lockup in this
case. Does it actually hang if you remove that timeout completely?
> Please let me know if I should send the kernel and drm patches to another
> forum (like dri-devel). For now I will post them here.
>
> Best Wishes,
>
> Bob
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 229 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110103/9901e367/attachment.pgp>
More information about the mesa-dev
mailing list