sim_framebuffer: add double buffer for sim

support double framebuffer mode and adapter to the new vsync queue.

Signed-off-by: jianglianfang <jianglianfang@xiaomi.com>
This commit is contained in:
jianglianfang
2023-08-09 19:18:06 +08:00
committed by Xiang Xiao
parent e578f3b20d
commit 479bfd5414
5 changed files with 60 additions and 12 deletions
+8
View File
@@ -355,6 +355,14 @@ config SIM_FBBPP
If you use the X11 display emulation, the selected BPP must match the BPP If you use the X11 display emulation, the selected BPP must match the BPP
of your graphics hardware (probably 32 bits). Default: 8 of your graphics hardware (probably 32 bits). Default: 8
config SIM_FRAMEBUFFER_COUNT
int "Framebuffer count"
depends on SIM_FRAMEBUFFER
default 2
---help---
Framebuffer count.
Simulated frambuffer count. Default: 2
endmenu endmenu
choice choice
+30 -9
View File
@@ -55,7 +55,7 @@ static XShmSegmentInfo g_xshminfo;
static int g_xerror; static int g_xerror;
#endif #endif
static XImage *g_image; static XImage *g_image;
static unsigned char *g_framebuffer; static char *g_framebuffer;
static unsigned short g_fbpixelwidth; static unsigned short g_fbpixelwidth;
static unsigned short g_fbpixelheight; static unsigned short g_fbpixelheight;
static int g_shmcheckpoint = 0; static int g_shmcheckpoint = 0;
@@ -206,6 +206,9 @@ static void sim_x11uninit(void)
if (g_shmcheckpoint > 1) if (g_shmcheckpoint > 1)
{ {
#ifdef CONFIG_SIM_X11NOSHM
g_image->data = g_framebuffer;
#endif
XDestroyImage(g_image); XDestroyImage(g_image);
} }
@@ -247,7 +250,8 @@ static void sim_x11uninitialize(void)
****************************************************************************/ ****************************************************************************/
static inline int sim_x11mapsharedmem(Display *display, static inline int sim_x11mapsharedmem(Display *display,
int depth, unsigned int fblen) int depth, unsigned int fblen,
int fbcount)
{ {
#ifndef CONFIG_SIM_X11NOSHM #ifndef CONFIG_SIM_X11NOSHM
Status result; Status result;
@@ -282,8 +286,9 @@ static inline int sim_x11mapsharedmem(Display *display,
g_shmcheckpoint++; g_shmcheckpoint++;
g_xshminfo.shmid = shmget(IPC_PRIVATE, g_xshminfo.shmid = shmget(IPC_PRIVATE,
g_image->bytes_per_line * g_image->height, g_image->bytes_per_line *
IPC_CREAT | 0777); g_image->height * fbcount,
IPC_CREAT | 0777);
if (g_xshminfo.shmid < 0) if (g_xshminfo.shmid < 0)
{ {
sim_x11uninitialize(); sim_x11uninitialize();
@@ -312,7 +317,7 @@ static inline int sim_x11mapsharedmem(Display *display,
goto shmerror; goto shmerror;
} }
g_framebuffer = (unsigned char *)g_image->data; g_framebuffer = g_image->data;
g_shmcheckpoint++; g_shmcheckpoint++;
} }
else else
@@ -324,10 +329,10 @@ shmerror:
#endif #endif
b_useshm = 0; b_useshm = 0;
g_framebuffer = malloc(fblen); g_framebuffer = malloc(fblen * fbcount);
g_image = XCreateImage(display, DefaultVisual(display, g_screen), g_image = XCreateImage(display, DefaultVisual(display, g_screen),
depth, ZPixmap, 0, (char *)g_framebuffer, depth, ZPixmap, 0, g_framebuffer,
g_fbpixelwidth, g_fbpixelheight, g_fbpixelwidth, g_fbpixelheight,
8, 0); 8, 0);
@@ -357,7 +362,7 @@ shmerror:
int sim_x11initialize(unsigned short width, unsigned short height, int sim_x11initialize(unsigned short width, unsigned short height,
void **fbmem, size_t *fblen, unsigned char *bpp, void **fbmem, size_t *fblen, unsigned char *bpp,
unsigned short *stride) unsigned short *stride, int fbcount)
{ {
XWindowAttributes windowattributes; XWindowAttributes windowattributes;
Display *display; Display *display;
@@ -397,7 +402,7 @@ int sim_x11initialize(unsigned short width, unsigned short height,
/* Map the window to shared memory */ /* Map the window to shared memory */
sim_x11mapsharedmem(display, windowattributes.depth, *fblen); sim_x11mapsharedmem(display, windowattributes.depth, *fblen, fbcount);
*fbmem = (void *)g_framebuffer; *fbmem = (void *)g_framebuffer;
g_display = display; g_display = display;
@@ -438,6 +443,22 @@ int sim_x11closewindow(void)
return 0; return 0;
} }
/****************************************************************************
* Name: sim_x11setoffset
****************************************************************************/
int sim_x11setoffset(unsigned int offset)
{
if (g_display == NULL)
{
return -ENODEV;
}
g_image->data = g_framebuffer + offset;
return 0;
}
/**************************************************************************** /****************************************************************************
* Name: sim_x11cmap * Name: sim_x11cmap
****************************************************************************/ ****************************************************************************/
+15 -1
View File
@@ -421,10 +421,21 @@ void sim_x11loop(void)
#ifdef CONFIG_SIM_X11FB #ifdef CONFIG_SIM_X11FB
static clock_t last; static clock_t last;
clock_t now = clock_systime_ticks(); clock_t now = clock_systime_ticks();
union fb_paninfo_u info;
if (now - last >= MSEC2TICK(16)) if (now - last >= MSEC2TICK(16))
{ {
last = now; last = now;
if (fb_paninfo_count(&g_fbobject, FB_NO_OVERLAY) > 1)
{
fb_remove_paninfo(&g_fbobject, FB_NO_OVERLAY);
}
if (fb_peek_paninfo(&g_fbobject, &info, FB_NO_OVERLAY) == OK)
{
sim_x11setoffset(info.planeinfo.yoffset * info.planeinfo.stride);
}
sim_x11update(); sim_x11update();
} }
#endif #endif
@@ -451,9 +462,12 @@ int up_fbinitialize(int display)
int ret = OK; int ret = OK;
#ifdef CONFIG_SIM_X11FB #ifdef CONFIG_SIM_X11FB
g_planeinfo.xres_virtual = CONFIG_SIM_FBWIDTH;
g_planeinfo.yres_virtual = CONFIG_SIM_FBHEIGHT * CONFIG_SIM_FRAMEBUFFER_COUNT;
ret = sim_x11initialize(CONFIG_SIM_FBWIDTH, CONFIG_SIM_FBHEIGHT, ret = sim_x11initialize(CONFIG_SIM_FBWIDTH, CONFIG_SIM_FBHEIGHT,
&g_planeinfo.fbmem, &g_planeinfo.fblen, &g_planeinfo.fbmem, &g_planeinfo.fblen,
&g_planeinfo.bpp, &g_planeinfo.stride); &g_planeinfo.bpp, &g_planeinfo.stride,
CONFIG_SIM_FRAMEBUFFER_COUNT);
#endif #endif
return ret; return ret;
+2 -1
View File
@@ -282,10 +282,11 @@ void sim_registerblockdevice(void);
#ifdef CONFIG_SIM_X11FB #ifdef CONFIG_SIM_X11FB
int sim_x11initialize(unsigned short width, unsigned short height, int sim_x11initialize(unsigned short width, unsigned short height,
void **fbmem, size_t *fblen, unsigned char *bpp, void **fbmem, size_t *fblen, unsigned char *bpp,
unsigned short *stride); unsigned short *stride, int fbcount);
int sim_x11update(void); int sim_x11update(void);
int sim_x11openwindow(void); int sim_x11openwindow(void);
int sim_x11closewindow(void); int sim_x11closewindow(void);
int sim_x11setoffset(unsigned int offset);
#ifdef CONFIG_FB_CMAP #ifdef CONFIG_FB_CMAP
int sim_x11cmap(unsigned short first, unsigned short len, int sim_x11cmap(unsigned short first, unsigned short len,
unsigned char *red, unsigned char *green, unsigned char *red, unsigned char *green,
+5 -1
View File
@@ -79,6 +79,10 @@
# error "Unsupported BPP" # error "Unsupported BPP"
#endif #endif
#if !defined(CONFIG_LCD_FBCOUNT)
# define CONFIG_LCD_FBCOUNT 1
#endif
/**************************************************************************** /****************************************************************************
* Private Type Definition * Private Type Definition
****************************************************************************/ ****************************************************************************/
@@ -467,7 +471,7 @@ int board_lcd_initialize(void)
#ifdef CONFIG_SIM_X11FB #ifdef CONFIG_SIM_X11FB
ret = sim_x11initialize(CONFIG_SIM_FBWIDTH, CONFIG_SIM_FBHEIGHT, ret = sim_x11initialize(CONFIG_SIM_FBWIDTH, CONFIG_SIM_FBHEIGHT,
(void**)&g_planeinfo.buffer, &g_fblen, (void**)&g_planeinfo.buffer, &g_fblen,
&g_planeinfo.bpp, &g_stride); &g_planeinfo.bpp, &g_stride, CONFIG_LCD_FBCOUNT);
#endif #endif
return ret; return ret;