commit e995a0c101863688d5f14649ae3de45a7c43789c from: Xiao-Yong via: Russ Cox date: Wed Jun 19 18:32:57 2019 UTC devdraw: cocoa metal screen adds a delayed update (#270) The immediate display of the screen sometimes miss the update from the CPU side memory. No obvious synchronization mechanism is available. In order to make sure the screen updates properly, we set needsDisplay again after 16ms delay to ensure a second screen update. commit - d4e16c838ab2cccd97ad6e24fc290239666eaaac commit + e995a0c101863688d5f14649ae3de45a7c43789c blob - 959df59bf7832d0baef883599ac36162b99b1c37 blob + 984ede03385731021a5e00263c5ffec54a7f1341 --- src/cmd/devdraw/cocoa-screen-metal.m +++ src/cmd/devdraw/cocoa-screen-metal.m @@ -212,12 +212,19 @@ threadmain(int argc, char **argv) + (void)callsetNeedsDisplayInRect:(NSValue *)v { NSRect r; + dispatch_time_t time; r = [v rectValue]; LOG(@"callsetNeedsDisplayInRect(%g, %g, %g, %g)", r.origin.x, r.origin.y, r.size.width, r.size.height); r = [win convertRectFromBacking:r]; LOG(@"setNeedsDisplayInRect(%g, %g, %g, %g)", r.origin.x, r.origin.y, r.size.width, r.size.height); [layer setNeedsDisplayInRect:r]; + + time = dispatch_time(DISPATCH_TIME_NOW, 16 * NSEC_PER_MSEC); + dispatch_after(time, dispatch_get_main_queue(), ^(void){ + [layer setNeedsDisplayInRect:r]; + }); + [myContent enlargeLastInputRect:r]; }