arch/sim: Drive up_x11update by work to simplify up_idle.

This commit is contained in:
Xiang Xiao 2020-02-10 01:38:45 +08:00 committed by Ouss4
parent 14a82f40d2
commit e6c67bdd78
5 changed files with 81 additions and 107 deletions

View file

@ -177,6 +177,8 @@ if SIM_FRAMEBUFFER
config SIM_X11FB
bool "Use X11 window"
default n
select SCHED_LPWORK
select SIM_WALLTIME
---help---
Use an X11 graphics window to simulate the graphics device"

View file

@ -44,6 +44,8 @@
#include <errno.h>
#include <debug.h>
#include <nuttx/clock.h>
#include <nuttx/wqueue.h>
#include <nuttx/nx/nx.h>
#include <nuttx/nx/nxglib.h>
#include <nuttx/video/fb.h>
@ -144,6 +146,8 @@ static const struct fb_planeinfo_s g_planeinfo =
.bpp = CONFIG_SIM_FBBPP,
};
#else
static struct work_s g_updatework;
/* This structure describes the single, X11 color plane */
static struct fb_planeinfo_s g_planeinfo;
@ -179,10 +183,6 @@ struct fb_vtable_s g_fbobject =
#endif
};
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
@ -346,6 +346,18 @@ static int up_setcursor(FAR struct fb_vtable_s *vtable,
}
#endif
/****************************************************************************
* Name: up_updatework
****************************************************************************/
#ifdef CONFIG_SIM_X11FB
static void up_updatework(FAR void *arg)
{
work_queue(LPWORK, &g_updatework, up_updatework, NULL, MSEC2TICK(33));
up_x11update();
}
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
@ -368,13 +380,19 @@ static int up_setcursor(FAR struct fb_vtable_s *vtable,
int up_fbinitialize(int display)
{
int ret = OK;
#ifdef CONFIG_SIM_X11FB
return up_x11initialize(CONFIG_SIM_FBWIDTH, CONFIG_SIM_FBHEIGHT,
&g_planeinfo.fbmem, &g_planeinfo.fblen,
&g_planeinfo.bpp, &g_planeinfo.stride);
#else
return OK;
ret = up_x11initialize(CONFIG_SIM_FBWIDTH, CONFIG_SIM_FBHEIGHT,
&g_planeinfo.fbmem, &g_planeinfo.fblen,
&g_planeinfo.bpp, &g_planeinfo.stride);
if (ret == OK)
{
work_queue(LPWORK, &g_updatework, up_updatework, NULL, MSEC2TICK(33));
}
#endif
return ret;
}
/****************************************************************************

View file

@ -40,9 +40,8 @@
#include <nuttx/config.h>
#include <time.h>
#include <nuttx/arch.h>
#include <nuttx/power/pm.h>
#include "up_internal.h"
@ -52,22 +51,6 @@
#define PM_IDLE_DOMAIN 0 /* Revisit */
/****************************************************************************
* Private Data
****************************************************************************/
#ifdef CONFIG_SIM_X11FB
static int g_x11refresh = 0;
#endif
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
#ifdef CONFIG_SIM_X11FB
extern void up_x11update(void);
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
@ -142,26 +125,11 @@ void up_idle(void)
}
#endif
#if defined(CONFIG_SIM_WALLTIME) || defined(CONFIG_SIM_X11FB)
#ifdef CONFIG_SIM_WALLTIME
/* Wait a bit so that the nxsched_process_timer() is called close to the
* correct rate.
*/
up_hostusleep(1000000 / CLK_TCK);
/* Handle X11-related events */
#ifdef CONFIG_SIM_X11FB
if (g_x11initialized)
{
/* Update the display periodically */
g_x11refresh += 1000000 / CLK_TCK;
if (g_x11refresh > 500000)
{
up_x11update();
}
}
#endif
#endif
}

View file

@ -197,10 +197,6 @@
#ifndef __ASSEMBLY__
#ifdef CONFIG_SIM_X11FB
extern int g_x11initialized;
#endif
#ifdef CONFIG_SMP
/* These spinlocks are used in the SMP configuration in order to implement
* up_cpu_pause(). The protocol for CPUn to pause CPUm is as follows
@ -288,6 +284,7 @@ unsigned long up_getwalltime(void);
int up_x11initialize(unsigned short width, unsigned short height,
void **fbmem, size_t *fblen, unsigned char *bpp,
unsigned short *stride);
void up_x11update(void);
#ifdef CONFIG_FB_CMAP
int up_x11cmap(unsigned short first, unsigned short len,
unsigned char *red, unsigned char *green,

View file

@ -56,7 +56,6 @@
/* Also used in up_x11eventloop */
Display *g_display;
int g_x11initialized;
/****************************************************************************
* Private Data
@ -191,37 +190,33 @@ static int up_x11untraperrors(void)
static void up_x11uninitX(void)
{
if (g_x11initialized)
{
#ifndef CONFIG_SIM_X11NOSHM
if (g_shmcheckpoint > 4)
{
XShmDetach(g_display, &g_xshminfo);
}
if (g_shmcheckpoint > 4)
{
XShmDetach(g_display, &g_xshminfo);
}
if (g_shmcheckpoint > 3)
{
shmdt(g_xshminfo.shmaddr);
}
if (g_shmcheckpoint > 3)
{
shmdt(g_xshminfo.shmaddr);
}
if (g_shmcheckpoint > 2)
{
shmctl(g_xshminfo.shmid, IPC_RMID, 0);
}
if (g_shmcheckpoint > 2)
{
shmctl(g_xshminfo.shmid, IPC_RMID, 0);
}
#endif
if (g_shmcheckpoint > 1)
{
XDestroyImage(g_image);
}
if (g_shmcheckpoint > 1)
{
XDestroyImage(g_image);
}
/* Un-grab the mouse buttons */
/* Un-grab the mouse buttons */
#if defined(CONFIG_SIM_TOUCHSCREEN) || defined(CONFIG_SIM_AJOYSTICK)
XUngrabButton(g_display, Button1, AnyModifier, g_window);
XUngrabButton(g_display, Button1, AnyModifier, g_window);
#endif
g_x11initialized = 0;
}
XCloseDisplay(g_display);
}
@ -364,47 +359,41 @@ int up_x11initialize(unsigned short width, unsigned short height,
int depth;
int ret;
/* Check if we are already initialized */
/* Save inputs */
if (!g_x11initialized)
g_fbpixelwidth = width;
g_fbpixelheight = height;
/* Create the X11 window */
ret = up_x11createframe();
if (ret < 0)
{
/* Save inputs */
g_fbpixelwidth = width;
g_fbpixelheight = height;
/* Create the X11 window */
ret = up_x11createframe();
if (ret < 0)
{
return ret;
}
/* Determine the supported pixel bpp of the current window */
XGetWindowAttributes(g_display, DefaultRootWindow(g_display), &windowAttributes);
/* Get the pixel depth. If the depth is 24-bits, use 32 because X expects
* 32-bit aligment anyway.
*/
depth = windowAttributes.depth;
if (depth == 24)
{
depth = 32;
}
*bpp = depth;
*stride = (depth * width / 8);
*fblen = (*stride * height);
/* Map the window to shared memory */
up_x11mapsharedmem(windowAttributes.depth, *fblen);
g_x11initialized = 1;
return ret;
}
/* Determine the supported pixel bpp of the current window */
XGetWindowAttributes(g_display, DefaultRootWindow(g_display), &windowAttributes);
/* Get the pixel depth. If the depth is 24-bits, use 32 because X expects
* 32-bit aligment anyway.
*/
depth = windowAttributes.depth;
if (depth == 24)
{
depth = 32;
}
*bpp = depth;
*stride = (depth * width / 8);
*fblen = (*stride * height);
/* Map the window to shared memory */
up_x11mapsharedmem(windowAttributes.depth, *fblen);
*fbmem = (void *)g_framebuffer;
return 0;
}