All of lore.kernel.org
 help / color / mirror / Atom feed
* [psplash][PATCH 1/3] Support --with-font configure option to use other font headers
@ 2019-12-17 10:22 Andrei Gherzan
  2019-12-17 10:22 ` [psplash][PATCH 2/3] Double buffering support Andrei Gherzan
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Andrei Gherzan @ 2019-12-17 10:22 UTC (permalink / raw)
  To: yocto; +Cc: David Steinberg

From: David Steinberg <david@sonabuzz.com>

Signed-off-by: David Steinberg <david@sonabuzz.com>
---
 Makefile.am  | 4 ++--
 configure.ac | 6 ++++++
 psplash.c    | 6 +++---
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index a14152a..3721a6e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,11 +1,11 @@
 bin_PROGRAMS=psplash psplash-write
 
-AM_CFLAGS = $(GCC_FLAGS) -D_GNU_SOURCE
+AM_CFLAGS = $(GCC_FLAGS) -D_GNU_SOURCE -DFONT_HEADER=\"$(FONT_NAME)-font.h\" -DFONT_DEF=$(FONT_NAME)_font
 
 psplash_SOURCES = psplash.c psplash.h psplash-fb.c psplash-fb.h \
                   psplash-console.c psplash-console.h           \
 		  psplash-colors.h psplash-config.h		\
-		  psplash-poky-img.h psplash-bar-img.h radeon-font.h
+		  psplash-poky-img.h psplash-bar-img.h $(FONT_NAME)-font.h
 
 psplash_write_SOURCES = psplash-write.c psplash.h
 
diff --git a/configure.ac b/configure.ac
index 1c4d919..9e78ac0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -14,6 +14,12 @@ fi
 
 AC_SUBST(GCC_FLAGS)
 
+AC_ARG_WITH([font],
+    AS_HELP_STRING([--with-font], [Set font to use (default is 'radeon')]),
+    [FONT_NAME=$withval],
+    [FONT_NAME=radeon])
+AC_SUBST([FONT_NAME])
+
 AC_OUTPUT([
 Makefile
 ])
diff --git a/psplash.c b/psplash.c
index 992e199..f6442f1 100644
--- a/psplash.c
+++ b/psplash.c
@@ -23,7 +23,7 @@
 #include "psplash-colors.h"
 #include "psplash-poky-img.h"
 #include "psplash-bar-img.h"
-#include "radeon-font.h"
+#include FONT_HEADER
 
 #define SPLIT_LINE_POS(fb)                                  \
 	(  (fb)->height                                     \
@@ -45,7 +45,7 @@ psplash_draw_msg (PSplashFB *fb, const char *msg)
 {
   int w, h;
 
-  psplash_fb_text_size (&w, &h, &radeon_font, msg);
+  psplash_fb_text_size (&w, &h, &FONT_DEF, msg);
 
   DBG("displaying '%s' %ix%i\n", msg, w, h);
 
@@ -62,7 +62,7 @@ psplash_draw_msg (PSplashFB *fb, const char *msg)
 			(fb->width-w)/2, 
 			SPLIT_LINE_POS(fb) - h,
 			PSPLASH_TEXT_COLOR,
-			&radeon_font,
+			&FONT_DEF,
 			msg);
 }
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [psplash][PATCH 2/3] Double buffering support
  2019-12-17 10:22 [psplash][PATCH 1/3] Support --with-font configure option to use other font headers Andrei Gherzan
@ 2019-12-17 10:22 ` Andrei Gherzan
  2019-12-17 10:22 ` [psplash][PATCH 3/3] Add configure flags for fullscreen logo and no startup message Andrei Gherzan
  2020-01-15 18:06 ` [psplash][PATCH 1/3] Support --with-font configure option to use other font headers Andrei Gherzan
  2 siblings, 0 replies; 4+ messages in thread
From: Andrei Gherzan @ 2019-12-17 10:22 UTC (permalink / raw)
  To: yocto; +Cc: Andrei Gherzan

From: Andrei Gherzan <agherzan@hanoverdisplays.com>

'psplash' uses only one buffer which can cause tearing artifacts. This
change uses the FBIOPAN_DISPLAY ioctl as a way to handle page flipping
and also does that after a vsync interrupt to remove any tearing issues.

Signed-off-by: Andrei Gherzan <agherzan@hanoverdisplays.com>
---
 psplash-fb.c | 121 ++++++++++++++++++++++++++++++++++++++++++---------
 psplash-fb.h |   8 ++++
 psplash.c    |  10 ++++-
 3 files changed, 118 insertions(+), 21 deletions(-)

diff --git a/psplash-fb.c b/psplash-fb.c
index c064d18..3cb5d2d 100644
--- a/psplash-fb.c
+++ b/psplash-fb.c
@@ -18,6 +18,46 @@
 #include <endian.h>
 #include "psplash.h"
 
+static void
+psplash_wait_for_vsync(PSplashFB *fb)
+{
+  int err = ioctl(fb->fd, FBIO_WAITFORVSYNC, 0);
+  if (err != 0)
+    fprintf(stderr, "Error, FB vsync ioctl [%d]\n", err);
+}
+
+void
+psplash_fb_flip(PSplashFB *fb, int sync)
+{
+  char *tmp;
+
+  if (fb->double_buffering) {
+
+    /* Carry out the flip after a vsync */
+    psplash_wait_for_vsync(fb);
+
+    /* Switch the current activate area in fb */
+    if (fb->fb_var.yoffset == 0 ) {
+      fb->fb_var.yoffset = fb->real_height;
+    } else {
+      fb->fb_var.yoffset = 0;
+    }
+    if (ioctl(fb->fd, FBIOPAN_DISPLAY, &fb->fb_var) == -1 ) {
+      fprintf(stderr, "psplash_fb_flip: FBIOPAN_DISPLAY failed\n");
+    }
+
+    /* Switch the front and back data pointers */
+    tmp = fb->fdata;
+    fb->fdata = fb->bdata;
+    fb->bdata = tmp;
+
+    /* Sync new front to new back when requested */
+    if (sync) {
+      memcpy(fb->bdata, fb->fdata, fb->stride * fb->real_height);
+    }
+  }
+}
+
 void
 psplash_fb_destroy (PSplashFB *fb)
 {
@@ -163,6 +203,29 @@ psplash_fb_new (int angle, int fbdev_id)
       goto fail;
     }
 
+  /* Setup double virtual resolution for double buffering */
+  if (ioctl(fb->fd, FBIOPAN_DISPLAY, &fb_var) == -1) {
+    fprintf(stderr, "FBIOPAN_DISPLAY not supported, double buffering disabled");
+  } else {
+    if (fb_var.yres_virtual == fb_var.yres * 2) {
+      DBG("Virtual resolution already double");
+      fb->double_buffering = 1;
+    } else {
+      fb_var.yres_virtual = fb_var.yres * 2;
+      if (ioctl(fb->fd, FBIOPUT_VSCREENINFO, &fb_var) == -1) {
+        fprintf(stderr, "FBIOPUT_VSCREENINFO failed, double buffering disabled");
+      } else {
+        if (ioctl(fb->fd, FBIOGET_FSCREENINFO, &fb_fix) == -1) {
+          perror(" Error getting the fixed framebuffer info");
+          goto fail;
+        } else {
+          DBG("Virtual resolution set to double");
+          fb->double_buffering = 1;
+        }
+      }
+    }
+  }
+
   fb->real_width  = fb->width  = fb_var.xres;
   fb->real_height = fb->height = fb_var.yres;
   fb->bpp    = fb_var.bits_per_pixel;
@@ -201,8 +264,7 @@ psplash_fb_new (int angle, int fbdev_id)
       fb->width, fb->height, fb->bpp, fb->stride);
 
   fb->base = (char *) mmap ((caddr_t) NULL,
-			    /*fb_fix.smem_len */
-			    fb->stride * fb->height,
+			    fb_fix.smem_len,
 			    PROT_READ|PROT_WRITE,
 			    MAP_SHARED,
 			    fb->fd, 0);
@@ -217,6 +279,23 @@ psplash_fb_new (int angle, int fbdev_id)
 
   fb->data = fb->base + off;
 
+  if (fb->double_buffering) {
+    /* fb_var is needed when flipping the buffers */
+    memcpy(&fb->fb_var, &fb_var, sizeof(struct fb_var_screeninfo));
+    if (fb->fb_var.yoffset == 0) {
+      printf("to back\n");
+      fb->fdata = fb->data;
+      fb->bdata = fb->data + fb->stride * fb->height;
+    } else {
+      printf("to front\n");
+      fb->fdata = fb->data + fb->stride * fb->height;
+      fb->bdata = fb->data;
+    }
+  } else {
+    fb->fdata = fb->data;
+    fb->bdata = fb->data;
+  }
+
 #if 0
   /* FIXME: No support for 8pp as yet  */
   if (visual == FB_VISUAL_PSEUDOCOLOR
@@ -274,6 +353,8 @@ psplash_fb_plot_pixel (PSplashFB    *fb,
 		       uint8        green,
 		       uint8        blue)
 {
+  /* Always write to back data (bdata) which points to the right data with or
+   * without double buffering support */
   int off;
 
   if (x < 0 || x > fb->width-1 || y < 0 || y > fb->height-1)
@@ -301,22 +382,22 @@ psplash_fb_plot_pixel (PSplashFB    *fb,
       {
       case 24:
 #if __BYTE_ORDER == __BIG_ENDIAN
-        *(fb->data + off + 0) = red;
-        *(fb->data + off + 1) = green;
-        *(fb->data + off + 2) = blue;
+        *(fb->bdata + off + 0) = red;
+        *(fb->bdata + off + 1) = green;
+        *(fb->bdata + off + 2) = blue;
 #else
-        *(fb->data + off + 0) = blue;
-        *(fb->data + off + 1) = green;
-        *(fb->data + off + 2) = red;
+        *(fb->bdata + off + 0) = blue;
+        *(fb->bdata + off + 1) = green;
+        *(fb->bdata + off + 2) = red;
 #endif
         break;
       case 32:
-        *(volatile uint32_t *) (fb->data + off)
+        *(volatile uint32_t *) (fb->bdata + off)
           = (red << 16) | (green << 8) | (blue);
         break;
 
       case 16:
-        *(volatile uint16_t *) (fb->data + off)
+        *(volatile uint16_t *) (fb->bdata + off)
 	  = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
         break;
       default:
@@ -328,21 +409,21 @@ psplash_fb_plot_pixel (PSplashFB    *fb,
       {
       case 24:
 #if __BYTE_ORDER == __BIG_ENDIAN
-        *(fb->data + off + 0) = blue;
-        *(fb->data + off + 1) = green;
-        *(fb->data + off + 2) = red;
+        *(fb->bdata + off + 0) = blue;
+        *(fb->bdata + off + 1) = green;
+        *(fb->bdata + off + 2) = red;
 #else
-        *(fb->data + off + 0) = red;
-        *(fb->data + off + 1) = green;
-        *(fb->data + off + 2) = blue;
+        *(fb->bdata + off + 0) = red;
+        *(fb->bdata + off + 1) = green;
+        *(fb->bdata + off + 2) = blue;
 #endif
         break;
       case 32:
-        *(volatile uint32_t *) (fb->data + off)
+        *(volatile uint32_t *) (fb->bdata + off)
           = (blue << 16) | (green << 8) | (red);
         break;
       case 16:
-        *(volatile uint16_t *) (fb->data + off)
+        *(volatile uint16_t *) (fb->bdata + off)
 	  = ((blue >> 3) << 11) | ((green >> 2) << 5) | (red >> 3);
         break;
       default:
@@ -353,13 +434,13 @@ psplash_fb_plot_pixel (PSplashFB    *fb,
     switch (fb->bpp)
       {
       case 32:
-        *(volatile uint32_t *) (fb->data + off)
+        *(volatile uint32_t *) (fb->bdata + off)
 	  = ((red >> (8 - fb->red_length)) << fb->red_offset) 
 	      | ((green >> (8 - fb->green_length)) << fb->green_offset)
 	      | ((blue >> (8 - fb->blue_length)) << fb->blue_offset);
         break;
       case 16:
-        *(volatile uint16_t *) (fb->data + off)
+        *(volatile uint16_t *) (fb->bdata + off)
 	  = ((red >> (8 - fb->red_length)) << fb->red_offset) 
 	      | ((green >> (8 - fb->green_length)) << fb->green_offset)
 	      | ((blue >> (8 - fb->blue_length)) << fb->blue_offset);
diff --git a/psplash-fb.h b/psplash-fb.h
index d0dce10..2f0cdff 100644
--- a/psplash-fb.h
+++ b/psplash-fb.h
@@ -29,6 +29,7 @@ enum RGBMode {
 typedef struct PSplashFB
 {
   int            fd;			
+  struct fb_var_screeninfo fb_var;
   struct termios save_termios;	        
   int            type;		        
   int            visual;		
@@ -38,6 +39,11 @@ typedef struct PSplashFB
   char		*data;
   char		*base;
 
+  /* Support for double buffering */
+  int		double_buffering;
+  char		*bdata;
+  char		*fdata;
+
   int            angle, fbdev_id;
   int            real_width, real_height;
 
@@ -93,5 +99,7 @@ psplash_fb_draw_text (PSplashFB         *fb,
 		      const PSplashFont *font,
 		      const char        *text);
 
+void
+psplash_fb_flip(PSplashFB *fb, int sync);
 
 #endif
diff --git a/psplash.c b/psplash.c
index f6442f1..61122fc 100644
--- a/psplash.c
+++ b/psplash.c
@@ -126,6 +126,7 @@ parse_command (PSplashFB *fb, char *string)
       return 1;
     }
 
+  psplash_fb_flip(fb, 0);
   return 0;
 }
 
@@ -309,8 +310,15 @@ main (int argc, char** argv)
   psplash_draw_msg (fb, PSPLASH_STARTUP_MSG);
 #endif
 
-  psplash_main (fb, pipe_fd, 0);
+  /* Scene set so let's flip the buffers. */
+  /* The first time we also synchronize the buffers so we can build on an
+   * existing scene. After the first scene is set in both buffers, only the
+   * text and progress bar change which overwrite the specific areas with every
+   * update.
+   */
+  psplash_fb_flip(fb, 1);
 
+  psplash_main (fb, pipe_fd, 0);
 
   psplash_fb_destroy (fb);
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [psplash][PATCH 3/3] Add configure flags for fullscreen logo and no startup message
  2019-12-17 10:22 [psplash][PATCH 1/3] Support --with-font configure option to use other font headers Andrei Gherzan
  2019-12-17 10:22 ` [psplash][PATCH 2/3] Double buffering support Andrei Gherzan
@ 2019-12-17 10:22 ` Andrei Gherzan
  2020-01-15 18:06 ` [psplash][PATCH 1/3] Support --with-font configure option to use other font headers Andrei Gherzan
  2 siblings, 0 replies; 4+ messages in thread
From: Andrei Gherzan @ 2019-12-17 10:22 UTC (permalink / raw)
  To: yocto; +Cc: Andrei Gherzan

From: Andrei Gherzan <agherzan@hanoverdisplays.com>

Signed-off-by: Andrei Gherzan <agherzan@hanoverdisplays.com>
---
 Makefile.am      |  2 +-
 configure.ac     | 18 ++++++++++++++++++
 psplash-config.h |  4 ++++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/Makefile.am b/Makefile.am
index 3721a6e..3f1cfc2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
 bin_PROGRAMS=psplash psplash-write
 
-AM_CFLAGS = $(GCC_FLAGS) -D_GNU_SOURCE -DFONT_HEADER=\"$(FONT_NAME)-font.h\" -DFONT_DEF=$(FONT_NAME)_font
+AM_CFLAGS = $(GCC_FLAGS) $(EXTRA_GCC_FLAGS) -D_GNU_SOURCE -DFONT_HEADER=\"$(FONT_NAME)-font.h\" -DFONT_DEF=$(FONT_NAME)_font
 
 psplash_SOURCES = psplash.c psplash.h psplash-fb.c psplash-fb.h \
                   psplash-console.c psplash-console.h           \
diff --git a/configure.ac b/configure.ac
index 9e78ac0..e2b7f58 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,6 +20,24 @@ AC_ARG_WITH([font],
     [FONT_NAME=radeon])
 AC_SUBST([FONT_NAME])
 
+AC_ARG_ENABLE([startup-msg],
+    AS_HELP_STRING([--disable-startup-msg], [Disable text banner output on startup]),
+    [disable_startup_msg=true],
+    [disable_startup_msg=false])
+AS_IF([test x$disable_startup_msg = xtrue], [
+    EXTRA_GCC_FLAGS="$EXTRA_GCC_FLAGS -DPSPLASH_DISABLE_STARTUP_MSG"
+])
+
+AC_ARG_ENABLE([img-fullscreen],
+    AS_HELP_STRING([--enable-img-fullscreen], [Enable the logo image in fullscreen mode)]),
+    [img_fullscreen=true],
+    [img_fullscreen=false])
+AS_IF([test x$img_fullscreen = xtrue], [
+    EXTRA_GCC_FLAGS="$EXTRA_GCC_FLAGS -DPSPLASH_IMG_FULLSCREEN=1"
+])
+
+AC_SUBST(EXTRA_GCC_FLAGS)
+
 AC_OUTPUT([
 Makefile
 ])
diff --git a/psplash-config.h b/psplash-config.h
index 82bb76d..ecbf3df 100644
--- a/psplash-config.h
+++ b/psplash-config.h
@@ -20,10 +20,14 @@
 #define _HAVE_PSPLASH_CONFIG_H
 
 /* Text to output on program start; if undefined, output nothing */
+#ifndef PSPLASH_DISABLE_STARTUP_MSG
 #define PSPLASH_STARTUP_MSG ""
+#endif
 
 /* Bool indicating if the image is fullscreen, as opposed to split screen */
+#ifndef PSPLASH_IMG_FULLSCREEN
 #define PSPLASH_IMG_FULLSCREEN 0
+#endif
 
 /* Position of the image split from top edge, numerator of fraction */
 #define PSPLASH_IMG_SPLIT_NUMERATOR 5
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [psplash][PATCH 1/3] Support --with-font configure option to use other font headers
  2019-12-17 10:22 [psplash][PATCH 1/3] Support --with-font configure option to use other font headers Andrei Gherzan
  2019-12-17 10:22 ` [psplash][PATCH 2/3] Double buffering support Andrei Gherzan
  2019-12-17 10:22 ` [psplash][PATCH 3/3] Add configure flags for fullscreen logo and no startup message Andrei Gherzan
@ 2020-01-15 18:06 ` Andrei Gherzan
  2 siblings, 0 replies; 4+ messages in thread
From: Andrei Gherzan @ 2020-01-15 18:06 UTC (permalink / raw)
  To: yocto; +Cc: David Steinberg

[-- Attachment #1: Type: text/plain, Size: 2580 bytes --]

Hi,

On Tue, Dec 17, 2019 at 10:22 AM <andrei@gherzan.ro> wrote:

> From: David Steinberg <david@sonabuzz.com>
>
> Signed-off-by: David Steinberg <david@sonabuzz.com>
>

Small ping for this patch set.


> ---
>  Makefile.am  | 4 ++--
>  configure.ac | 6 ++++++
>  psplash.c    | 6 +++---
>  3 files changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/Makefile.am b/Makefile.am
> index a14152a..3721a6e 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -1,11 +1,11 @@
>  bin_PROGRAMS=psplash psplash-write
>
> -AM_CFLAGS = $(GCC_FLAGS) -D_GNU_SOURCE
> +AM_CFLAGS = $(GCC_FLAGS) -D_GNU_SOURCE
> -DFONT_HEADER=\"$(FONT_NAME)-font.h\" -DFONT_DEF=$(FONT_NAME)_font
>
>  psplash_SOURCES = psplash.c psplash.h psplash-fb.c psplash-fb.h \
>                    psplash-console.c psplash-console.h           \
>                   psplash-colors.h psplash-config.h             \
> -                 psplash-poky-img.h psplash-bar-img.h radeon-font.h
> +                 psplash-poky-img.h psplash-bar-img.h $(FONT_NAME)-font.h
>
>  psplash_write_SOURCES = psplash-write.c psplash.h
>
> diff --git a/configure.ac b/configure.ac
> index 1c4d919..9e78ac0 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -14,6 +14,12 @@ fi
>
>  AC_SUBST(GCC_FLAGS)
>
> +AC_ARG_WITH([font],
> +    AS_HELP_STRING([--with-font], [Set font to use (default is
> 'radeon')]),
> +    [FONT_NAME=$withval],
> +    [FONT_NAME=radeon])
> +AC_SUBST([FONT_NAME])
> +
>  AC_OUTPUT([
>  Makefile
>  ])
> diff --git a/psplash.c b/psplash.c
> index 992e199..f6442f1 100644
> --- a/psplash.c
> +++ b/psplash.c
> @@ -23,7 +23,7 @@
>  #include "psplash-colors.h"
>  #include "psplash-poky-img.h"
>  #include "psplash-bar-img.h"
> -#include "radeon-font.h"
> +#include FONT_HEADER
>
>  #define SPLIT_LINE_POS(fb)                                  \
>         (  (fb)->height                                     \
> @@ -45,7 +45,7 @@ psplash_draw_msg (PSplashFB *fb, const char *msg)
>  {
>    int w, h;
>
> -  psplash_fb_text_size (&w, &h, &radeon_font, msg);
> +  psplash_fb_text_size (&w, &h, &FONT_DEF, msg);
>
>    DBG("displaying '%s' %ix%i\n", msg, w, h);
>
> @@ -62,7 +62,7 @@ psplash_draw_msg (PSplashFB *fb, const char *msg)
>                         (fb->width-w)/2,
>                         SPLIT_LINE_POS(fb) - h,
>                         PSPLASH_TEXT_COLOR,
> -                       &radeon_font,
> +                       &FONT_DEF,
>                         msg);
>  }
>
> --
> 2.17.1
>
>
--
Andrei Gherzan

[-- Attachment #2: Type: text/html, Size: 4023 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-01-15 18:07 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-17 10:22 [psplash][PATCH 1/3] Support --with-font configure option to use other font headers Andrei Gherzan
2019-12-17 10:22 ` [psplash][PATCH 2/3] Double buffering support Andrei Gherzan
2019-12-17 10:22 ` [psplash][PATCH 3/3] Add configure flags for fullscreen logo and no startup message Andrei Gherzan
2020-01-15 18:06 ` [psplash][PATCH 1/3] Support --with-font configure option to use other font headers Andrei Gherzan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.