<div dir="auto">FWIW, I think this series can land, because glthread is not enabled by default, and the libX11 issue is unrelated.<div dir="auto"><br></div><div dir="auto">Marek<div dir="auto"><div dir="auto"><br><div class="gmail_extra"><br><div class="gmail_quote">On Apr 21, 2017 4:22 AM, "Michel Dänzer" <<a href="mailto:michel@daenzer.net">michel@daenzer.net</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="elided-text">On 21/04/17 09:01 AM, Marek Olšák wrote:<br>
> On Thu, Apr 20, 2017 at 9:44 PM, gregory hainaut<br>
> <<a href="mailto:gregory.hainaut@gmail.com">gregory.hainaut@gmail.com</a>> wrote:<br>
>> On Thu, 20 Apr 2017 20:01:00 +0200<br>
>> Marek Olšák <<a href="mailto:maraeo@gmail.com">maraeo@gmail.com</a>> wrote:<br>
>><br>
>>> On Thu, Apr 20, 2017 at 6:53 PM, gregory hainaut<br>
>>> <<a href="mailto:gregory.hainaut@gmail.com">gregory.hainaut@gmail.com</a>> wrote:<br>
>>>> On Thu, 20 Apr 2017 11:57:08 +0200<br>
>>>> Marek Olšák <<a href="mailto:maraeo@gmail.com">maraeo@gmail.com</a>> wrote:<br>
>>>><br>
>>>>> On Thu, Apr 20, 2017 at 10:28 AM, gregory hainaut<br>
>>>>> <<a href="mailto:gregory.hainaut@gmail.com">gregory.hainaut@gmail.com</a>> wrote:<br>
>>>>>> On Thu, 20 Apr 2017 12:29:11 +0900<br>
>>>>>> Michel Dänzer <<a href="mailto:michel@daenzer.net">michel@daenzer.net</a>> wrote:<br>
>>>>>><br>
>>>>>>> On 20/04/17 01:54 AM, Gregory Hainaut wrote:<br>
>>>>>>>> Hello,<br>
>>>>>>>><br>
>>>>>>>> Please find the latest version that include a small fix for hash deletion. I<br>
>>>>>>>> think the series is good now. Please review/ack it.<br>
>>>>>>><br>
>>>>>>> I'm afraid I have to NACK it. As discussed in the v4 cover letter<br>
>>>>>>> thread, Mesa's glthread cannot make any libX11 API calls.<br>
>>>>>>><br>
>>>>>>><br>
>>>>>><br>
>>>>>> Hello Michel,<br>
>>>>>><br>
>>>>>> Just to be sure we are on the same line, let's me do a summary.<br>
>>>>>><br>
>>>>>> PCSX2 does the following bad pattern<br>
>>>>>> 1/ no call to XInitThread<br>
>>>>>> 2/ XGetGeometry to get the size of the surface<br>
>>>>>> 3/ glDrawArray into the default framebuffer 0 (the window, I'm not sure how to call it)<br>
>>>>>>    => which seem to call DRI2GetBuffersWithFormat under the hood. I guess to get the<br>
>>>>>>       associated buffer of the window.<br>
>>>>>><br>
>>>>>><br>
>>>>>> So far it was (kind of) working fine because PCSX2 does tons of PBO transfer. So glthread<br>
>>>>>> was mostly synchronous.<br>
>>>>>><br>
>>>>>> This series removes the (useless) PBO transfer synchronization. So now glthread is really<br>
>>>>>> asynchronous and the above bad pattern crash as expected.<br>
>>>>>><br>
>>>>>> I didn't add any libX11 API call on the patches. And I don't think we can remvove the DRI stuff.<br>
>>>>>><br>
>>>>>> Hum, I don't know what will be the impact on the perf but potentially we can force a synchronization<br>
>>>>>> when there is a draw to framebuffer 0.<br>
>>>>><br>
>>>>> Can you send us the backtrace when DRI2GetBuffersWithFormat is called<br>
>>>>> by glDrawArrays?<br>
>>>>><br>
>>>>> Marek<br>
>>>><br>
>>>> Hello Marek, Michel,<br>
>>>><br>
>>>> Here the full backtrace.<br>
>>>><br>
>>>> #0  DRI2GetBuffersWithFormat (dpy=0xc6307e48, drawable=104857784, width=0xdef348c0, height=0xdef348c4, attachments=0xdcc15c88, count=1, outCount=0xdcc15c74) at dri2.c:464<br>
>>>> #1  0xf05bac45 in dri2GetBuffersWithFormat (driDrawable=0xdef348a8, width=0xdef348c0, height=0xdef348c4, attachments=0xdcc15c88, count=1, out_count=0xdcc15c74, loaderPrivate=0xdefc6ef0) at dri2_glx.c:894<br>
>>>> #2  0xe3ec3111 in dri2_drawable_get_buffers (count=<synthetic pointer>, atts=0xdef252f8, drawable=0xdefc7b08) at dri2.c:285<br>
>>>> #3  dri2_allocate_textures (ctx=0xdef15928, drawable=0xdefc7b08, statts=0xdef252f8, statts_count=2) at dri2.c:480<br>
>>>> #4  0xe3ebcbb0 in dri_st_framebuffer_validate (stctx=0xdef4ab10, stfbi=0xdefc7b08, statts=0xdef252f8, count=2, out=0xdcc15d78) at dri_drawable.c:83<br>
>>>> #5  0xe3d37afc in st_framebuffer_validate (stfb=stfb@entry=0xdef24f58, st=st@entry=0xdef4ab10) at state_tracker/st_manager.c:189<br>
>>>>     Note "print stfb->Base->Name" give me 0<br>
>>>> #6  0xe3d38649 in st_manager_validate_<wbr>framebuffers (st=0xdef4ab10) at state_tracker/st_manager.c:869<br>
>>>> #7  0xe3cd0580 in st_validate_state (st=0xdef4ab10, pipeline=ST_PIPELINE_RENDER) at state_tracker/st_atom.c:174<br>
>>>> #8  0xe3cf935d in st_draw_vbo (ctx=0xdef7f8f8, prims=0xdcc15f40, nr_prims=1, ib=0x0, index_bounds_valid=1 '\001', min_index=39911, max_index=39914, tfb_vertcount=0x0, stream=0, indirect=0x0) at state_tracker/st_draw.c:191<br>
>>>> #9  0xe3caf35e in vbo_draw_arrays (baseInstance=0, numInstances=1, count=4, start=39911, mode=5, ctx=0xdef7f8f8) at vbo/vbo_exec_array.c:427<br>
>>>> #10 vbo_exec_DrawArrays (mode=5, start=39911, count=4) at vbo/vbo_exec_array.c:575<br>
>>>> #11 0xe3be4f07 in _mesa_unmarshal_DrawArrays (ctx=0xdef7f8f8, cmd=0xc41574b0) at main/marshal_generated.c:26644<br>
>>>> #12 _mesa_unmarshal_dispatch_cmd (ctx=0xdef7f8f8, cmd=0xc41574b0) at main/marshal_generated.c:42457<br>
>>>> #13 0xe3ba8af0 in glthread_unmarshal_batch (release_batch=true, batch=0xc4157410, ctx=0xdef7f8f8) at main/glthread.c:64<br>
>>>> #14 glthread_worker (data=0xdef7f8f8) at main/glthread.c:110<br>
>>>><br>
>>>><br>
>>>>> If this DRI2GetBuffersWithFormat call results in libX11 API calls on the<br>
>>>>> glthread, that's a bug which needs to be fixed, either by moving the<br>
>>>>> DRI2GetBuffersWithFormat call to the main thread or (if possible) by<br>
>>>>> changing DRI2GetBuffersWithFormat to use XCB directly.<br>
>>><br>
>>> First, we need to understand why it's happening. Does the app use the<br>
>>> front buffer? Does it ever call glDrawBuffer(GL_FRONT) or<br>
>>> glReadBuffer(GL_FRONT)?<br>
>><br>
>> Hello Marek,<br>
>><br>
>> No, I don't use the front buffer. I don't call glDrawBuffer for the FB 0. So I think,<br>
>> it should use GL_BACK.<br>
>> Hum except if some 3rparty libs do something in my back.<br>
>><br>
>> In case it have any impact, I'm using either glXSwapIntervalEXT or glXSwapIntervalMESA (if the former wasn't found)<br>
>> to control Vsync.<br>
>><br>
>> If I understand you, you expect that DRI2GetBuffersWithFormat should haven't be called in the first place ?<br>
><br>
> It's OK for it to get called. We just have to find a way how to deal<br>
> with it. If that means we have to disable old & slow DRI2 for<br>
> glthread, that's fine. The other option is to sync the first draw call<br>
> rendering to the default framebuffer.<br>
<br>
</div>FWIW, I think it should be possible to make DRI2GetBuffersWithFormat use<br>
XCB directly.<br>
<br>
There is other functionality related to events (window geometry changes,<br>
GLX_INTEL_swap_event, maybe more?) for which DRI2 relies on libX11<br>
specifics and can't use XCB directly. But hopefully that code can<br>
already only run on the main thread.<br>
<div class="elided-text"><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>
</div></blockquote></div><br></div></div></div></div></div>