Patch that "fixes" compositor-x11
Bill Spitzak
spitzak at gmail.com
Tue Jun 5 12:11:23 PDT 2012
Kristian Høgsberg wrote:
> What do you mean by "produces a composite" and how do you know? The
> x11 backend renders every 10ms when it's rendering continuously, not
> after every X event. At least that's how it's supposed to work (and
> how it works here), if that doesn't happen for you, it would be nice
> if you could get some more details on what actually happens and why.
If weston compositor-x11 is doing some heavy work (for instance when it
is starting up, or if you launch about 10 applications) and then move
the mouse quickly in circles, it will move the mouse cursor (and any
other changes) much more slowly at a smooth even speed, falling way
behind my hand movements. It can take tens of seconds after I stop
moving the mouse for it to track through all the events.
I placed a print statement in window.c in the run-loop function after it
gets a block of events to print how many events were read. It never
printed any number other than 1 or 0, confirming my suspicion of what
was wrong.
I then moved the print statement to compositor-x11 to where it calls
xcb_poll functions, with the intention of finding out if the bug was in
the x11 portion, or in wayland itself. I was surprised to discover the
print statement *fixed* the problem. Now the window.c function gets 6-15
events at a time, and the cursor now keeps up with mouse movements,
jumping over intermediate positions if weston gets slow.
The clickdot motion trail is now also straight line segments, since it
apparently does not record all the motion events it gets, but instead
draws a straight line to the current position when redraw is called.
I do not have an explanation as to why the print statement makes a
difference. My best guess is that it produces a blocking i/o call,
during which time the x server changes it's state in such a way that
xcb_poll works a second time. But it is also very sensitive to the
location of the print statment, as otherwise-identical code in window.c
did not fix it.
>> This patch also makes x11_compositor_handle_event return non-zero,
>> which I believe was intended. But that does not fix the bug.
>
> Is there a case where we return 0 but actually handled events in the
> loop? I don't see the code path where that may happen, if we handle
> an event, 'event' will be non-NULL and we'll return 1. The mainloop
> only cares whether the return values is 0 or positive, the actual
> number of events processed doesn't matter.
The previous version of x11_compositor_handle_event always returned 0.
This is because it did this (changing the out parameter to a return value):
while (event = getEvent()) { ... }
return event != 0;
Since the while loop does not exit until getEvent() returns 0, p will
always be 0 and this function always returns 0.
My patch changes it to return how many times p was set to non-zero.
It is also possible that x11_compositor_next_event is supposed to not
write over the event parameter when it returns false, but that is not
how it is written.
>> diff --git a/src/compositor-x11.c b/src/compositor-x11.c
>> index d23553e..f329cc4 100644
>> --- a/src/compositor-x11.c
>> +++ b/src/compositor-x11.c
>> @@ -619,9 +619,11 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data)
>> uint32_t *k;
>> uint32_t i, set;
>> wl_fixed_t x, y;
>> + int count = 0;
>>
>> prev = NULL;
>> while (x11_compositor_next_event(c, &event, mask)) {
>> + ++count;
>> switch (prev ? prev->response_type & ~0x80 : 0x80) {
>> case XCB_KEY_RELEASE:
>> key_release = (xcb_key_press_event_t *) prev;
>> @@ -773,8 +775,8 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data)
>> default:
>> break;
>> }
>> -
>> - return event != NULL;
>> + if (count) printf("count = %d\n", count);
>> + return count;
>> }
>>
>> #define F(field) offsetof(struct x11_compositor, field)
>
>> _______________________________________________
>> wayland-devel mailing list
>> wayland-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
More information about the wayland-devel
mailing list