[Mesa-dev] [PATCH] egl/wayland: Support for KHR_partial_update

Harish Krupo harish.krupo.kps at intel.com
Tue Oct 17 16:34:58 UTC 2017


Hi Emil,

Thank you for the comments, will fix the code accordingly and send a
v2 patch.
I have answered the question inline.

Emil Velikov <emil.l.velikov at gmail.com> writes:

> Hi Harish,
>
> Overall looks great, a few comments/questions inline.
>
> On 13 October 2017 at 19:49, Harish Krupo <harish.krupo.kps at intel.com> wrote:
>> This passes 33/37 deqp tests related to partial_update, 4 are not
>> supported.
>>
>> Signed-off-by: Harish Krupo <harish.krupo.kps at intel.com>
>> ---
>>  src/egl/drivers/dri2/platform_wayland.c | 68 ++++++++++++++++++++++++++++-----
>>  1 file changed, 59 insertions(+), 9 deletions(-)
>>
>> diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
>> index 14db55ca74..483d588b92 100644
>> --- a/src/egl/drivers/dri2/platform_wayland.c
>> +++ b/src/egl/drivers/dri2/platform_wayland.c
>> @@ -810,15 +810,39 @@ try_damage_buffer(struct dri2_egl_surface *dri2_surf,
>>     }
>>     return EGL_TRUE;
>>  }
>> +
>>  /**
>> - * Called via eglSwapBuffers(), drv->API.SwapBuffers().
>> + * Called via eglSetDamageRegionKHR(), drv->API.SetDamageRegion().
>>   */
>>  static EGLBoolean
>> -dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
>> -                                 _EGLDisplay *disp,
>> -                                 _EGLSurface *draw,
>> -                                 const EGLint *rects,
>> -                                 EGLint n_rects)
>> +wl_set_damage_region(_EGLDriver *drv,
> Yes, it might be a bit confusing, but please stay consistent and call
> this dri2_wl_set_damage_region.
>
>> +                     _EGLDisplay *dpy,
>> +                     _EGLSurface *surf,
>> +                     const EGLint *rects,
>> +                     EGLint n_rects)
>> +{
>> +   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
>> +
>> +   /* The spec doesn't mention what should be returned in case of
>> +    * failure in setting the damage buffer with the window system, so
>> +    * setting the damage to maximum surface area
>> +   */
>> +   if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects)) {
>> +      wl_surface_damage(dri2_surf->wl_surface_wrapper,
>> +                        0, 0, INT32_MAX, INT32_MAX);
>> +      return EGL_TRUE;
> Drop this return - it's only confusing the reader.
>
>> +   }
>> +
>> +   return EGL_TRUE;
> ... since this should suffice.
>
>> +}
>> +
>> +static EGLBoolean
>> +dri2_wl_swap_buffers_common(_EGLDriver *drv,
>> +                            _EGLDisplay *disp,
>> +                            _EGLSurface *draw,
>> +                            const EGLint *rects,
>> +                            EGLint n_rects,
>> +                            EGLBoolean with_damage)
>>  {
>>     struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
>>     struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
>> @@ -876,7 +900,17 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
>>     /* If the compositor doesn't support damage_buffer, we deliberately
>>      * ignore the damage region and post maximum damage, due to
>>      * https://bugs.freedesktop.org/78190 */
>> -   if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects))
>> +
>> +   if (!with_damage) {
>> +
>> +      /* If called from swapBuffers, check if the damage region
>> +       * is already set, if not set to full damage
>> +       */
>> +      if (!dri2_surf->base.SetDamageRegionCalled)
>> +         wl_surface_damage(dri2_surf->wl_surface_wrapper,
>> +                           0, 0, INT32_MAX, INT32_MAX);
>> +   }
>> +   else if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects))
>>        wl_surface_damage(dri2_surf->wl_surface_wrapper,
>>                          0, 0, INT32_MAX, INT32_MAX);
>>
>> @@ -912,6 +946,20 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
>>     return EGL_TRUE;
>>  }
>>
>> +/**
>> + * Called via eglSwapBuffers(), drv->API.SwapBuffers().
>> + */
>> +static EGLBoolean
>> +dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
>> +                                 _EGLDisplay *disp,
>> +                                 _EGLSurface *draw,
>> +                                 const EGLint *rects,
>> +                                 EGLint n_rects)
>> +{
>> +   return dri2_wl_swap_buffers_common(drv, disp, draw,
>> +                                      rects, n_rects, EGL_TRUE);
> Hmm what will happen if use calls:
>
>   eglSetDamageRegionKHR(dpy, surf, rects, n_rects)
>   ...
>   eglSwapBuffersWithDamageKHR(dpy, surf, NULL, 0)
>
>
> eglSwapBuffersWithDamageKHR should behave identical as eglSwapBuffers, correct?
> If so, the proposed code seems buggy - we might as well drop the
> explicit with_damage and derive it from rects/n_rects locally.
>

Yes, in the above case, the surface damage will be set to the full
surface just as the spec defines it.
Now consider this scenario:

   eglSetDamageRegionKHR(dpy, surf, rects, n_rects)
   ...
   eglSwapBuffers(dpy, surf)
   (from dEQP)

In this case if we were the distinguish based on n_rects then we would
end up setting the buffer damage to full because SwapBuffers would call
SwapBuffersWithDamage with n_rects as 0 (same as the above scenario).
This would defeat the purpose of SetDamageRegion. Thus the explicit
with_damage variable.
Please correct me if I have misunderstood.

Thank you

Regards
Harish Krupo

> Thanks
> Emil



More information about the mesa-dev mailing list