20
20
21
21
#define FBDEV_NAME "FRAMEBUFFER"
22
22
#define FBDEV_DEFAULT "/dev/fb0"
23
+ #define FBIO_CACHE_SYNC 0x4630
23
24
#define SCREEN (x ) ((twin_context_t *) x)->screen
24
25
#define PRIV (x ) ((twin_fbdev_t *) ((twin_context_t *) x)->priv)
25
26
@@ -56,12 +57,23 @@ static void _twin_fbdev_put_span(twin_coord_t left,
56
57
return ;
57
58
58
59
twin_coord_t width = right - left ;
59
- off_t off = top * screen -> width + left ;
60
- uint32_t * dest =
61
- (uint32_t * ) ((uintptr_t ) tx -> fb_base + (off * sizeof (uint32_t )));
60
+ off_t off = tx -> fb_fix .line_length * top + 4 * left ;
61
+ unsigned char * dest = (unsigned char * ) tx -> fb_base + off ;
62
62
memcpy (dest , pixels , width * sizeof (uint32_t ));
63
63
}
64
64
65
+ static void twin_fbdev_cache_sync (void * closure )
66
+ {
67
+ twin_fbdev_t * tx = PRIV (closure );
68
+ unsigned int args [2 ];
69
+ args [0 ] = tx -> fb_base ;
70
+ args [1 ] = tx -> fb_base + tx -> fb_var .yres_virtual * tx -> fb_fix .line_length ;
71
+ ioctl (tx -> fb_fd , FBIO_CACHE_SYNC , args );
72
+
73
+ struct fb_var_screeninfo var = tx -> fb_var ;
74
+ ioctl (tx -> fb_fd , FBIOPAN_DISPLAY , & var );
75
+ }
76
+
65
77
static void twin_fbdev_get_screen_size (twin_fbdev_t * tx ,
66
78
int * width ,
67
79
int * height )
@@ -85,6 +97,7 @@ static bool twin_fbdev_work(void *closure)
85
97
86
98
if (twin_screen_damaged (screen ))
87
99
twin_screen_update (screen );
100
+ twin_fbdev_cache_sync (closure );
88
101
return true;
89
102
}
90
103
0 commit comments