<div dir="auto">All GL calls that might use libX11 must not be asynchronous within glthread.<div dir="auto"><br></div><div dir="auto">Marek</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Apr 18, 2017 10:43 AM, "Gregory Hainaut" <<a href="mailto:gregory.hainaut@gmail.com">gregory.hainaut@gmail.com</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello Michel,<br>
<br>
As yes, I completely forgot about XInitThreads that must be it. I<br>
don't know how Nvidia manage to solve/force it. Anyway, I will fix my<br>
application.<br>
<br>
Thanks you for the info.<br>
<div class="elided-text"><br>
On 4/18/17, Michel Dänzer <<a href="mailto:michel@daenzer.net">michel@daenzer.net</a>> wrote:<br>
> On 18/04/17 05:04 PM, gregory hainaut wrote:<br>
>> On Tue, 18 Apr 2017 08:51:24 +0200<br>
>> gregory hainaut <<a href="mailto:gregory.hainaut@gmail.com">gregory.hainaut@gmail.com</a>> wrote:<br>
>><br>
>>> On Mon, 17 Apr 2017 11:17:42 +0900<br>
>>> Michel Dänzer <<a href="mailto:michel@daenzer.net">michel@daenzer.net</a>> wrote:<br>
>>><br>
>>>> On 15/04/17 05:08 PM, gregory hainaut wrote:<br>
>>>>> On Sat, 15 Apr 2017 00:50:15 +0200<br>
>>>>> Dieter Nützel <<a href="mailto:Dieter@nuetzel-hh.de">Dieter@nuetzel-hh.de</a>> wrote:<br>
>>>>><br>
>>>>>> Am 14.04.2017 07:53, schrieb gregory hainaut:<br>
>>>>>>> On Fri, 14 Apr 2017 05:20:38 +0200<br>
>>>>>>> Dieter Nützel <<a href="mailto:Dieter@nuetzel-hh.de">Dieter@nuetzel-hh.de</a>> wrote:<br>
>>>>>>><br>
>>>>>>>> Am 14.04.2017 02:06, schrieb Dieter Nützel:<br>
>>>>>>>>> Hello Gregory,<br>
>>>>>>>>><br>
>>>>>>>>> have you tested this with Mesa-demos/tests/pbo 'b' (benchmark)?<br>
>>>>>>>>> It result in crazy numbers and do not 'return' (one core stays @<br>
>>>>>>>>> 100%).<br>
>>>>>>>><br>
>>>>>>>> This is related to 'mesa_glthread=true'.<br>
>>>>>>>> If I disable (unset) it, all is fine after 'b' benchmark and 'pbo'<br>
>>>>>>>> exit<br>
>>>>>>>> with ESC as expeted.<br>
>>>>>>>> Crazy numbers stay, maybe counter overrun due to BIG numbers? ;-)<br>
>>>>>>>><br>
>>>>>>>> Hope that helps.<br>
>>>>>>>><br>
>>>>>>>> Dieter<br>
>>>>>>><br>
>>>>>>> Hello Dieter,<br>
>>>>>>><br>
>>>>>>> I tested the demo. There is a pseudo unrelated bug on the exit of<br>
>>>>>>> the<br>
>>>>>>> application.<br>
>>>>>>><br>
>>>>>>> Mesa 17.1.0-devel implementation error: In _mesa_DeleteHashTable,<br>
>>>>>>> found non-freed data<br>
>>>>>>><br>
>>>>>>> I will add a call to a _mesa_HashDeleteAll to fix it.<br>
>>>>>>> i.e. _mesa_HashDeleteAll(shared-><wbr>ShadowBufferObjects, dummy_cb,<br>
>>>>>>> ctx);<br>
>>>>>>><br>
>>>>>>> Now let's go back to the test behavior. The benchmarks will send 4s<br>
>>>>>>> of<br>
>>>>>>> asynchronous PBO transfer commands. And then will sync gl_thread<br>
>>>>>>> which<br>
>>>>>>> mean the application thread will be blocked until all PBO transfers<br>
>>>>>>> are<br>
>>>>>>> done. Gl_thread is faster to dispatch command so you will need to<br>
>>>>>>> wait<br>
>>>>>>> more before the thread goes back to real life.<br>
>>>>>>><br>
>>>>>>> On my side, I need to wait around 45 seconds for 6 millions of<br>
>>>>>>> commands.<br>
>>>>>>> Result:  6,440,627 reads (gl thread on + PBO patches)<br>
>>>>>>> Result:    274,960 reads (gl thread off)<br>
>>>>>>><br>
>>>>>>> In your case, "Result:  77,444,412 reads", I hope you're patient.<br>
>>>>>>> I think you must wait at least 10 minutes.<br>
>>>>>><br>
>>>>>> Now, I was patient...<br>
>>>>>> Tried 2 times but after ~20 minutes I've killed it at first and<br>
>>>>>> attached<br>
>>>>>> gdb at it during second run.<br>
>>>>>><br>
>>>>>> 0x00007fbda686e9a6 in pthread_cond_wait@@GLIBC_2.3.2 () from<br>
>>>>>> /lib64/libpthread.so.0<br>
>>>>>> (gdb) bt<br>
>>>>>> #0  0x00007fbda686e9a6 in pthread_cond_wait@@GLIBC_2.3.2 () from<br>
>>>>>> /lib64/libpthread.so.0<br>
>>>>>> #1  0x00007fbda5359453 in ?? () from /usr/local/lib/dri/r600_dri.so<br>
>>>>>> #2  0x00007fbda53661f4 in ?? () from /usr/local/lib/dri/r600_dri.so<br>
>>>>>> #3  0x0000000000401e18 in ?? ()<br>
>>>>>> #4  0x00000000004028c7 in ?? ()<br>
>>>>>> #5  0x00007fbda9925781 in fghRedrawWindow () from<br>
>>>>>> /usr/lib64/libglut.so.3<br>
>>>>>> #6  0x00007fbda9925c08 in ?? () from /usr/lib64/libglut.so.3<br>
>>>>>> #7  0x00007fbda9926cf9 in fgEnumWindows () from<br>
>>>>>> /usr/lib64/libglut.so.3<br>
>>>>>> #8  0x00007fbda9925ce4 in glutMainLoopEvent () from<br>
>>>>>> /usr/lib64/libglut.so.3<br>
>>>>>> #9  0x00007fbda9925d85 in glutMainLoop () from<br>
>>>>>> /usr/lib64/libglut.so.3<br>
>>>>>> #10 0x00000000004019fc in ?? ()<br>
>>>>>> #11 0x00007fbda957e541 in __libc_start_main () from /lib64/libc.so.6<br>
>>>>>> #12 0x0000000000401afa in ?? ()<br>
>>>>>><br>
>>>>>> Should I do more or not worth it?<br>
>>>>>><br>
>>>>>> Dieter<br>
>>>>><br>
>>>>> Hello Dieter,<br>
>>>>><br>
>>>>> To be honest, I don't konw how much time you need to wait. 77 millions<br>
>>>>> of<br>
>>>>> PBO transfer is quite huge. It depends on CPU/Memory/PCIe/VRAM/GPU<br>
>>>>> speed.<br>
>>>>><br>
>>>>> Hum based on the image size (194*188*4), you need to approximately<br>
>>>>> transfer<br>
>>>>> 10522 GB of data from your GPU... Which is likely around 20 minutes if<br>
>>>>> PCIe run at full speed. Honestly I will let the application in<br>
>>>>> background<br>
>>>>> for a couple of hours.<br>
>>>><br>
>>>> Basically, the application needs to be fixed not to emit an unlimited<br>
>>>> number of PBO transfers without doing anything which requires<br>
>>>> synchronizing to the transfers.<br>
>>>><br>
>>>><br>
>>><br>
>>> Hello Michel, Timothy, Marek<br>
>>><br>
>>> Yes, I think it should limit the number of transfer to a million. And<br>
>>> also uses fence to measure the PBO transfer.<br>
>>><br>
>>><br>
>>> However, I have found others crashes on PCSX2 with those patches. It<br>
>>> seems related to synchronization issue with GLX/DRI/X11. This series<br>
>>> removes most of the gl sync for PCSX2. So any missing sync will trigger<br>
>>> a crash. Or I got a not obvious bug in my patches.<br>
>>><br>
>>><br>
>>> Please find a backtrace below of a crash during a draw. I manage to get a<br>
>>> similar backtrace (i.e.<br>
>>> same exception in _XReply/dequeue_pending_<wbr>request) when I call<br>
>>> XGetGeometry.<br>
>>><br>
>>><br>
>>> #4  0xf61ec777 in __GI___assert_fail (assertion=0xf6122099<br>
>>> "!xcb_xlib_unknown_req_in_deq"<wbr>, file=0xf6122067 "../../src/xcb_io.c",<br>
>>> line=179, function=0xf612248d <__PRETTY_FUNCTION__.14063><br>
>>> "dequeue_pending_request")<br>
>>>     at assert.c:101<br>
>>> #5  0xf60abbcd in dequeue_pending_request (dpy=<optimized out>,<br>
>>> req=<optimized out>) at ../../src/xcb_io.c:185<br>
>>> #6  0xf60aca17 in _XReply (dpy=0xe8fdde80, rep=0xcd46b910, extra=6,<br>
>>> discard=0) at ../../src/xcb_io.c:639<br>
>>> #7  0xf3bba8df in DRI2GetBuffersWithFormat (dpy=0xe8fdde80,<br>
>>> drawable=83886261, width=0xd8ba11e8, height=0xd8ba11ec,<br>
>>> attachments=0xcd46ba38, count=1, outCount=0xcd46ba24) at dri2.c:485<br>
>>> #8  0xf3bbac45 in dri2GetBuffersWithFormat (driDrawable=0xd8ba11d0,<br>
>>> width=0xd8ba11e8, height=0xd8ba11ec, attachments=0xcd46ba38, count=1,<br>
>>> out_count=0xcd46ba24, loaderPrivate=0xf225df10) at dri2_glx.c:894<br>
>>> #9  0xd555e121 in dri2_drawable_get_buffers (count=<synthetic pointer>,<br>
>>> atts=0xa15f8b20, drawable=0xa2e50a00) at dri2.c:285<br>
>>> #10 dri2_allocate_textures (ctx=0xd8b98810, drawable=0xa2e50a00,<br>
>>> statts=0xa15f8b20, statts_count=2) at dri2.c:480<br>
>>> #11 0xd5557bc0 in dri_st_framebuffer_validate (stctx=0x9df20900,<br>
>>> stfbi=0xa2e50a00, statts=0xa15f8b20, count=2, out=0xcd46bb80) at<br>
>>> dri_drawable.c:83<br>
>>> #12 0xd533ae8a in st_framebuffer_validate (stfb=stfb@entry=0xa15f8780,<br>
>>> st=st@entry=0x9df20900) at state_tracker/st_manager.c:189<br>
>>><br>
>>><br>
>>> I don't have any clue on the GLX/DRI/X11 interaction with OpenGL. If<br>
>>> someone have any idea, feel free to share :)<br>
>><br>
>> If it can help, here the backtrace from XGetGeometry which I can "easily"<br>
>> trigger. I<br>
>> only hit once the above trace. Note that above trace was inside glthread<br>
>> whereas<br>
>> XGetGeometry is from the application thread.<br>
>><br>
>> #4  0xf61ec777 in __GI___assert_fail (assertion=0xf6122099<br>
>> "!xcb_xlib_unknown_req_in_deq"<wbr>, file=0xf6122067 "../../src/xcb_io.c",<br>
>> line=179, function=0xf612248d <__PRETTY_FUNCTION__.14063><br>
>> "dequeue_pending_request")<br>
>>     at assert.c:101<br>
>> #5  0xf60abbcd in dequeue_pending_request (dpy=<optimized out>,<br>
>> req=<optimized out>) at ../../src/xcb_io.c:185<br>
>> #6  0xf60aca17 in _XReply (dpy=0x8ad3ca80, rep=0xd637b89c, extra=6,<br>
>> discard=1) at ../../src/xcb_io.c:639<br>
>> #7  0xf6090a9e in XGetGeometry (dpy=0x8ad3ca80, d=83886309,<br>
>> root=0xd637ba40, x=0xd637ba80, y=0xd637bac0, width=0xd637b980,<br>
>> height=0xd637b940, borderWidth=0xd637b9c0, depth=0xd637ba00) at<br>
>> ../../src/GetGeom.c:47<br>
>> #8  0xe5d868b8 in GSWndOGL::GetClientRect (this=0xd8a6509c) at<br>
>> ../plugins/GSdx/GSWndOGL.cpp:<wbr>219<br>
><br>
> So, unless the application made sure that XInitThreads was called before<br>
> any other libX11 APIs, and all libX11 API calls in the application and<br>
> in Mesa are guarded by XLockDisplay/XUnlockDisplay, this is invalid<br>
> libX11 API usage, and a crash is expected.<br>
><br>
> BTW, in addition to what I wrote in my other post, I think this boils<br>
> down to: Mesa can only call any libX11 APIs from the main thread, not<br>
> from the glthread.<br>
><br>
> In some cases, an alternative might be using XCB APIs directly instead<br>
> of libX11 APIs.<br>
><br>
><br>
> --<br>
> Earthling Michel Dänzer               |               <a href="http://www.amd.com" rel="noreferrer" target="_blank">http://www.amd.com</a><br>
> Libre software enthusiast             |             Mesa and X developer<br>
><br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</div></blockquote></div><br></div>