[Mesa-dev] [PATCH mesa] egl/dri3: implement query surface hook

Tapani Pälli tapani.palli at intel.com
Mon Feb 27 05:53:52 UTC 2017



On 02/24/2017 05:55 PM, Brendan King wrote:
> Hi,
>
> On 20/02/17 07:57, Tapani Pälli wrote:
>> Hi;
>>
>> On 02/17/2017 05:12 PM, Eric Engestrom wrote:
>>> From: Brendan King <Brendan.King at imgtec.com>
>>>
>>> This is a DRI3 version of a change made for DRI2
>>> (4d6d4f939e0af4252e0b, "egl/dri2: implement query surface hook"),
>>> that fixed failures in dEQP-EGL.functional.resize.surface_size.grow
>>> and dEQP-EGL.functional.resize.surface_size.shrink.
>>
>> Do these tests fail on some platform? When debugging the original
>> failures this failed for me only when using DRI2. It's nice to be
>> consistent but is it possible that this is not necessary because of
>> differences between DRI2 and DRI3?
>>
> The tests failed on the PowerVR driver. The tests resize the drawable
> before calling eglSwapBuffers, and query the drawable width and height
> after the call. The driver hasn't started drawing the next frame at this
> point, and so hasn't requested the new buffers for the drawable yet,
> hence the old width and height were being returned.

OK thanks for clarifying, these changes look good to me;

Reviewed-by: Tapani Pälli <tapani.palli at intel.com>


>>
>>> Cc: Tapani Pälli <tapani.palli at intel.com>
>>> Cc: Mark Janes <mark.a.janes at intel.com>
>>> Cc: Chad Versace <chadversary at chromium.org>
>>> Signed-off-by: Brendan King <Brendan.King at imgtec.com>
>>> ---
>>>  src/egl/drivers/dri2/platform_x11_dri3.c | 20 ++++++++++++++++++++
>>>  src/loader/loader_dri3_helper.c          | 23 +++++++++++++++++++++++
>>>  src/loader/loader_dri3_helper.h          |  2 ++
>>>  3 files changed, 45 insertions(+)
>>>
>>> diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c
>>> b/src/egl/drivers/dri2/platform_x11_dri3.c
>>> index c4747144d1..c4a54431cc 100644
>>> --- a/src/egl/drivers/dri2/platform_x11_dri3.c
>>> +++ b/src/egl/drivers/dri2/platform_x11_dri3.c
>>> @@ -419,6 +419,25 @@ dri3_query_buffer_age(_EGLDriver *drv,
>>> _EGLDisplay *dpy, _EGLSurface *surf)
>>>     return loader_dri3_query_buffer_age(&dri3_surf->loader_drawable);
>>>  }
>>>
>>> +static EGLBoolean
>>> +dri3_query_surface(_EGLDriver *drv, _EGLDisplay *dpy,
>>> +                   _EGLSurface *surf, EGLint attribute,
>>> +                   EGLint *value)
>>> +{
>>> +   struct dri3_egl_surface *dri3_surf = dri3_egl_surface(surf);
>>> +
>>> +   switch (attribute) {
>>> +   case EGL_WIDTH:
>>> +   case EGL_HEIGHT:
>>> + loader_dri3_update_drawable_geometry(&dri3_surf->loader_drawable);
>>> +      break;
>>> +   default:
>>> +      break;
>>> +   }
>>> +
>>> +   return _eglQuerySurface(drv, dpy, surf, attribute, value);
>>> +}
>>> +
>>>  static __DRIdrawable *
>>>  dri3_get_dri_drawable(_EGLSurface *surf)
>>>  {
>>> @@ -441,6 +460,7 @@ struct dri2_egl_display_vtbl
>>> dri3_x11_display_vtbl = {
>>>     .post_sub_buffer = dri2_fallback_post_sub_buffer,
>>>     .copy_buffers = dri3_copy_buffers,
>>>     .query_buffer_age = dri3_query_buffer_age,
>>> +   .query_surface = dri3_query_surface,
>>>     .create_wayland_buffer_from_image =
>>> dri2_fallback_create_wayland_buffer_from_image,
>>>     .get_sync_values = dri3_get_sync_values,
>>>     .get_dri_drawable = dri3_get_dri_drawable,
>>> diff --git a/src/loader/loader_dri3_helper.c
>>> b/src/loader/loader_dri3_helper.c
>>> index 6e5d1b8843..493a7f5218 100644
>>> --- a/src/loader/loader_dri3_helper.c
>>> +++ b/src/loader/loader_dri3_helper.c
>>> @@ -1408,3 +1408,26 @@ loader_dri3_get_buffers(__DRIdrawable
>>> *driDrawable,
>>>
>>>     return true;
>>>  }
>>> +
>>> +/** loader_dri3_update_drawable_geometry
>>> + *
>>> + * Get the current drawable geometry.
>>> + */
>>> +void
>>> +loader_dri3_update_drawable_geometry(struct loader_dri3_drawable *draw)
>>> +{
>>> +   xcb_get_geometry_cookie_t geom_cookie;
>>> +   xcb_get_geometry_reply_t *geom_reply;
>>> +
>>> +   geom_cookie = xcb_get_geometry(draw->conn, draw->drawable);
>>> +
>>> +   geom_reply = xcb_get_geometry_reply(draw->conn, geom_cookie, NULL);
>>> +
>>> +   if (geom_reply) {
>>> +      draw->width = geom_reply->width;
>>> +      draw->height = geom_reply->height;
>>> +      draw->vtable->set_drawable_size(draw, draw->width, draw->height);
>>> +
>>> +      free(geom_reply);
>>> +   }
>>> +}
>>> diff --git a/src/loader/loader_dri3_helper.h
>>> b/src/loader/loader_dri3_helper.h
>>> index 1d1f15ebb9..a865e46355 100644
>>> --- a/src/loader/loader_dri3_helper.h
>>> +++ b/src/loader/loader_dri3_helper.h
>>> @@ -239,4 +239,6 @@ loader_dri3_get_buffers(__DRIdrawable *driDrawable,
>>>                          uint32_t buffer_mask,
>>>                          struct __DRIimageList *buffers);
>>>
>>> +void
>>> +loader_dri3_update_drawable_geometry(struct loader_dri3_drawable
>>> *draw);
>>>  #endif
>>>
>


More information about the mesa-dev mailing list