build,libweston: Use struct timespec for animations
Change code related to animations to use struct timespec to represent time. This commit is part of a larger effort to transition the Weston codebase to struct timespec. Signed-off-by: Alexandros Frantzis <alexandros.frantzis@collabora.com> Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> This bumps the libweston major version due to breakage in the animation ABI. The commits following this one break more ABI in other parts. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
committed by
Pekka Paalanen
parent
6c2752a863
commit
8250a61de1
+2
-2
@@ -3,9 +3,9 @@ m4_define([weston_minor_version], [0])
|
|||||||
m4_define([weston_micro_version], [90])
|
m4_define([weston_micro_version], [90])
|
||||||
m4_define([weston_version],
|
m4_define([weston_version],
|
||||||
[weston_major_version.weston_minor_version.weston_micro_version])
|
[weston_major_version.weston_minor_version.weston_micro_version])
|
||||||
m4_define([libweston_major_version], [3])
|
m4_define([libweston_major_version], [4])
|
||||||
m4_define([libweston_minor_version], [0])
|
m4_define([libweston_minor_version], [0])
|
||||||
m4_define([libweston_patch_version], [90])
|
m4_define([libweston_patch_version], [0])
|
||||||
|
|
||||||
AC_PREREQ([2.64])
|
AC_PREREQ([2.64])
|
||||||
AC_INIT([weston],
|
AC_INIT([weston],
|
||||||
|
|||||||
+14
-12
@@ -41,6 +41,7 @@
|
|||||||
#include "weston-desktop-shell-server-protocol.h"
|
#include "weston-desktop-shell-server-protocol.h"
|
||||||
#include "shared/config-parser.h"
|
#include "shared/config-parser.h"
|
||||||
#include "shared/helpers.h"
|
#include "shared/helpers.h"
|
||||||
|
#include "shared/timespec-util.h"
|
||||||
#include "libweston-desktop/libweston-desktop.h"
|
#include "libweston-desktop/libweston-desktop.h"
|
||||||
|
|
||||||
#define DEFAULT_NUM_WORKSPACES 1
|
#define DEFAULT_NUM_WORKSPACES 1
|
||||||
@@ -1027,7 +1028,7 @@ reverse_workspace_change_animation(struct desktop_shell *shell,
|
|||||||
shell->workspaces.anim_to = to;
|
shell->workspaces.anim_to = to;
|
||||||
shell->workspaces.anim_from = from;
|
shell->workspaces.anim_from = from;
|
||||||
shell->workspaces.anim_dir = -1 * shell->workspaces.anim_dir;
|
shell->workspaces.anim_dir = -1 * shell->workspaces.anim_dir;
|
||||||
shell->workspaces.anim_timestamp = 0;
|
shell->workspaces.anim_timestamp = (struct timespec) { 0 };
|
||||||
|
|
||||||
weston_layer_set_position(&to->layer, WESTON_LAYER_POSITION_NORMAL);
|
weston_layer_set_position(&to->layer, WESTON_LAYER_POSITION_NORMAL);
|
||||||
weston_layer_set_position(&from->layer, WESTON_LAYER_POSITION_NORMAL - 1);
|
weston_layer_set_position(&from->layer, WESTON_LAYER_POSITION_NORMAL - 1);
|
||||||
@@ -1084,14 +1085,15 @@ finish_workspace_change_animation(struct desktop_shell *shell,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
animate_workspace_change_frame(struct weston_animation *animation,
|
animate_workspace_change_frame(struct weston_animation *animation,
|
||||||
struct weston_output *output, uint32_t msecs)
|
struct weston_output *output,
|
||||||
|
const struct timespec *time)
|
||||||
{
|
{
|
||||||
struct desktop_shell *shell =
|
struct desktop_shell *shell =
|
||||||
container_of(animation, struct desktop_shell,
|
container_of(animation, struct desktop_shell,
|
||||||
workspaces.animation);
|
workspaces.animation);
|
||||||
struct workspace *from = shell->workspaces.anim_from;
|
struct workspace *from = shell->workspaces.anim_from;
|
||||||
struct workspace *to = shell->workspaces.anim_to;
|
struct workspace *to = shell->workspaces.anim_to;
|
||||||
uint32_t t;
|
int64_t t;
|
||||||
double x, y;
|
double x, y;
|
||||||
|
|
||||||
if (workspace_is_empty(from) && workspace_is_empty(to)) {
|
if (workspace_is_empty(from) && workspace_is_empty(to)) {
|
||||||
@@ -1099,19 +1101,19 @@ animate_workspace_change_frame(struct weston_animation *animation,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shell->workspaces.anim_timestamp == 0) {
|
if (timespec_is_zero(&shell->workspaces.anim_timestamp)) {
|
||||||
if (shell->workspaces.anim_current == 0.0)
|
if (shell->workspaces.anim_current == 0.0)
|
||||||
shell->workspaces.anim_timestamp = msecs;
|
shell->workspaces.anim_timestamp = *time;
|
||||||
else
|
else
|
||||||
shell->workspaces.anim_timestamp =
|
timespec_add_msec(&shell->workspaces.anim_timestamp,
|
||||||
msecs -
|
time,
|
||||||
/* Invers of movement function 'y' below. */
|
/* Invers of movement function 'y' below. */
|
||||||
(asin(1.0 - shell->workspaces.anim_current) *
|
-(asin(1.0 - shell->workspaces.anim_current) *
|
||||||
DEFAULT_WORKSPACE_CHANGE_ANIMATION_LENGTH *
|
DEFAULT_WORKSPACE_CHANGE_ANIMATION_LENGTH *
|
||||||
M_2_PI);
|
M_2_PI));
|
||||||
}
|
}
|
||||||
|
|
||||||
t = msecs - shell->workspaces.anim_timestamp;
|
t = timespec_sub_to_msec(time, &shell->workspaces.anim_timestamp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* x = [0, π/2]
|
* x = [0, π/2]
|
||||||
@@ -1154,7 +1156,7 @@ animate_workspace_change(struct desktop_shell *shell,
|
|||||||
shell->workspaces.anim_from = from;
|
shell->workspaces.anim_from = from;
|
||||||
shell->workspaces.anim_to = to;
|
shell->workspaces.anim_to = to;
|
||||||
shell->workspaces.anim_current = 0.0;
|
shell->workspaces.anim_current = 0.0;
|
||||||
shell->workspaces.anim_timestamp = 0;
|
shell->workspaces.anim_timestamp = (struct timespec) { 0 };
|
||||||
|
|
||||||
output = container_of(shell->compositor->output_list.next,
|
output = container_of(shell->compositor->output_list.next,
|
||||||
struct weston_output, link);
|
struct weston_output, link);
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ struct desktop_shell {
|
|||||||
struct weston_animation animation;
|
struct weston_animation animation;
|
||||||
struct wl_list anim_sticky_list;
|
struct wl_list anim_sticky_list;
|
||||||
int anim_dir;
|
int anim_dir;
|
||||||
uint32_t anim_timestamp;
|
struct timespec anim_timestamp;
|
||||||
double anim_current;
|
double anim_current;
|
||||||
struct workspace *anim_from;
|
struct workspace *anim_from;
|
||||||
struct workspace *anim_to;
|
struct workspace *anim_to;
|
||||||
|
|||||||
+18
-11
@@ -30,12 +30,14 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include "compositor.h"
|
#include "compositor.h"
|
||||||
#include "shared/helpers.h"
|
#include "shared/helpers.h"
|
||||||
|
#include "shared/timespec-util.h"
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
weston_spring_init(struct weston_spring *spring,
|
weston_spring_init(struct weston_spring *spring,
|
||||||
@@ -52,7 +54,7 @@ weston_spring_init(struct weston_spring *spring,
|
|||||||
}
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
weston_spring_update(struct weston_spring *spring, uint32_t msec)
|
weston_spring_update(struct weston_spring *spring, const struct timespec *time)
|
||||||
{
|
{
|
||||||
double force, v, current, step;
|
double force, v, current, step;
|
||||||
|
|
||||||
@@ -61,14 +63,16 @@ weston_spring_update(struct weston_spring *spring, uint32_t msec)
|
|||||||
* This handles the case where time moves backwards or forwards in
|
* This handles the case where time moves backwards or forwards in
|
||||||
* large jumps.
|
* large jumps.
|
||||||
*/
|
*/
|
||||||
if (msec - spring->timestamp > 1000) {
|
if (timespec_sub_to_msec(time, &spring->timestamp) > 1000) {
|
||||||
weston_log("unexpectedly large timestamp jump (from %u to %u)\n",
|
weston_log("unexpectedly large timestamp jump "
|
||||||
spring->timestamp, msec);
|
"(from %" PRId64 " to %" PRId64 ")\n",
|
||||||
spring->timestamp = msec - 1000;
|
timespec_to_msec(&spring->timestamp),
|
||||||
|
timespec_to_msec(time));
|
||||||
|
timespec_add_msec(&spring->timestamp, time, -1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
step = 0.01;
|
step = 0.01;
|
||||||
while (4 < msec - spring->timestamp) {
|
while (4 < timespec_sub_to_msec(time, &spring->timestamp)) {
|
||||||
current = spring->current;
|
current = spring->current;
|
||||||
v = current - spring->previous;
|
v = current - spring->previous;
|
||||||
force = spring->k * (spring->target - current) / 10.0 +
|
force = spring->k * (spring->target - current) / 10.0 +
|
||||||
@@ -108,7 +112,7 @@ weston_spring_update(struct weston_spring *spring, uint32_t msec)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
spring->timestamp += 4;
|
timespec_add_msec(&spring->timestamp, &spring->timestamp, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +165,8 @@ handle_animation_view_destroy(struct wl_listener *listener, void *data)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
weston_view_animation_frame(struct weston_animation *base,
|
weston_view_animation_frame(struct weston_animation *base,
|
||||||
struct weston_output *output, uint32_t msecs)
|
struct weston_output *output,
|
||||||
|
const struct timespec *time)
|
||||||
{
|
{
|
||||||
struct weston_view_animation *animation =
|
struct weston_view_animation *animation =
|
||||||
container_of(base,
|
container_of(base,
|
||||||
@@ -170,9 +175,9 @@ weston_view_animation_frame(struct weston_animation *base,
|
|||||||
animation->view->surface->compositor;
|
animation->view->surface->compositor;
|
||||||
|
|
||||||
if (base->frame_counter <= 1)
|
if (base->frame_counter <= 1)
|
||||||
animation->spring.timestamp = msecs;
|
animation->spring.timestamp = *time;
|
||||||
|
|
||||||
weston_spring_update(&animation->spring, msecs);
|
weston_spring_update(&animation->spring, time);
|
||||||
|
|
||||||
if (weston_spring_done(&animation->spring)) {
|
if (weston_spring_done(&animation->spring)) {
|
||||||
weston_view_schedule_repaint(animation->view);
|
weston_view_schedule_repaint(animation->view);
|
||||||
@@ -254,8 +259,10 @@ weston_view_animation_create(struct weston_view *view,
|
|||||||
static void
|
static void
|
||||||
weston_view_animation_run(struct weston_view_animation *animation)
|
weston_view_animation_run(struct weston_view_animation *animation)
|
||||||
{
|
{
|
||||||
|
struct timespec zero_time = { 0 };
|
||||||
|
|
||||||
animation->animation.frame_counter = 0;
|
animation->animation.frame_counter = 0;
|
||||||
weston_view_animation_frame(&animation->animation, NULL, 0);
|
weston_view_animation_frame(&animation->animation, NULL, &zero_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@@ -2292,12 +2292,15 @@ weston_output_repaint(struct weston_output *output, void *repaint_data)
|
|||||||
struct wl_list frame_callback_list;
|
struct wl_list frame_callback_list;
|
||||||
pixman_region32_t output_damage;
|
pixman_region32_t output_damage;
|
||||||
int r;
|
int r;
|
||||||
|
struct timespec frame_time;
|
||||||
|
|
||||||
if (output->destroying)
|
if (output->destroying)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
TL_POINT("core_repaint_begin", TLP_OUTPUT(output), TLP_END);
|
TL_POINT("core_repaint_begin", TLP_OUTPUT(output), TLP_END);
|
||||||
|
|
||||||
|
timespec_from_msec(&frame_time, output->frame_time);
|
||||||
|
|
||||||
/* Rebuild the surface list and update surface transforms up front. */
|
/* Rebuild the surface list and update surface transforms up front. */
|
||||||
weston_compositor_build_view_list(ec);
|
weston_compositor_build_view_list(ec);
|
||||||
|
|
||||||
@@ -2352,7 +2355,7 @@ weston_output_repaint(struct weston_output *output, void *repaint_data)
|
|||||||
|
|
||||||
wl_list_for_each_safe(animation, next, &output->animation_list, link) {
|
wl_list_for_each_safe(animation, next, &output->animation_list, link) {
|
||||||
animation->frame_counter++;
|
animation->frame_counter++;
|
||||||
animation->frame(animation, output, output->frame_time);
|
animation->frame(animation, output, &frame_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
TL_POINT("core_repaint_posted", TLP_OUTPUT(output), TLP_END);
|
TL_POINT("core_repaint_posted", TLP_OUTPUT(output), TLP_END);
|
||||||
|
|||||||
@@ -101,7 +101,8 @@ struct weston_mode {
|
|||||||
|
|
||||||
struct weston_animation {
|
struct weston_animation {
|
||||||
void (*frame)(struct weston_animation *animation,
|
void (*frame)(struct weston_animation *animation,
|
||||||
struct weston_output *output, uint32_t msecs);
|
struct weston_output *output,
|
||||||
|
const struct timespec *time);
|
||||||
int frame_counter;
|
int frame_counter;
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
};
|
};
|
||||||
@@ -119,7 +120,7 @@ struct weston_spring {
|
|||||||
double target;
|
double target;
|
||||||
double previous;
|
double previous;
|
||||||
double min, max;
|
double min, max;
|
||||||
uint32_t timestamp;
|
struct timespec timestamp;
|
||||||
uint32_t clip;
|
uint32_t clip;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1352,7 +1353,7 @@ void
|
|||||||
weston_spring_init(struct weston_spring *spring,
|
weston_spring_init(struct weston_spring *spring,
|
||||||
double k, double current, double target);
|
double k, double current, double target);
|
||||||
void
|
void
|
||||||
weston_spring_update(struct weston_spring *spring, uint32_t msec);
|
weston_spring_update(struct weston_spring *spring, const struct timespec *time);
|
||||||
int
|
int
|
||||||
weston_spring_done(struct weston_spring *spring);
|
weston_spring_done(struct weston_spring *spring);
|
||||||
|
|
||||||
|
|||||||
@@ -24,10 +24,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "compositor.h"
|
#include "compositor.h"
|
||||||
|
#include "shared/timespec-util.h"
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
weston_view_geometry_dirty(struct weston_view *view)
|
weston_view_geometry_dirty(struct weston_view *view)
|
||||||
@@ -59,17 +61,18 @@ main(int argc, char *argv[])
|
|||||||
const double friction = 1400;
|
const double friction = 1400;
|
||||||
|
|
||||||
struct weston_spring spring;
|
struct weston_spring spring;
|
||||||
uint32_t time = 0;
|
struct timespec time = { 0 };
|
||||||
|
|
||||||
weston_spring_init(&spring, k, current, target);
|
weston_spring_init(&spring, k, current, target);
|
||||||
spring.friction = friction;
|
spring.friction = friction;
|
||||||
spring.previous = 0.48;
|
spring.previous = 0.48;
|
||||||
spring.timestamp = 0;
|
spring.timestamp = (struct timespec) { 0 };
|
||||||
|
|
||||||
while (!weston_spring_done(&spring)) {
|
while (!weston_spring_done(&spring)) {
|
||||||
printf("\t%d\t%f\n", time, spring.current);
|
printf("\t%" PRId64 "\t%f\n",
|
||||||
weston_spring_update(&spring, time);
|
timespec_to_msec(&time), spring.current);
|
||||||
time += 16;
|
weston_spring_update(&spring, &time);
|
||||||
|
timespec_add_msec(&time, &time, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+4
-3
@@ -36,12 +36,13 @@
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
weston_zoom_frame_z(struct weston_animation *animation,
|
weston_zoom_frame_z(struct weston_animation *animation,
|
||||||
struct weston_output *output, uint32_t msecs)
|
struct weston_output *output,
|
||||||
|
const struct timespec *time)
|
||||||
{
|
{
|
||||||
if (animation->frame_counter <= 1)
|
if (animation->frame_counter <= 1)
|
||||||
output->zoom.spring_z.timestamp = msecs;
|
output->zoom.spring_z.timestamp = *time;
|
||||||
|
|
||||||
weston_spring_update(&output->zoom.spring_z, msecs);
|
weston_spring_update(&output->zoom.spring_z, time);
|
||||||
|
|
||||||
if (output->zoom.spring_z.current > output->zoom.max_level)
|
if (output->zoom.spring_z.current > output->zoom.max_level)
|
||||||
output->zoom.spring_z.current = output->zoom.max_level;
|
output->zoom.spring_z.current = output->zoom.max_level;
|
||||||
|
|||||||
Reference in New Issue
Block a user