[PATCH 2/2] loader_dri3: Variant 2: Wait for pending swaps to complete before drawable_fini.

Mario Kleiner mario.kleiner.de at gmail.com
Fri May 4 16:54:16 UTC 2018


On Fri, May 4, 2018 at 6:45 PM, Mike Lothian <mike at fireburn.co.uk> wrote:
> Hi
>
> The first hunk doesn't apply, the other 3 gives this with GCC 8.1
>

Oops, the perils of applying debug patches on top of debug patches...

Can you add a...

#include <stdio.h>

at the top of the file, e.g, after '#include <string.h>

 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
-
+#include <stdio.h>
 #include <X11/xshmfence.h>
 #include <xcb/xcb.h>
 #include <xcb/dri3.h>

Then it should compile, albeit with some format warnings, but those
shouldn't affect the outcome.
-mario

>
> ../mesa-9999/src/loader/loader_dri3_helper.c: In function
> ‘dri3_handle_present_event’:
> ../mesa-9999/src/loader/loader_dri3_helper.c:376:13: error: implicit
> declaration of function ‘printf’
> [-Werror=implicit-function-declaration]
>              printf("ORPHAN-C: %d x %d, drawable %d: recv %u vs send_sbc %lu\n",
>              ^~~~~~
> ../mesa-9999/src/loader/loader_dri3_helper.c:376:13: warning:
> incompatible implicit declaration of built-in function ‘printf’
> ../mesa-9999/src/loader/loader_dri3_helper.c:376:13: note: include
> ‘<stdio.h>’ or provide a declaration of ‘printf’
> ../mesa-9999/src/loader/loader_dri3_helper.c:39:1:
> +#include <stdio.h>
>
> ../mesa-9999/src/loader/loader_dri3_helper.c:376:13:
>              printf("ORPHAN-C: %d x %d, drawable %d: recv %u vs send_sbc %lu\n",
>              ^~~~~~
> ../mesa-9999/src/loader/loader_dri3_helper.c:376:75: warning: format
> ‘%lu’ expects argument of type ‘long unsigned int’, but argument 6 has
> type ‘uint64_t’ {aka ‘long long unsigned int’} [-Wformat=]
>              printf("ORPHAN-C: %d x %d, drawable %d: recv %u vs send_sbc %lu\n",
>                                                                          ~~^
>                                                                          %llu
> ../mesa-9999/src/loader/loader_dri3_helper.c:378:20:
>                     draw->send_sbc);
>                     ~~~~~~~~~~~~~~
> ../mesa-9999/src/loader/loader_dri3_helper.c:430:10: warning:
> incompatible implicit declaration of built-in function ‘printf’
>           printf("ORPHAN-I: %d x %d, drawable %d: recv %u vs send_sbc %lu\n",
>           ^~~~~~
> ../mesa-9999/src/loader/loader_dri3_helper.c:430:10: note: include
> ‘<stdio.h>’ or provide a declaration of ‘printf’
> ../mesa-9999/src/loader/loader_dri3_helper.c:430:72: warning: format
> ‘%lu’ expects argument of type ‘long unsigned int’, but argument 6 has
> type ‘uint64_t’ {aka ‘long long unsigned int’} [-Wformat=]
>           printf("ORPHAN-I: %d x %d, drawable %d: recv %u vs send_sbc %lu\n",
>                                                                       ~~^
>                                                                       %llu
> ../mesa-9999/src/loader/loader_dri3_helper.c:432:17:
>                  draw->send_sbc);
>                  ~~~~~~~~~~~~~~
> ../mesa-9999/src/loader/loader_dri3_helper.c: In function
> ‘dri3_update_drawable’:
> ../mesa-9999/src/loader/loader_dri3_helper.c:1454:7: warning:
> incompatible implicit declaration of built-in function ‘printf’
>        printf("INIT: wxh = %d x %d, drawable %d eid %d\n",
> draw->width, draw->height, draw->drawable, draw->eid);
>        ^~~~~~
> ../mesa-9999/src/loader/loader_dri3_helper.c:1454:7: note: include
> ‘<stdio.h>’ or provide a declaration of ‘printf’
> cc1: some warnings being treated as errors
>
> Cheers
>
> Mike
>
> On 4 May 2018 at 14:45, Mario Kleiner <mario.kleiner.de at gmail.com> wrote:
>> See previous patch in series for explanation of the problem.
>>
>> This method avoids a blocking loader_dri3_swapbuffer_barrier() call
>> whenever a GL contexts drawables are changed via glXMakeCurrent et al.
>>
>> Instead it filters out the "orphaned" PresentNotify events from
>> previous incarnations of the loader_dri3_drawable. This should deal
>> correctly with PixmapInvalidate, PixmapPresentCompleteNotify and
>> MscCompleteNotify events, but i don't know a way to filter out
>> WindowConfigureNotify events, or if it even matters to filter them.
>>
>> This PoC one is only meaningful if the first patch is omitted, and
>> shows the spurious "ORPHAN" printouts which would hang KDE plasmashell
>> if not filtered out.
>>
>> Test from a terminal: killall plasmashell; plasmashell
>> Wiggly the mouse around, click etc. on the KDE taskbar, K-Menu,
>> system tray icons, trigger volume/brightness feedback widgets
>> to provoke the occassional ORPHAN event.
>>
>> Signed-off-by: Mario Kleiner <mario.kleiner.de at gmail.com>
>> Cc: xorg-devel at lists.x.org
>> Cc: daniel at fooishbar.org
>> Cc: eero.t.tamminen at intel.com
>> Cc: mike at fireburn.co.uk
>> ---
>>  src/loader/loader_dri3_helper.c | 24 ++++++++++++++++++++++++
>>  1 file changed, 24 insertions(+)
>>
>> diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
>> index 7bd79af..123a996 100644
>> --- a/src/loader/loader_dri3_helper.c
>> +++ b/src/loader/loader_dri3_helper.c
>> @@ -234,6 +234,10 @@ loader_dri3_drawable_fini(struct loader_dri3_drawable *draw)
>>  {
>>     int i;
>>
>> +   printf("FINI: wxh = %d x %d, drawable %d eid %d recv_sbc %lu, send_sbc %lu PENDING %lu\n",
>> +          draw->width, draw->height, draw->drawable, draw->eid, draw->recv_sbc, draw->send_sbc,
>> +          draw->send_sbc - draw->recv_sbc);
>> +
>>     if (draw->special_event)
>>        loader_dri3_swapbuffer_barrier(draw);
>>
>> @@ -373,6 +377,15 @@ dri3_handle_present_event(struct loader_dri3_drawable *draw,
>>         * checking for wrap.
>>         */
>>        if (ce->kind == XCB_PRESENT_COMPLETE_KIND_PIXMAP) {
>> +         /* Filter out orphan events sent for a previous incarnation of draw. */
>> +         if (!(draw->send_sbc & 0xffffffff00000000LL) &&
>> +             ce->serial > draw->send_sbc) {
>> +            printf("ORPHAN-C: %d x %d, drawable %d: recv %u vs send_sbc %lu\n",
>> +                   draw->width, draw->height, draw->drawable, ce->serial,
>> +                   draw->send_sbc);
>> +            break;
>> +         }
>> +
>>           draw->recv_sbc = (draw->send_sbc & 0xffffffff00000000LL) | ce->serial;
>>           if (draw->recv_sbc > draw->send_sbc)
>>              draw->recv_sbc -= 0x100000000;
>> @@ -418,6 +431,15 @@ dri3_handle_present_event(struct loader_dri3_drawable *draw,
>>        xcb_present_idle_notify_event_t *ie = (void *) ge;
>>        int b;
>>
>> +      /* Filter out orphan events sent for a previous incarnation of draw. */
>> +      if (!(draw->send_sbc & 0xffffffff00000000LL) &&
>> +          ie->serial > draw->send_sbc) {
>> +         printf("ORPHAN-I: %d x %d, drawable %d: recv %u vs send_sbc %lu\n",
>> +                draw->width, draw->height, draw->drawable, ie->serial,
>> +                draw->send_sbc);
>> +         break;
>> +      }
>> +
>>        for (b = 0; b < ARRAY_SIZE(draw->buffers); b++) {
>>           struct loader_dri3_buffer *buf = draw->buffers[b];
>>
>> @@ -1435,6 +1457,8 @@ dri3_update_drawable(__DRIdrawable *driDrawable,
>>           xcb_unregister_for_special_event(draw->conn, draw->special_event);
>>           draw->special_event = NULL;
>>        }
>> +
>> +      printf("INIT: wxh = %d x %d, drawable %d eid %d\n", draw->width, draw->height, draw->drawable, draw->eid);
>>     }
>>     dri3_flush_present_events(draw);
>>     mtx_unlock(&draw->mtx);
>> --
>> 2.7.4
>>


More information about the xorg-devel mailing list