forked from AuroraMiddleware/gtk
gdk: use EGL_KHR_swap_buffers_with_damage
It appears that NVIDIA does not implement EGL_EXT_swap_buffers_with_damage on their EGL implementation, but does implement the KHR variant of it. This checks for a suitable implementation and stores a pointer to the compatible implementation within the GdkGLContextPrivate struct.
This commit is contained in:
parent
33a1cf203e
commit
f0e8ee3c29
@ -1721,8 +1721,6 @@ gdk_display_init_egl (GdkDisplay *self,
|
|||||||
|
|
||||||
self->have_egl_buffer_age =
|
self->have_egl_buffer_age =
|
||||||
epoxy_has_egl_extension (priv->egl_display, "EGL_EXT_buffer_age");
|
epoxy_has_egl_extension (priv->egl_display, "EGL_EXT_buffer_age");
|
||||||
self->have_egl_swap_buffers_with_damage =
|
|
||||||
epoxy_has_egl_extension (priv->egl_display, "EGL_EXT_swap_buffers_with_damage");
|
|
||||||
self->have_egl_no_config_context =
|
self->have_egl_no_config_context =
|
||||||
epoxy_has_egl_extension (priv->egl_display, "EGL_KHR_no_config_context");
|
epoxy_has_egl_extension (priv->egl_display, "EGL_KHR_no_config_context");
|
||||||
self->have_egl_pixel_format_float =
|
self->have_egl_pixel_format_float =
|
||||||
|
@ -107,7 +107,6 @@ struct _GdkDisplay
|
|||||||
|
|
||||||
/* egl info */
|
/* egl info */
|
||||||
guint have_egl_buffer_age : 1;
|
guint have_egl_buffer_age : 1;
|
||||||
guint have_egl_swap_buffers_with_damage : 1;
|
|
||||||
guint have_egl_no_config_context : 1;
|
guint have_egl_no_config_context : 1;
|
||||||
guint have_egl_pixel_format_float : 1;
|
guint have_egl_pixel_format_float : 1;
|
||||||
guint have_egl_win32_libangle : 1;
|
guint have_egl_win32_libangle : 1;
|
||||||
|
@ -117,6 +117,7 @@ typedef struct {
|
|||||||
|
|
||||||
#ifdef HAVE_EGL
|
#ifdef HAVE_EGL
|
||||||
EGLContext egl_context;
|
EGLContext egl_context;
|
||||||
|
EGLBoolean (*eglSwapBuffersWithDamage) (EGLDisplay, EGLSurface, const EGLint *, EGLint);
|
||||||
#endif
|
#endif
|
||||||
} GdkGLContextPrivate;
|
} GdkGLContextPrivate;
|
||||||
|
|
||||||
@ -420,6 +421,11 @@ gdk_gl_context_real_realize (GdkGLContext *context,
|
|||||||
|
|
||||||
gdk_gl_context_set_is_legacy (context, legacy_bit);
|
gdk_gl_context_set_is_legacy (context, legacy_bit);
|
||||||
|
|
||||||
|
if (epoxy_has_egl_extension (egl_display, "EGL_KHR_swap_buffers_with_damage"))
|
||||||
|
priv->eglSwapBuffersWithDamage = (gpointer)epoxy_eglGetProcAddress ("eglSwapBuffersWithDamageKHR");
|
||||||
|
else if (epoxy_has_egl_extension (egl_display, "EGL_EXT_swap_buffers_with_damage"))
|
||||||
|
priv->eglSwapBuffersWithDamage = (gpointer)epoxy_eglGetProcAddress ("eglSwapBuffersWithDamageEXT");
|
||||||
|
|
||||||
gdk_profiler_end_mark (start_time, "realize GdkWaylandGLContext", NULL);
|
gdk_profiler_end_mark (start_time, "realize GdkWaylandGLContext", NULL);
|
||||||
|
|
||||||
return api;
|
return api;
|
||||||
@ -608,7 +614,7 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context,
|
|||||||
|
|
||||||
gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "EGL", "swap buffers");
|
gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "EGL", "swap buffers");
|
||||||
|
|
||||||
if (display->have_egl_swap_buffers_with_damage)
|
if (priv->eglSwapBuffersWithDamage)
|
||||||
{
|
{
|
||||||
EGLint stack_rects[4 * 4]; /* 4 rects */
|
EGLint stack_rects[4 * 4]; /* 4 rects */
|
||||||
EGLint *heap_rects = NULL;
|
EGLint *heap_rects = NULL;
|
||||||
@ -632,7 +638,7 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context,
|
|||||||
rects[j++] = rect.width * scale;
|
rects[j++] = rect.width * scale;
|
||||||
rects[j++] = rect.height * scale;
|
rects[j++] = rect.height * scale;
|
||||||
}
|
}
|
||||||
eglSwapBuffersWithDamageEXT (gdk_display_get_egl_display (display), egl_surface, rects, n_rects);
|
priv->eglSwapBuffersWithDamage (gdk_display_get_egl_display (display), egl_surface, rects, n_rects);
|
||||||
g_free (heap_rects);
|
g_free (heap_rects);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user