[PATCH] compositor: Don't use empty bounding boxes for output assigninment

Ander Conselvan de Oliveira conselvan2 at gmail.com
Wed Sep 12 00:41:11 PDT 2012


On 09/12/2012 09:15 AM, Pekka Paalanen wrote:
> On Tue, 11 Sep 2012 17:37:29 +0300
> Ander Conselvan de Oliveira <conselvan2 at gmail.com> wrote:
>
>> From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
>>
>> When weston_surface_assign_output() is called for an unmap'd surface,
>> its bounding box is empty causing no output to be assigned. This later
>> causes calls to weston_surface_schedule_repaint() to schedule no
>> repaint at all. This is the cause of surfaces not being shown on the
>> screen until a some input event or other drawing causes a repaint.
>>
>> This patch fix this by forcing an update of the bouding box if it is
>> empty. Although doing this can cause problems if the surface is
>> already mapped on the screen, for the particular case it should be safe
>> as described in the comment in the code.
>> ---
>>   src/compositor.c |   13 +++++++++++++
>>   1 file changed, 13 insertions(+)
>>
>> diff --git a/src/compositor.c b/src/compositor.c
>> index 911eaba..840a2a9 100644
>> --- a/src/compositor.c
>> +++ b/src/compositor.c
>> @@ -1109,6 +1109,19 @@ weston_surface_assign_output(struct weston_surface *es)
>>   	uint32_t max, area, mask;
>>   	pixman_box32_t *e;
>>
>> +	/* Update the surface's bounding box if it is empty to make sure
>> +	 * we end up with a surface assigned. This is done only on the
>
> Did you mean "an output assigned"?

Ops. Yeah, that's what I meant.

Cheers,
Ander

>> +	 * empty case though so that weston_surface_damage_below() isn't
>> +	 * broken. Some places expect the bouding box to be the old
>> +	 * surface position and updating it here could cause portions of
>> +	 * the output to not be damaged correctly. For the empty case,
>> +	 * however, this is not a problem since damaging below an empty
>> +	 * surface would result in no damage. Damaging below the surface
>> +	 * after the update will not produce any artifacts, although it
>> +	 * may result in some extra drawing. */
>> +	if (!pixman_region32_not_empty(&es->transform.boundingbox))
>> +		weston_surface_update_transform(es);
>> +
>>   	new_output = NULL;
>>   	max = 0;
>>   	mask = 0;
>
> The idea seems fine to me. Good explanation, covers everything I would
> worry about.
>
>
> Thanks,
> pq
>



More information about the wayland-devel mailing list