From: Simon Glass <sjg@chromium.org>
At present, video_sync() has a special case for sandbox. Remove this and
add a sync() method in the sandbox_sdl driver instead.
The sync() method checks the VIDSYNC_FLUSH flag and skips sync operation
if it's not set, avoiding unnecessary SDL updates.
If CONFIG_VIDEO_DAMAGE is enabled, the SDL portion accepts an optional
damage rectangle parameter to support only updating the damaged region.
Use the struct video_bbox definition from the video_defs.h header as
this avoids trying to include too many U-Boot headers in code that is
build with system headers.
Co-developed-by: Claude <noreply@anthropic.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
---
arch/sandbox/cpu/sdl.c | 5 +++--
arch/sandbox/include/asm/sdl.h | 7 +++++--
drivers/video/sandbox_sdl.c | 19 +++++++++++++++++++
drivers/video/video-uclass.c | 4 ----
4 files changed, 27 insertions(+), 8 deletions(-)
@@ -12,6 +12,7 @@
#include <linux/input.h>
#include <SDL2/SDL.h>
#include <asm/state.h>
+#include <video_defs.h>
/**
* struct buf_info - a data buffer holding audio data
@@ -311,7 +312,7 @@ static int copy_to_texture(void *lcd_base, const struct video_bbox *damage)
return 0;
}
-int sandbox_sdl_sync(void *lcd_base)
+int sandbox_sdl_sync(void *lcd_base, const struct video_bbox *damage)
{
struct SDL_Rect rect;
int ret;
@@ -319,7 +320,7 @@ int sandbox_sdl_sync(void *lcd_base)
if (!sdl.texture)
return 0;
SDL_RenderClear(sdl.renderer);
- ret = copy_to_texture(lcd_base, NULL);
+ ret = copy_to_texture(lcd_base, damage);
if (ret) {
printf("copy_to_texture: %d: %s\n", ret, SDL_GetError());
return -EIO;
@@ -10,6 +10,7 @@
#include <video.h>
struct mouse_event;
+struct video_bbox;
#ifdef CONFIG_SANDBOX_SDL
@@ -42,9 +43,10 @@ int sandbox_sdl_remove_display(void);
* user can see it.
*
* @lcd_base: Base of frame buffer
+ * @damage: Optional damage rectangle to limit the update region (may be NULL)
* Return: 0 if screen was updated, -ENODEV is there is no screen.
*/
-int sandbox_sdl_sync(void *lcd_base);
+int sandbox_sdl_sync(void *lcd_base, const struct video_bbox *damage);
/**
* sandbox_sdl_scan_keys() - scan for pressed keys
@@ -129,7 +131,8 @@ static inline int sandbox_sdl_remove_display(void)
return -ENODEV;
}
-static inline int sandbox_sdl_sync(void *lcd_base)
+static inline int sandbox_sdl_sync(void *lcd_base,
+ const struct video_bbox *damage)
{
return -ENODEV;
}
@@ -127,6 +127,24 @@ static int sandbox_sdl_bind(struct udevice *dev)
return ret;
}
+static int sandbox_sdl_video_sync(struct udevice *vid, uint flags)
+{
+ struct video_priv *priv = dev_get_uclass_priv(vid);
+ const struct video_bbox *damage = NULL;
+
+ if (!(flags & VIDSYNC_FLUSH))
+ return 0;
+
+ if (IS_ENABLED(CONFIG_VIDEO_DAMAGE))
+ damage = &priv->damage;
+
+ return sandbox_sdl_sync(priv->fb, damage);
+}
+
+static const struct video_ops sandbox_sdl_ops = {
+ .sync = sandbox_sdl_video_sync,
+};
+
static const struct udevice_id sandbox_sdl_ids[] = {
{ .compatible = "sandbox,lcd-sdl" },
{ }
@@ -139,5 +157,6 @@ U_BOOT_DRIVER(sandbox_lcd_sdl) = {
.bind = sandbox_sdl_bind,
.probe = sandbox_sdl_probe,
.remove = sandbox_sdl_remove,
+ .ops = &sandbox_sdl_ops,
.plat_auto = sizeof(struct sandbox_sdl_plat),
};
@@ -522,10 +522,6 @@ int video_manual_sync(struct udevice *vid, uint flags)
if (IS_ENABLED(CONFIG_VIDEO_COPY) && (flags & VIDSYNC_COPY))
video_flush_dcache(vid, true);
-#if defined(CONFIG_VIDEO_SANDBOX_SDL)
- /* to see the copy framebuffer, use priv->copy_fb */
- sandbox_sdl_sync(priv->fb);
-#endif
priv->last_sync = get_timer(0);
if (IS_ENABLED(CONFIG_VIDEO_DAMAGE)) {