Skip to content

Commit ce1ae24

Browse files
committed
fix workaround for #38
1 parent 214d473 commit ce1ae24

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed

src/flutter-pi.c

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ struct {
117117
size_t crtc_index;
118118
struct gbm_bo *previous_bo;
119119
drmEventContext evctx;
120+
bool disable_vsync;
120121
} drm = {0};
121122

122123
struct {
@@ -284,10 +285,19 @@ bool present(void* userdata) {
284285
next_bo = gbm_surface_lock_front_buffer(gbm.surface);
285286
fb = drm_fb_get_from_bo(next_bo);
286287

287-
ok = drmModePageFlip(drm.fd, drm.crtc_id, fb->fb_id, DRM_MODE_PAGE_FLIP_EVENT, drm.previous_bo);
288-
if (ok) {
289-
perror("failed to queue page flip");
290-
return false;
288+
// workaround for #38
289+
if (!drm.disable_vsync) {
290+
ok = drmModePageFlip(drm.fd, drm.crtc_id, fb->fb_id, DRM_MODE_PAGE_FLIP_EVENT, drm.previous_bo);
291+
if (ok) {
292+
perror("failed to queue page flip");
293+
return false;
294+
}
295+
} else {
296+
ok = drmModeSetCrtc(drm.fd, drm.crtc_id, fb->fb_id, 0, 0, &drm.connector_id, 1, drm.mode);
297+
if (ok == -1) {
298+
perror("failed swap buffers\n");
299+
return false;
300+
}
291301
}
292302

293303
gbm_surface_release_buffer(gbm.surface, drm.previous_bo);
@@ -1083,7 +1093,7 @@ void destroy_display(void) {
10831093
}
10841094

10851095
bool init_application(void) {
1086-
int ok;
1096+
int ok, _errno;
10871097

10881098
printf("Initializing Plugin Registry...\n");
10891099
ok = PluginRegistry_init();
@@ -1130,16 +1140,21 @@ bool init_application(void) {
11301140
// only enable vsync if the kernel supplies valid vblank timestamps
11311141
uint64_t ns = 0;
11321142
ok = drmCrtcGetSequence(drm.fd, drm.crtc_id, NULL, &ns);
1133-
if (ok != 0) {
1134-
perror("Could not get last VBlank timestamp. drmCrtcGetSequence");
1135-
return false;
1136-
}
1143+
if (ok != 0) _errno = errno;
11371144

1138-
if (ns != 0) {
1145+
if ((ok == 0) && (ns != 0)) {
1146+
drm.disable_vsync = false;
11391147
flutter.args.vsync_callback = vsync_callback;
11401148
} else {
1149+
drm.disable_vsync = true;
1150+
if (ok != 0) {
1151+
fprintf(stderr,
1152+
"WARNING: Could not get last vblank timestamp. %s", strerror(_errno));
1153+
} else {
1154+
fprintf(stderr,
1155+
"WARNING: Kernel didn't return a valid vblank timestamp. (timestamp == 0)\n");
1156+
}
11411157
fprintf(stderr,
1142-
"WARNING: Kernel didn't return a valid vblank timestamp.\n"
11431158
" VSync will be disabled.\n"
11441159
" See https://github.com/ardera/flutter-pi/issues/38 for more info.\n");
11451160
}

0 commit comments

Comments
 (0)