From: Simon Glass <simon.glass@canonical.com>
Add an optional struct parameter to sandbox_sdl_sync() to control sync
behaviour. Initially this supports drawing a 10-pixel grid overlay on the
display, useful for debugging UI layout.
Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---
arch/sandbox/cpu/sdl.c | 20 +++++++++++++++++++-
arch/sandbox/include/asm/sdl.h | 8 ++++++--
arch/sandbox/include/asm/sdl_sync.h | 21 +++++++++++++++++++++
drivers/video/sandbox_sdl.c | 2 +-
4 files changed, 47 insertions(+), 4 deletions(-)
create mode 100644 arch/sandbox/include/asm/sdl_sync.h
@@ -11,6 +11,7 @@
#include <sysreset.h>
#include <linux/input.h>
#include <SDL2/SDL.h>
+#include <asm/sdl_sync.h>
#include <asm/state.h>
#include <video_defs.h>
@@ -310,7 +311,21 @@ static int copy_to_texture(void *lcd_base, const struct vid_bbox *damage)
return 0;
}
-int sandbox_sdl_sync(void *lcd_base, const struct vid_bbox *damage)
+static void draw_grid(void)
+{
+ int x, y;
+
+ SDL_SetRenderDrawColor(sdl.renderer, 192, 192, 192, SDL_ALPHA_OPAQUE);
+
+ for (x = 0; x < sdl.vis_width; x += 10)
+ SDL_RenderDrawLine(sdl.renderer, x, 0, x, sdl.vis_height - 1);
+
+ for (y = 0; y < sdl.vis_height; y += 10)
+ SDL_RenderDrawLine(sdl.renderer, 0, y, sdl.vis_width - 1, y);
+}
+
+int sandbox_sdl_sync(void *lcd_base, const struct vid_bbox *damage,
+ const struct sandbox_sdl_sync_opts *opts)
{
struct SDL_Rect rect;
int ret;
@@ -329,6 +344,9 @@ int sandbox_sdl_sync(void *lcd_base, const struct vid_bbox *damage)
return -EIO;
}
+ if (opts && opts->draw_grid)
+ draw_grid();
+
/*
* On some machines this does not appear. Draw an empty rectangle which
* seems to fix that.
@@ -8,6 +8,7 @@
#include <errno.h>
#include <video.h>
+#include <asm/sdl_sync.h>
struct mouse_event;
struct vid_bbox;
@@ -44,9 +45,11 @@ int sandbox_sdl_remove_display(void);
*
* @lcd_base: Base of frame buffer
* @damage: Optional damage rectangle to limit the update region (may be NULL)
+ * @opts: Optional sync options (may be NULL)
* Return: 0 if screen was updated, -ENODEV is there is no screen.
*/
-int sandbox_sdl_sync(void *lcd_base, const struct vid_bbox *damage);
+int sandbox_sdl_sync(void *lcd_base, const struct vid_bbox *damage,
+ const struct sandbox_sdl_sync_opts *opts);
/**
* sandbox_sdl_scan_keys() - scan for pressed keys
@@ -139,7 +142,8 @@ static inline int sandbox_sdl_remove_display(void)
}
static inline int sandbox_sdl_sync(void *lcd_base,
- const struct vid_bbox *damage)
+ const struct vid_bbox *damage,
+ const struct sandbox_sdl_sync_opts *opts)
{
return -ENODEV;
}
new file mode 100644
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2026 Canonical Ltd
+ * Written by Simon Glass <simon.glass@canonical.com>
+ */
+
+#ifndef __SANDBOX_SDL_SYNC_H
+#define __SANDBOX_SDL_SYNC_H
+
+#include <stdbool.h>
+
+/**
+ * struct sandbox_sdl_sync_opts - Options for sandbox_sdl_sync()
+ *
+ * @draw_grid: Draw a grid overlay on the display
+ */
+struct sandbox_sdl_sync_opts {
+ bool draw_grid;
+};
+
+#endif
@@ -146,7 +146,7 @@ static int sandbox_sdl_video_sync(struct udevice *vid, uint flags)
memset(&plat->last_sync_damage, '\0',
sizeof(plat->last_sync_damage));
- return sandbox_sdl_sync(uc_priv->fb, damage);
+ return sandbox_sdl_sync(uc_priv->fb, damage, NULL);
}
static const struct video_ops sandbox_sdl_ops = {