egl/surfaceless: Fix segfault in eglSwapBuffers
authorChad Versace <chadversary@chromium.org>
Tue, 18 Oct 2016 16:39:49 +0000 (09:39 -0700)
committerChad Versace <chadversary@chromium.org>
Tue, 18 Oct 2016 18:12:22 +0000 (11:12 -0700)
Since commit 63c5d5c6c46c8472ee7a8241a0f80f13d79cb8cd, the surfaceless
platform has allowed creation of pbuffer surfaces. But the vtable entry
for eglSwapBuffers has remained NULL.

Discovered by running a little pbuffer test.

Cc: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
src/egl/drivers/dri2/platform_surfaceless.c

index c81eacafdac684487a6f60d7661ebd73d41dde7e..025aaa2550683edded7cda593b13551fdec8a1ab 100644 (file)
@@ -177,6 +177,17 @@ dri2_surfaceless_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *disp,
                                   attrib_list);
 }
 
+static EGLBoolean
+surfaceless_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
+{
+   assert(!surf || surf->Type == EGL_PBUFFER_BIT);
+
+   /* From the EGL 1.5 spec:
+    *    If surface is a [...] pbuffer surface, eglSwapBuffers has no effect.
+    */
+   return EGL_TRUE;
+}
+
 static EGLBoolean
 surfaceless_add_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *dpy)
 {
@@ -223,6 +234,7 @@ static struct dri2_egl_display_vtbl dri2_surfaceless_display_vtbl = {
    .destroy_surface = surfaceless_destroy_surface,
    .create_image = dri2_create_image_khr,
    .swap_interval = dri2_fallback_swap_interval,
+   .swap_buffers = surfaceless_swap_buffers,
    .swap_buffers_with_damage = dri2_fallback_swap_buffers_with_damage,
    .swap_buffers_region = dri2_fallback_swap_buffers_region,
    .post_sub_buffer = dri2_fallback_post_sub_buffer,