Compare commits
5 Commits
matthiasc/
...
wip/on-the
Author | SHA1 | Date | |
---|---|---|---|
|
c660175c76 | ||
|
f3cced142c | ||
|
52246a504f | ||
|
93f1e72b94 | ||
|
504f8905a3 |
@@ -146,6 +146,9 @@
|
|||||||
/* Have the Xcursor library */
|
/* Have the Xcursor library */
|
||||||
#mesondefine HAVE_XCURSOR
|
#mesondefine HAVE_XCURSOR
|
||||||
|
|
||||||
|
/* Have the XDAMAGE X extension */
|
||||||
|
#mesondefine HAVE_XDAMAGE
|
||||||
|
|
||||||
/* Have the XFIXES X extension */
|
/* Have the XFIXES X extension */
|
||||||
#mesondefine HAVE_XFIXES
|
#mesondefine HAVE_XFIXES
|
||||||
|
|
||||||
|
@@ -50,6 +50,7 @@
|
|||||||
<object class="GtkToggleButton" id="changes_allow">
|
<object class="GtkToggleButton" id="changes_allow">
|
||||||
<property name="icon-name">changes-allow</property>
|
<property name="icon-name">changes-allow</property>
|
||||||
<property name="has-frame">0</property>
|
<property name="has-frame">0</property>
|
||||||
|
<property name="active">1</property>
|
||||||
<signal name="notify::active" handler="fishbowl_changes_toggled_cb"/>
|
<signal name="notify::active" handler="fishbowl_changes_toggled_cb"/>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
@@ -160,7 +160,7 @@ static double
|
|||||||
new_speed (void)
|
new_speed (void)
|
||||||
{
|
{
|
||||||
/* 5s to 50s to cross screen seems fair */
|
/* 5s to 50s to cross screen seems fair */
|
||||||
return g_random_double_range (0.02, 0.2);
|
return 0.4;//g_random_double_range (0.02, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -574,23 +574,23 @@ gtk_fishbowl_tick (GtkWidget *widget,
|
|||||||
|
|
||||||
if (child->x <= 0)
|
if (child->x <= 0)
|
||||||
{
|
{
|
||||||
child->x = 0;
|
child->x = -child->x;
|
||||||
child->dx = new_speed ();
|
child->dx = new_speed ();
|
||||||
}
|
}
|
||||||
else if (child->x >= 1)
|
else if (child->x >= 1)
|
||||||
{
|
{
|
||||||
child->x = 1;
|
child->x = 2 - child->x;
|
||||||
child->dx = - new_speed ();
|
child->dx = - new_speed ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (child->y <= 0)
|
if (child->y <= 0)
|
||||||
{
|
{
|
||||||
child->y = 0;
|
child->y = -child->y;
|
||||||
child->dy = new_speed ();
|
child->dy = new_speed ();
|
||||||
}
|
}
|
||||||
else if (child->y >= 1)
|
else if (child->y >= 1)
|
||||||
{
|
{
|
||||||
child->y = 1;
|
child->y = 2 - child->y;
|
||||||
child->dy = - new_speed ();
|
child->dy = - new_speed ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#include "demos.h"
|
#include "demos.h"
|
||||||
|
|
||||||
|
static gboolean is_run;
|
||||||
static GtkWidget *info_view;
|
static GtkWidget *info_view;
|
||||||
static GtkWidget *source_view;
|
static GtkWidget *source_view;
|
||||||
|
|
||||||
@@ -1031,7 +1032,8 @@ activate (GApplication *app)
|
|||||||
|
|
||||||
gtk_tree_view_collapse_all (GTK_TREE_VIEW (treeview));
|
gtk_tree_view_collapse_all (GTK_TREE_VIEW (treeview));
|
||||||
|
|
||||||
gtk_widget_show (GTK_WIDGET (window));
|
if (!is_run)
|
||||||
|
gtk_widget_show (GTK_WIDGET (window));
|
||||||
|
|
||||||
g_object_unref (builder);
|
g_object_unref (builder);
|
||||||
}
|
}
|
||||||
@@ -1077,13 +1079,17 @@ command_line (GApplication *app,
|
|||||||
GDoDemoFunc func = 0;
|
GDoDemoFunc func = 0;
|
||||||
GtkWidget *window, *demo;
|
GtkWidget *window, *demo;
|
||||||
|
|
||||||
activate (app);
|
|
||||||
|
|
||||||
options = g_application_command_line_get_options_dict (cmdline);
|
options = g_application_command_line_get_options_dict (cmdline);
|
||||||
g_variant_dict_lookup (options, "run", "&s", &name);
|
g_variant_dict_lookup (options, "run", "&s", &name);
|
||||||
g_variant_dict_lookup (options, "autoquit", "b", &autoquit);
|
g_variant_dict_lookup (options, "autoquit", "b", &autoquit);
|
||||||
g_variant_dict_lookup (options, "list", "b", &list);
|
g_variant_dict_lookup (options, "list", "b", &list);
|
||||||
|
|
||||||
|
is_run = name != NULL;
|
||||||
|
|
||||||
|
activate (app);
|
||||||
|
|
||||||
|
|
||||||
if (list)
|
if (list)
|
||||||
{
|
{
|
||||||
list_demos ();
|
list_demos ();
|
||||||
|
@@ -207,6 +207,7 @@ gdk_frame_clock_idle_get_frame_time (GdkFrameClock *clock)
|
|||||||
#define RUN_PAINT_IDLE(priv) \
|
#define RUN_PAINT_IDLE(priv) \
|
||||||
((priv)->freeze_count == 0 && \
|
((priv)->freeze_count == 0 && \
|
||||||
(((priv)->requested & ~GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS) != 0 || \
|
(((priv)->requested & ~GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS) != 0 || \
|
||||||
|
(priv)->phase > GDK_FRAME_CLOCK_PHASE_PAINT || \
|
||||||
(priv)->updating_count > 0))
|
(priv)->updating_count > 0))
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -235,6 +236,12 @@ maybe_start_idle (GdkFrameClockIdle *clock_idle)
|
|||||||
g_source_set_name_by_id (priv->flush_idle_id, "[gtk] gdk_frame_clock_flush_idle");
|
g_source_set_name_by_id (priv->flush_idle_id, "[gtk] gdk_frame_clock_flush_idle");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we've already painted the frame, then we should finish up this tick as quickly
|
||||||
|
* as possible
|
||||||
|
*/
|
||||||
|
if (priv->phase > GDK_FRAME_CLOCK_PHASE_PAINT)
|
||||||
|
min_interval = 0;
|
||||||
|
|
||||||
if (!priv->in_paint_idle &&
|
if (!priv->in_paint_idle &&
|
||||||
priv->paint_idle_id == 0 && RUN_PAINT_IDLE (priv))
|
priv->paint_idle_id == 0 && RUN_PAINT_IDLE (priv))
|
||||||
{
|
{
|
||||||
@@ -452,6 +459,7 @@ gdk_frame_clock_paint_idle (void *data)
|
|||||||
priv->requested &= ~GDK_FRAME_CLOCK_PHASE_PAINT;
|
priv->requested &= ~GDK_FRAME_CLOCK_PHASE_PAINT;
|
||||||
_gdk_frame_clock_emit_paint (clock);
|
_gdk_frame_clock_emit_paint (clock);
|
||||||
}
|
}
|
||||||
|
priv->phase = GDK_FRAME_CLOCK_PHASE_AFTER_PAINT;
|
||||||
}
|
}
|
||||||
G_GNUC_FALLTHROUGH;
|
G_GNUC_FALLTHROUGH;
|
||||||
|
|
||||||
@@ -463,11 +471,11 @@ gdk_frame_clock_paint_idle (void *data)
|
|||||||
/* the ::after-paint phase doesn't get repeated on freeze/thaw,
|
/* the ::after-paint phase doesn't get repeated on freeze/thaw,
|
||||||
*/
|
*/
|
||||||
priv->phase = GDK_FRAME_CLOCK_PHASE_NONE;
|
priv->phase = GDK_FRAME_CLOCK_PHASE_NONE;
|
||||||
}
|
|
||||||
#ifdef G_ENABLE_DEBUG
|
#ifdef G_ENABLE_DEBUG
|
||||||
if (GDK_DEBUG_CHECK (FRAMES))
|
if (GDK_DEBUG_CHECK (FRAMES))
|
||||||
timings->frame_end_time = g_get_monotonic_time ();
|
timings->frame_end_time = g_get_monotonic_time ();
|
||||||
#endif /* G_ENABLE_DEBUG */
|
#endif /* G_ENABLE_DEBUG */
|
||||||
|
}
|
||||||
G_GNUC_FALLTHROUGH;
|
G_GNUC_FALLTHROUGH;
|
||||||
|
|
||||||
case GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS:
|
case GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS:
|
||||||
|
@@ -1603,6 +1603,14 @@ gdk_x11_display_open (const gchar *display_name)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
display_x11->have_damage = FALSE;
|
||||||
|
#ifdef HAVE_XDAMAGE
|
||||||
|
if (XDamageQueryExtension (display_x11->xdisplay,
|
||||||
|
&display_x11->damage_event_base,
|
||||||
|
&display_x11->damage_error_base))
|
||||||
|
display_x11->have_damage = TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
display->clipboard = gdk_x11_clipboard_new (display, "CLIPBOARD");
|
display->clipboard = gdk_x11_clipboard_new (display, "CLIPBOARD");
|
||||||
display->primary_clipboard = gdk_x11_clipboard_new (display, "PRIMARY");
|
display->primary_clipboard = gdk_x11_clipboard_new (display, "PRIMARY");
|
||||||
|
|
||||||
|
@@ -149,6 +149,11 @@ struct _GdkX11Display
|
|||||||
guint has_glx_multisample : 1;
|
guint has_glx_multisample : 1;
|
||||||
guint has_glx_visual_rating : 1;
|
guint has_glx_visual_rating : 1;
|
||||||
guint has_glx_create_es2_context : 1;
|
guint has_glx_create_es2_context : 1;
|
||||||
|
guint has_glx_implicit_damage : 1;
|
||||||
|
|
||||||
|
gint damage_event_base;
|
||||||
|
gint damage_error_base;
|
||||||
|
guint have_damage;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GdkX11DisplayClass
|
struct _GdkX11DisplayClass
|
||||||
|
@@ -183,6 +183,16 @@ gdk_x11_gl_context_end_frame (GdkDrawContext *draw_context,
|
|||||||
|
|
||||||
gdk_x11_surface_pre_damage (surface);
|
gdk_x11_surface_pre_damage (surface);
|
||||||
|
|
||||||
|
#ifdef HAVE_XDAMAGE
|
||||||
|
if (context_x11->xdamage != 0)
|
||||||
|
{
|
||||||
|
g_assert (context_x11->frame_fence == 0);
|
||||||
|
|
||||||
|
context_x11->frame_fence = glFenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||||
|
gdk_surface_freeze_updates (surface);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
glXSwapBuffers (dpy, drawable);
|
glXSwapBuffers (dpy, drawable);
|
||||||
|
|
||||||
if (context_x11->do_frame_sync && info != NULL && display_x11->has_glx_video_sync)
|
if (context_x11->do_frame_sync && info != NULL && display_x11->has_glx_video_sync)
|
||||||
@@ -565,6 +575,45 @@ create_legacy_context (GdkDisplay *display,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_XDAMAGE
|
||||||
|
static gboolean
|
||||||
|
on_gl_surface_xevent (GdkGLContext *context,
|
||||||
|
XEvent *xevent,
|
||||||
|
GdkX11Display *display_x11)
|
||||||
|
{
|
||||||
|
GdkX11GLContext *context_x11 = GDK_X11_GL_CONTEXT (context);
|
||||||
|
GdkSurface *surface = gdk_gl_context_get_surface (context);
|
||||||
|
XDamageNotifyEvent *damage_xevent;
|
||||||
|
|
||||||
|
if (!context_x11->is_attached)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (xevent->type != (display_x11->damage_event_base + XDamageNotify))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
damage_xevent = (XDamageNotifyEvent *) xevent;
|
||||||
|
|
||||||
|
if (damage_xevent->damage != context_x11->xdamage)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (context_x11->frame_fence)
|
||||||
|
{
|
||||||
|
GLenum wait_result;
|
||||||
|
|
||||||
|
wait_result = glClientWaitSync (context_x11->frame_fence, 0, 0);
|
||||||
|
|
||||||
|
if (wait_result == GL_ALREADY_SIGNALED)
|
||||||
|
{
|
||||||
|
glDeleteSync (context_x11->frame_fence);
|
||||||
|
context_x11->frame_fence = 0;
|
||||||
|
gdk_surface_thaw_updates (surface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gdk_x11_gl_context_realize (GdkGLContext *context,
|
gdk_x11_gl_context_realize (GdkGLContext *context,
|
||||||
GError **error)
|
GError **error)
|
||||||
@@ -737,6 +786,29 @@ gdk_x11_gl_context_realize (GdkGLContext *context,
|
|||||||
context_x11->attached_drawable = info->glx_drawable ? info->glx_drawable : gdk_x11_surface_get_xid (surface);
|
context_x11->attached_drawable = info->glx_drawable ? info->glx_drawable : gdk_x11_surface_get_xid (surface);
|
||||||
context_x11->unattached_drawable = info->dummy_glx ? info->dummy_glx : info->dummy_xwin;
|
context_x11->unattached_drawable = info->dummy_glx ? info->dummy_glx : info->dummy_xwin;
|
||||||
|
|
||||||
|
#ifdef HAVE_XDAMAGE
|
||||||
|
if (display_x11->have_damage && display_x11->has_glx_implicit_damage)
|
||||||
|
{
|
||||||
|
gdk_x11_display_error_trap_push (display);
|
||||||
|
context_x11->xdamage = XDamageCreate (dpy,
|
||||||
|
gdk_x11_surface_get_xid (surface),
|
||||||
|
XDamageReportRawRectangles);
|
||||||
|
if (gdk_x11_display_error_trap_pop (display))
|
||||||
|
{
|
||||||
|
XDamageDestroy (dpy, context_x11->xdamage);
|
||||||
|
context_x11->xdamage = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_signal_connect_object (G_OBJECT (display),
|
||||||
|
"xevent",
|
||||||
|
G_CALLBACK (on_gl_surface_xevent),
|
||||||
|
context,
|
||||||
|
G_CONNECT_SWAPPED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
context_x11->is_direct = glXIsDirect (dpy, context_x11->glx_context);
|
context_x11->is_direct = glXIsDirect (dpy, context_x11->glx_context);
|
||||||
|
|
||||||
GDK_DISPLAY_NOTE (display, OPENGL,
|
GDK_DISPLAY_NOTE (display, OPENGL,
|
||||||
@@ -751,13 +823,15 @@ static void
|
|||||||
gdk_x11_gl_context_dispose (GObject *gobject)
|
gdk_x11_gl_context_dispose (GObject *gobject)
|
||||||
{
|
{
|
||||||
GdkX11GLContext *context_x11 = GDK_X11_GL_CONTEXT (gobject);
|
GdkX11GLContext *context_x11 = GDK_X11_GL_CONTEXT (gobject);
|
||||||
|
GdkGLContext *context = GDK_GL_CONTEXT (gobject);
|
||||||
|
GdkDisplay *display = gdk_gl_context_get_display (context);
|
||||||
|
Display *dpy = NULL;
|
||||||
|
|
||||||
|
if (display != NULL)
|
||||||
|
dpy = gdk_x11_display_get_xdisplay (display);
|
||||||
|
|
||||||
if (context_x11->glx_context != NULL)
|
if (context_x11->glx_context != NULL)
|
||||||
{
|
{
|
||||||
GdkGLContext *context = GDK_GL_CONTEXT (gobject);
|
|
||||||
GdkDisplay *display = gdk_gl_context_get_display (context);
|
|
||||||
Display *dpy = gdk_x11_display_get_xdisplay (display);
|
|
||||||
|
|
||||||
if (glXGetCurrentContext () == context_x11->glx_context)
|
if (glXGetCurrentContext () == context_x11->glx_context)
|
||||||
glXMakeContextCurrent (dpy, None, None, NULL);
|
glXMakeContextCurrent (dpy, None, None, NULL);
|
||||||
|
|
||||||
@@ -766,6 +840,14 @@ gdk_x11_gl_context_dispose (GObject *gobject)
|
|||||||
context_x11->glx_context = NULL;
|
context_x11->glx_context = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_XDAMAGE
|
||||||
|
if (context_x11->xdamage != 0)
|
||||||
|
{
|
||||||
|
XDamageDestroy (dpy, context_x11->xdamage);
|
||||||
|
context_x11->xdamage = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
G_OBJECT_CLASS (gdk_x11_gl_context_parent_class)->dispose (gobject);
|
G_OBJECT_CLASS (gdk_x11_gl_context_parent_class)->dispose (gobject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -841,6 +923,16 @@ gdk_x11_screen_init_gl (GdkX11Screen *screen)
|
|||||||
display_x11->has_glx_visual_rating =
|
display_x11->has_glx_visual_rating =
|
||||||
epoxy_has_glx_extension (dpy, screen_num, "GLX_EXT_visual_rating");
|
epoxy_has_glx_extension (dpy, screen_num, "GLX_EXT_visual_rating");
|
||||||
|
|
||||||
|
if (g_strcmp0 (glXGetClientString (dpy, GLX_VENDOR), "NVIDIA Corporation") == 0)
|
||||||
|
{
|
||||||
|
/* NVidia doesn't send damage from the client library during buffer swap.
|
||||||
|
* Instead, damage only gets sent by the Xserver later, and we can't
|
||||||
|
* continue the frame paint cycle until we know the compositor has seen
|
||||||
|
* the damage.
|
||||||
|
*/
|
||||||
|
display_x11->has_glx_implicit_damage = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
GDK_DISPLAY_NOTE (display, OPENGL,
|
GDK_DISPLAY_NOTE (display, OPENGL,
|
||||||
g_message ("GLX version %d.%d found\n"
|
g_message ("GLX version %d.%d found\n"
|
||||||
" - Vendor: %s\n"
|
" - Vendor: %s\n"
|
||||||
|
@@ -24,6 +24,10 @@
|
|||||||
#include <X11/X.h>
|
#include <X11/X.h>
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_XDAMAGE
|
||||||
|
#include <X11/extensions/Xdamage.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <epoxy/gl.h>
|
#include <epoxy/gl.h>
|
||||||
#include <epoxy/glx.h>
|
#include <epoxy/glx.h>
|
||||||
|
|
||||||
@@ -44,6 +48,11 @@ struct _GdkX11GLContext
|
|||||||
GLXDrawable attached_drawable;
|
GLXDrawable attached_drawable;
|
||||||
GLXDrawable unattached_drawable;
|
GLXDrawable unattached_drawable;
|
||||||
|
|
||||||
|
#ifdef HAVE_XDAMAGE
|
||||||
|
GLsync frame_fence;
|
||||||
|
Damage xdamage;
|
||||||
|
#endif
|
||||||
|
|
||||||
guint is_attached : 1;
|
guint is_attached : 1;
|
||||||
guint is_direct : 1;
|
guint is_direct : 1;
|
||||||
guint do_frame_sync : 1;
|
guint do_frame_sync : 1;
|
||||||
|
@@ -65,6 +65,7 @@ gdk_x11_deps = [
|
|||||||
xext_dep,
|
xext_dep,
|
||||||
x11_dep,
|
x11_dep,
|
||||||
xcursor_dep,
|
xcursor_dep,
|
||||||
|
xdamage_dep,
|
||||||
xfixes_dep,
|
xfixes_dep,
|
||||||
xcomposite_dep,
|
xcomposite_dep,
|
||||||
xrandr_dep,
|
xrandr_dep,
|
||||||
|
@@ -507,6 +507,7 @@ if x11_enabled
|
|||||||
xi_dep = dependency('xi')
|
xi_dep = dependency('xi')
|
||||||
xext_dep = dependency('xext')
|
xext_dep = dependency('xext')
|
||||||
xcursor_dep = dependency('xcursor', required: false)
|
xcursor_dep = dependency('xcursor', required: false)
|
||||||
|
xdamage_dep = dependency('xdamage', required: false)
|
||||||
xfixes_dep = dependency('xfixes', required: false)
|
xfixes_dep = dependency('xfixes', required: false)
|
||||||
xcomposite_dep = dependency('xcomposite', required: false)
|
xcomposite_dep = dependency('xcomposite', required: false)
|
||||||
fontconfig_dep = dependency('fontconfig')
|
fontconfig_dep = dependency('fontconfig')
|
||||||
@@ -519,6 +520,9 @@ if x11_enabled
|
|||||||
if xcursor_dep.found()
|
if xcursor_dep.found()
|
||||||
x11_pkgs += ['xcursor']
|
x11_pkgs += ['xcursor']
|
||||||
endif
|
endif
|
||||||
|
if xdamage_dep.found()
|
||||||
|
x11_pkgs += ['xdamage']
|
||||||
|
endif
|
||||||
if xfixes_dep.found()
|
if xfixes_dep.found()
|
||||||
x11_pkgs += ['xfixes']
|
x11_pkgs += ['xfixes']
|
||||||
endif
|
endif
|
||||||
@@ -529,6 +533,7 @@ if x11_enabled
|
|||||||
atk_pkgs += ['atk-bridge-2.0']
|
atk_pkgs += ['atk-bridge-2.0']
|
||||||
|
|
||||||
cdata.set('HAVE_XCURSOR', xcursor_dep.found())
|
cdata.set('HAVE_XCURSOR', xcursor_dep.found())
|
||||||
|
cdata.set('HAVE_XDAMAGE', xdamage_dep.found())
|
||||||
cdata.set('HAVE_XCOMPOSITE', xcomposite_dep.found())
|
cdata.set('HAVE_XCOMPOSITE', xcomposite_dep.found())
|
||||||
cdata.set('HAVE_XFIXES', xfixes_dep.found())
|
cdata.set('HAVE_XFIXES', xfixes_dep.found())
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user