]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
video: sandbox: Avoid duplicate display windows
authorSimon Glass <sjg@chromium.org>
Fri, 19 Nov 2021 20:23:46 +0000 (13:23 -0700)
committerAnatolij Gustschin <agust@denx.de>
Sun, 26 Dec 2021 22:02:19 +0000 (23:02 +0100)
When unit tests are run they currently create a new window. Update the
code so that the old one is removed first. This avoids the confusion as to
which one is active.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/sandbox/cpu/sdl.c
arch/sandbox/include/asm/sdl.h
drivers/video/sandbox_sdl.c

index 7ff0df2ee54dd831bb657ef1660ff57182f5a47e..f4ca36b35c8c49f676ea49cfa3a0289ef9ff8c36 100644 (file)
@@ -44,6 +44,7 @@ struct buf_info {
  * @stopping: true if audio will stop once it runs out of data
  * @texture: SDL texture to use for U-Boot display contents
  * @renderer: SDL renderer to use
+ * @screen: SDL window to use
  * @src_depth: Number of bits per pixel in the source frame buffer (that we read
  * from and render to SDL)
  */
@@ -63,6 +64,7 @@ static struct sdl_info {
        bool stopping;
        SDL_Texture *texture;
        SDL_Renderer *renderer;
+       SDL_Window *screen;
        int src_depth;
 } sdl;
 
@@ -101,6 +103,23 @@ static int sandbox_sdl_ensure_init(void)
        return 0;
 }
 
+int sandbox_sdl_remove_display(void)
+{
+       if (!sdl.renderer) {
+               printf("SDL renderer does not exist\n");
+               return -ENOENT;
+       }
+
+       SDL_DestroyTexture(sdl.texture);
+       SDL_DestroyRenderer(sdl.renderer);
+       SDL_DestroyWindow(sdl.screen);
+       sdl.texture = NULL;
+       sdl.renderer = NULL;
+       sdl.screen = NULL;
+
+       return 0;
+}
+
 int sandbox_sdl_init_display(int width, int height, int log2_bpp,
                             bool double_size)
 {
@@ -112,6 +131,9 @@ int sandbox_sdl_init_display(int width, int height, int log2_bpp,
        err = sandbox_sdl_ensure_init();
        if (err)
                return err;
+       if (sdl.renderer)
+               sandbox_sdl_remove_display();
+
        if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) {
                printf("Unable to initialise SDL LCD: %s\n", SDL_GetError());
                return -EPERM;
@@ -134,16 +156,15 @@ int sandbox_sdl_init_display(int width, int height, int log2_bpp,
                log2_bpp = 5;
        sdl.depth = 1 << log2_bpp;
        sdl.pitch = sdl.width * sdl.depth / 8;
-       SDL_Window *screen = SDL_CreateWindow("U-Boot", SDL_WINDOWPOS_UNDEFINED,
-                                             SDL_WINDOWPOS_UNDEFINED,
-                                             sdl.vis_width, sdl.vis_height,
-                                             SDL_WINDOW_RESIZABLE);
-       if (!screen) {
+       sdl.screen = SDL_CreateWindow("U-Boot", SDL_WINDOWPOS_UNDEFINED,
+                                     SDL_WINDOWPOS_UNDEFINED, sdl.vis_width,
+                                     sdl.vis_height, SDL_WINDOW_RESIZABLE);
+       if (!sdl.screen) {
                printf("Unable to initialise SDL screen: %s\n",
                       SDL_GetError());
                return -EIO;
        }
-       sdl.renderer = SDL_CreateRenderer(screen, -1,
+       sdl.renderer = SDL_CreateRenderer(sdl.screen, -1,
                                          SDL_RENDERER_ACCELERATED |
                                          SDL_RENDERER_PRESENTVSYNC);
        if (!sdl.renderer) {
index 47fc4889d2074c2c7d734cb1e86d8acf95413262..25dbdb59442820766cbaabb01490c3aab40ac1da 100644 (file)
 int sandbox_sdl_init_display(int width, int height, int log2_bpp,
                             bool double_size);
 
+/**
+ * sandbox_sdl_remove_display() - Remove the SDL screen
+ *
+ * @return 0 if OK, -ENOENT if the SDL had not been inited.
+ */
+int sandbox_sdl_remove_display(void);
+
 /**
  * sandbox_sdl_sync() - Sync current U-Boot LCD frame buffer to SDL
  *
index 32739de4feb78772e44c53c69bf080377b15f8d8..6e430b28244ecb92a9cbc9cfe0f86dd6110dd73e 100644 (file)
@@ -63,6 +63,20 @@ static void set_bpp(struct udevice *dev, enum video_log2_bpp l2bpp)
                uc_plat->size *= 2;
 }
 
+static int sandbox_sdl_remove(struct udevice *dev)
+{
+       /*
+        * Removing the display it a bit annoying when running unit tests, since
+        * they remove all devices. It is nice to be able to see what the test
+        * wrote onto the display. So this comment is just here to show how to
+        * do it, if we want to make it optional one day.
+        *
+        * sandbox_sdl_remove_display();
+        */
+
+       return 0;
+}
+
 static int sandbox_sdl_bind(struct udevice *dev)
 {
        struct sandbox_sdl_plat *plat = dev_get_plat(dev);
@@ -90,5 +104,6 @@ U_BOOT_DRIVER(sandbox_lcd_sdl) = {
        .of_match = sandbox_sdl_ids,
        .bind   = sandbox_sdl_bind,
        .probe  = sandbox_sdl_probe,
+       .remove = sandbox_sdl_remove,
        .plat_auto      = sizeof(struct sandbox_sdl_plat),
 };