All of lore.kernel.org
 help / color / mirror / Atom feed
* [WIP PATCH 2/2] SDL support
@ 2009-06-15 15:21 Vladimir 'phcoder' Serbinenko
  2009-06-15 23:01 ` Pavel Roskin
  2009-08-23 12:47 ` Robert Millan
  0 siblings, 2 replies; 4+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-06-15 15:21 UTC (permalink / raw)
  To: The development of GRUB 2

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

Hello here I have a preliminary SDL support. With this WIP patch you
have to add LD_FLAGS=-lSDL to configure command. Another two problems
are that window is never repainted and input still has to go to
terminal window
This will of course be fixed in the next patch just that I knew that
debugging video in grub-emu could help Collin with gfxmenu I release
this early.
@Pavel Roskin: could I perhaps create a personal named branch(es) in
your git mirror so that I could expose my works as they progress?

-- 
Regards
Vladimir 'phcoder' Serbinenko

[-- Attachment #2: sdlvideo.diff --]
[-- Type: text/x-diff, Size: 10363 bytes --]

diff --git a/commands/videotest.c b/commands/videotest.c
index 6fe4b9b..6f23560 100644
--- a/commands/videotest.c
+++ b/commands/videotest.c
@@ -159,7 +159,7 @@ grub_cmd_videotest (grub_command_t cmd __attribute__ ((unused)),
       grub_video_blit_render_target (text_layer, GRUB_VIDEO_BLIT_BLEND, 0, 0,
                                      0, 0, width, height);
     }
-
+  grub_video_swap_buffers ();
   grub_getkey ();
 
   grub_video_delete_render_target (text_layer);
diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk
index 66fdbd4..60b87b0 100644
--- a/conf/i386-pc.rmk
+++ b/conf/i386-pc.rmk
@@ -153,6 +153,12 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c	\
 	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
 	fs/ufs.c fs/xfs.c fs/afs.c fs/tar.c				\
 	\
+	video/video.c video/fb/video_fb.c video/fb/fbblit.c 		\
+	video/fb/fbfill.c video/fb/fbutil.c commands/videotest.c 	\
+	video/bitmap.c video/readers/tga.c video/readers/jpeg.c		\
+	video/readers/png.c font/font_cmd.c font/font.c term/gfxterm.c	\
+	io/bufio.c util/sdl.c						\
+	\
 	util/console.c util/hostfs.c util/grub-emu.c util/misc.c	\
 	util/hostdisk.c util/getroot.c					\
 	util/i386/pc/misc.c						\
diff --git a/term/gfxterm.c b/term/gfxterm.c
index ef93bb7..f48379a 100644
--- a/term/gfxterm.c
+++ b/term/gfxterm.c
@@ -462,6 +462,7 @@ dirty_region_redraw (void)
   redraw_screen_rect (x, y, width, height);
 
   dirty_region_reset ();
+  grub_video_swap_buffers ();
 }
 
 static void
diff --git a/util/sdl.c b/util/sdl.c
new file mode 100644
index 0000000..7de6a16
--- /dev/null
+++ b/util/sdl.c
@@ -0,0 +1,249 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2005,2006,2007,2008,2009  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define grub_video_render_target grub_video_fbrender_target
+
+#include <grub/err.h>
+#include <grub/types.h>
+#include <grub/dl.h>
+#include <grub/misc.h>
+#include <grub/mm.h>
+#include <grub/video.h>
+#include <grub/video_fb.h>
+#include <SDL/SDL.h>
+
+static SDL_Surface *window = 0;
+static struct grub_video_render_target sdl_render_target;
+
+static grub_err_t
+grub_video_sdl_set_palette (unsigned int start, unsigned int count,
+                            struct grub_video_palette_data *palette_data);
+
+static grub_err_t
+grub_video_sdl_init (void)
+{
+  window = 0;
+  grub_memset (&sdl_render_target, 0, sizeof(sdl_render_target));
+
+  if (SDL_Init (SDL_INIT_VIDEO) < 0)
+    return grub_error (GRUB_ERR_BAD_DEVICE, "Couldn't init SDL: %s",
+		       SDL_GetError ());
+  /* Reset frame buffer and render target variables.  */
+  grub_memset (&sdl_render_target, 0, sizeof(sdl_render_target));
+  return grub_video_fb_init ();
+}
+
+static grub_err_t
+grub_video_sdl_fini (void)
+{
+  SDL_Quit ();
+  window = 0;
+  grub_memset (&sdl_render_target, 0, sizeof(sdl_render_target));
+
+  return grub_video_fb_fini ();
+}
+
+static inline unsigned int
+get_mask_size (grub_uint32_t mask)
+{
+  unsigned i;
+  for (i = 0; mask > 1U << i; i++);
+  return i;
+}
+
+static grub_err_t
+grub_video_sdl_setup (unsigned int width, unsigned int height,
+                      unsigned int mode_type)
+{
+  int depth;
+  int flags = 0;
+  /* Decode depth from mode_type.  If it is zero, then autodetect.  */
+  depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
+          >> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
+
+  if (mode_type & GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED)
+    flags |= SDL_DOUBLEBUF;
+
+  window = SDL_SetVideoMode (width, height, depth, flags | SDL_HWSURFACE);
+  if (! window)
+    window = SDL_SetVideoMode (width, height, depth, flags | SDL_SWSURFACE);
+  if (! window)
+    return grub_error (GRUB_ERR_BAD_DEVICE, "Couldn't open window: %s",
+		       SDL_GetError ());
+
+  grub_memset (&sdl_render_target, 0, sizeof (sdl_render_target));
+
+  sdl_render_target.mode_info.width = window->w;
+  sdl_render_target.mode_info.height = window->h;
+  sdl_render_target.mode_info.mode_type = 0;
+  if (window->flags & SDL_DOUBLEBUF)
+    sdl_render_target.mode_info.mode_type 
+      |= GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED;
+  if (window->format->palette)
+    sdl_render_target.mode_info.mode_type |= GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
+  else
+    sdl_render_target.mode_info.mode_type |= GRUB_VIDEO_MODE_TYPE_RGB;
+
+  sdl_render_target.mode_info.bpp = window->format->BitsPerPixel;
+  sdl_render_target.mode_info.bytes_per_pixel = window->format->BytesPerPixel;
+  sdl_render_target.mode_info.pitch = window->pitch;
+
+  /* In index color mode, number of colors.  In RGB mode this is 256.  */
+  if (window->format->palette)
+    sdl_render_target.mode_info.number_of_colors 
+      = 1 << window->format->BitsPerPixel;
+  else
+    sdl_render_target.mode_info.number_of_colors = 256;
+
+  if (! window->format->palette)
+    {
+      sdl_render_target.mode_info.red_mask_size 
+	= get_mask_size (window->format->Rmask >> window->format->Rshift);
+      sdl_render_target.mode_info.red_field_pos = window->format->Rshift;
+      sdl_render_target.mode_info.green_mask_size 
+	= get_mask_size (window->format->Gmask >> window->format->Gshift);
+      sdl_render_target.mode_info.green_field_pos = window->format->Gshift;
+      sdl_render_target.mode_info.blue_mask_size 
+	= get_mask_size (window->format->Bmask >> window->format->Bshift);
+      sdl_render_target.mode_info.blue_field_pos = window->format->Bshift;
+      sdl_render_target.mode_info.reserved_mask_size 
+	= get_mask_size (window->format->Amask >> window->format->Ashift);
+      sdl_render_target.mode_info.reserved_field_pos = window->format->Ashift;
+      sdl_render_target.mode_info.blit_format 
+	= grub_video_get_blit_format (&sdl_render_target.mode_info);
+    }
+
+  sdl_render_target.viewport.x = sdl_render_target.viewport.y = 0;
+  sdl_render_target.viewport.width = window->w;
+  sdl_render_target.viewport.height = window->h;
+  sdl_render_target.is_allocated = 0;
+  sdl_render_target.data = window->pixels;
+
+  /* Copy default palette to initialize emulated palette.  */
+  grub_video_sdl_set_palette (0, (sizeof (grub_video_fbstd_colors) 
+				  / sizeof (grub_video_fbstd_colors[0])),
+			      grub_video_fbstd_colors);
+
+  /* Reset render target to SDL one.  */
+  return grub_video_fb_set_active_render_target (&sdl_render_target);
+}
+
+static grub_err_t
+grub_video_sdl_set_palette (unsigned int start, unsigned int count,
+                            struct grub_video_palette_data *palette_data)
+{
+  unsigned i;
+  if (window->format->palette)
+    {
+      SDL_Color *tmp = grub_malloc (count * sizeof (tmp[0]));
+      for (i = 0; i < count; i++)
+	{
+	  tmp[i].r = palette_data[i].r;
+	  tmp[i].g = palette_data[i].g;
+	  tmp[i].b = palette_data[i].b;
+	  tmp[i].unused = palette_data[i].a;
+	}
+      SDL_SetColors (window, tmp, start, count);
+      grub_free (tmp);
+    }
+
+  return grub_video_fb_set_palette (start, count, palette_data);
+}
+
+grub_err_t
+grub_video_sdl_set_viewport (unsigned int x, unsigned int y,
+			     unsigned int width, unsigned int height)
+{
+  /* Make sure viewport is withing screen dimensions.  If viewport was set
+     to be out of the region, mark its size as zero.  */
+  if (x > (unsigned) window->w)
+    {
+      x = 0;
+      width = 0;
+    }
+
+  if (y > (unsigned) window->h)
+    {
+      y = 0;
+      height = 0;
+    }
+
+  if (x + width > (unsigned) window->w)
+    width = window->w - x;
+
+  if (y + height > (unsigned) window->h)
+    height = window->h - y;
+  return grub_video_fb_set_viewport (x, y, width, height);
+}
+
+static grub_err_t
+grub_video_sdl_swap_buffers (void)
+{
+  if (SDL_Flip (window) < 0)
+    return grub_error (GRUB_ERR_BAD_DEVICE, "couldn't swap buffers: %s",
+		       SDL_GetError ());
+  return GRUB_ERR_NONE;
+}
+
+static grub_err_t
+grub_video_sdl_set_active_render_target (struct grub_video_render_target *target)
+{
+  if (target == GRUB_VIDEO_RENDER_TARGET_FRONT_BUFFER)
+    return grub_video_fb_set_active_render_target (&sdl_render_target);
+
+  return grub_video_fb_set_active_render_target (target);
+}
+
+static struct grub_video_adapter grub_video_sdl_adapter =
+  {
+    .name = "SDL Video Driver",
+
+    .init = grub_video_sdl_init,
+    .fini = grub_video_sdl_fini,
+    .setup = grub_video_sdl_setup,
+    .get_info = grub_video_fb_get_info,
+    .set_palette = grub_video_sdl_set_palette,
+    .get_palette = grub_video_fb_get_palette,
+    .set_viewport = grub_video_fb_set_viewport,
+    .get_viewport = grub_video_fb_get_viewport,
+    .map_color = grub_video_fb_map_color,
+    .map_rgb = grub_video_fb_map_rgb,
+    .map_rgba = grub_video_fb_map_rgba,
+    .unmap_color = grub_video_fb_unmap_color,
+    .fill_rect = grub_video_fb_fill_rect,
+    .blit_bitmap = grub_video_fb_blit_bitmap,
+    .blit_render_target = grub_video_fb_blit_render_target,
+    .scroll = grub_video_fb_scroll,
+    .swap_buffers = grub_video_sdl_swap_buffers,
+    .create_render_target = grub_video_fb_create_render_target,
+    .delete_render_target = grub_video_fb_delete_render_target,
+    .set_active_render_target = grub_video_sdl_set_active_render_target,
+    .get_active_render_target = grub_video_fb_get_active_render_target,
+
+    .next = 0
+  };
+
+GRUB_MOD_INIT(sdl)
+{
+  grub_video_register (&grub_video_sdl_adapter);
+}
+
+GRUB_MOD_FINI(sdl)
+{
+  grub_video_unregister (&grub_video_sdl_adapter);
+}
diff --git a/video/video.c b/video/video.c
index 8271d79..2f70274 100644
--- a/video/video.c
+++ b/video/video.c
@@ -699,8 +699,6 @@ grub_video_set_mode (char *modestring,
 /* Initialize Video API module.  */
 GRUB_MOD_INIT(video_video)
 {
-  grub_video_adapter_active = 0;
-  grub_video_adapter_list = 0;
 }
 
 /* Finalize Video API module.  */

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

* Re: [WIP PATCH 2/2] SDL support
  2009-06-15 15:21 [WIP PATCH 2/2] SDL support Vladimir 'phcoder' Serbinenko
@ 2009-06-15 23:01 ` Pavel Roskin
  2009-06-15 23:08   ` Vladimir 'phcoder' Serbinenko
  2009-08-23 12:47 ` Robert Millan
  1 sibling, 1 reply; 4+ messages in thread
From: Pavel Roskin @ 2009-06-15 23:01 UTC (permalink / raw)
  To: The development of GRUB 2

On Mon, 2009-06-15 at 17:21 +0200, Vladimir 'phcoder' Serbinenko wrote:
> Hello here I have a preliminary SDL support. With this WIP patch you
> have to add LD_FLAGS=-lSDL to configure command. Another two problems
> are that window is never repainted and input still has to go to
> terminal window
> This will of course be fixed in the next patch just that I knew that
> debugging video in grub-emu could help Collin with gfxmenu I release
> this early.

I like the idea, as it makes grub-emu more useful for debugging.

> @Pavel Roskin: could I perhaps create a personal named branch(es) in
> your git mirror so that I could expose my works as they progress?

I believe it's better to publish your work elsewhere.  There is no
access control in git within a repository, and I don't want to take any
risk that the mirror is accidentally replaced with a branch with
experimental patches.

You can create a separate repository on repo.or.cz o on another site.

-- 
Regards,
Pavel Roskin



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

* Re: [WIP PATCH 2/2] SDL support
  2009-06-15 23:01 ` Pavel Roskin
@ 2009-06-15 23:08   ` Vladimir 'phcoder' Serbinenko
  0 siblings, 0 replies; 4+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-06-15 23:08 UTC (permalink / raw)
  To: The development of GRUB 2

On Tue, Jun 16, 2009 at 1:01 AM, Pavel Roskin<proski@gnu.org> wrote:
> On Mon, 2009-06-15 at 17:21 +0200, Vladimir 'phcoder' Serbinenko wrote:
>> Hello here I have a preliminary SDL support. With this WIP patch you
>> have to add LD_FLAGS=-lSDL to configure command. Another two problems
>> are that window is never repainted and input still has to go to
>> terminal window
>> This will of course be fixed in the next patch just that I knew that
>> debugging video in grub-emu could help Collin with gfxmenu I release
>> this early.
>
> I like the idea, as it makes grub-emu more useful for debugging.
>
The idea is not mine but Collin D Bennett's. When we spoke about
debugging memory leaks and valgrind he suggested using SDL for
creating a video frontend based on SDL
I like SDL because it basically similar to common gfx card
architecture with framebuffer which pushed me to split framebuffer out
of vbe.mod. This mode should allow a relativily easy creation of
drivers for new video cards
>> @Pavel Roskin: could I perhaps create a personal named branch(es) in
>> your git mirror so that I could expose my works as they progress?
>
> I believe it's better to publish your work elsewhere.  There is no
> access control in git within a repository, and I don't want to take any
> risk that the mirror is accidentally replaced with a branch with
> experimental patches.
>
> You can create a separate repository on repo.or.cz o on another site.
>
> --
> Regards,
> Pavel Roskin
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
>



-- 
Regards
Vladimir 'phcoder' Serbinenko



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

* Re: [WIP PATCH 2/2] SDL support
  2009-06-15 15:21 [WIP PATCH 2/2] SDL support Vladimir 'phcoder' Serbinenko
  2009-06-15 23:01 ` Pavel Roskin
@ 2009-08-23 12:47 ` Robert Millan
  1 sibling, 0 replies; 4+ messages in thread
From: Robert Millan @ 2009-08-23 12:47 UTC (permalink / raw)
  To: The development of GRUB 2


Hi,

IIRC this was waiting for the video split patch to go in.  I assume it'll need
some update for current head?


On Mon, Jun 15, 2009 at 05:21:38PM +0200, Vladimir 'phcoder' Serbinenko wrote:
> Hello here I have a preliminary SDL support. With this WIP patch you
> have to add LD_FLAGS=-lSDL to configure command. Another two problems
> are that window is never repainted and input still has to go to
> terminal window
> This will of course be fixed in the next patch just that I knew that
> debugging video in grub-emu could help Collin with gfxmenu I release
> this early.
> @Pavel Roskin: could I perhaps create a personal named branch(es) in
> your git mirror so that I could expose my works as they progress?
> 
> -- 
> Regards
> Vladimir 'phcoder' Serbinenko

> diff --git a/commands/videotest.c b/commands/videotest.c
> index 6fe4b9b..6f23560 100644
> --- a/commands/videotest.c
> +++ b/commands/videotest.c
> @@ -159,7 +159,7 @@ grub_cmd_videotest (grub_command_t cmd __attribute__ ((unused)),
>        grub_video_blit_render_target (text_layer, GRUB_VIDEO_BLIT_BLEND, 0, 0,
>                                       0, 0, width, height);
>      }
> -
> +  grub_video_swap_buffers ();
>    grub_getkey ();
>  
>    grub_video_delete_render_target (text_layer);
> diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk
> index 66fdbd4..60b87b0 100644
> --- a/conf/i386-pc.rmk
> +++ b/conf/i386-pc.rmk
> @@ -153,6 +153,12 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c	\
>  	fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c			\
>  	fs/ufs.c fs/xfs.c fs/afs.c fs/tar.c				\
>  	\
> +	video/video.c video/fb/video_fb.c video/fb/fbblit.c 		\
> +	video/fb/fbfill.c video/fb/fbutil.c commands/videotest.c 	\
> +	video/bitmap.c video/readers/tga.c video/readers/jpeg.c		\
> +	video/readers/png.c font/font_cmd.c font/font.c term/gfxterm.c	\
> +	io/bufio.c util/sdl.c						\
> +	\
>  	util/console.c util/hostfs.c util/grub-emu.c util/misc.c	\
>  	util/hostdisk.c util/getroot.c					\
>  	util/i386/pc/misc.c						\
> diff --git a/term/gfxterm.c b/term/gfxterm.c
> index ef93bb7..f48379a 100644
> --- a/term/gfxterm.c
> +++ b/term/gfxterm.c
> @@ -462,6 +462,7 @@ dirty_region_redraw (void)
>    redraw_screen_rect (x, y, width, height);
>  
>    dirty_region_reset ();
> +  grub_video_swap_buffers ();
>  }
>  
>  static void
> diff --git a/util/sdl.c b/util/sdl.c
> new file mode 100644
> index 0000000..7de6a16
> --- /dev/null
> +++ b/util/sdl.c
> @@ -0,0 +1,249 @@
> +/*
> + *  GRUB  --  GRand Unified Bootloader
> + *  Copyright (C) 2005,2006,2007,2008,2009  Free Software Foundation, Inc.
> + *
> + *  GRUB is free software: you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation, either version 3 of the License, or
> + *  (at your option) any later version.
> + *
> + *  GRUB is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#define grub_video_render_target grub_video_fbrender_target
> +
> +#include <grub/err.h>
> +#include <grub/types.h>
> +#include <grub/dl.h>
> +#include <grub/misc.h>
> +#include <grub/mm.h>
> +#include <grub/video.h>
> +#include <grub/video_fb.h>
> +#include <SDL/SDL.h>
> +
> +static SDL_Surface *window = 0;
> +static struct grub_video_render_target sdl_render_target;
> +
> +static grub_err_t
> +grub_video_sdl_set_palette (unsigned int start, unsigned int count,
> +                            struct grub_video_palette_data *palette_data);
> +
> +static grub_err_t
> +grub_video_sdl_init (void)
> +{
> +  window = 0;
> +  grub_memset (&sdl_render_target, 0, sizeof(sdl_render_target));
> +
> +  if (SDL_Init (SDL_INIT_VIDEO) < 0)
> +    return grub_error (GRUB_ERR_BAD_DEVICE, "Couldn't init SDL: %s",
> +		       SDL_GetError ());
> +  /* Reset frame buffer and render target variables.  */
> +  grub_memset (&sdl_render_target, 0, sizeof(sdl_render_target));
> +  return grub_video_fb_init ();
> +}
> +
> +static grub_err_t
> +grub_video_sdl_fini (void)
> +{
> +  SDL_Quit ();
> +  window = 0;
> +  grub_memset (&sdl_render_target, 0, sizeof(sdl_render_target));
> +
> +  return grub_video_fb_fini ();
> +}
> +
> +static inline unsigned int
> +get_mask_size (grub_uint32_t mask)
> +{
> +  unsigned i;
> +  for (i = 0; mask > 1U << i; i++);
> +  return i;
> +}
> +
> +static grub_err_t
> +grub_video_sdl_setup (unsigned int width, unsigned int height,
> +                      unsigned int mode_type)
> +{
> +  int depth;
> +  int flags = 0;
> +  /* Decode depth from mode_type.  If it is zero, then autodetect.  */
> +  depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
> +          >> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
> +
> +  if (mode_type & GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED)
> +    flags |= SDL_DOUBLEBUF;
> +
> +  window = SDL_SetVideoMode (width, height, depth, flags | SDL_HWSURFACE);
> +  if (! window)
> +    window = SDL_SetVideoMode (width, height, depth, flags | SDL_SWSURFACE);
> +  if (! window)
> +    return grub_error (GRUB_ERR_BAD_DEVICE, "Couldn't open window: %s",
> +		       SDL_GetError ());
> +
> +  grub_memset (&sdl_render_target, 0, sizeof (sdl_render_target));
> +
> +  sdl_render_target.mode_info.width = window->w;
> +  sdl_render_target.mode_info.height = window->h;
> +  sdl_render_target.mode_info.mode_type = 0;
> +  if (window->flags & SDL_DOUBLEBUF)
> +    sdl_render_target.mode_info.mode_type 
> +      |= GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED;
> +  if (window->format->palette)
> +    sdl_render_target.mode_info.mode_type |= GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
> +  else
> +    sdl_render_target.mode_info.mode_type |= GRUB_VIDEO_MODE_TYPE_RGB;
> +
> +  sdl_render_target.mode_info.bpp = window->format->BitsPerPixel;
> +  sdl_render_target.mode_info.bytes_per_pixel = window->format->BytesPerPixel;
> +  sdl_render_target.mode_info.pitch = window->pitch;
> +
> +  /* In index color mode, number of colors.  In RGB mode this is 256.  */
> +  if (window->format->palette)
> +    sdl_render_target.mode_info.number_of_colors 
> +      = 1 << window->format->BitsPerPixel;
> +  else
> +    sdl_render_target.mode_info.number_of_colors = 256;
> +
> +  if (! window->format->palette)
> +    {
> +      sdl_render_target.mode_info.red_mask_size 
> +	= get_mask_size (window->format->Rmask >> window->format->Rshift);
> +      sdl_render_target.mode_info.red_field_pos = window->format->Rshift;
> +      sdl_render_target.mode_info.green_mask_size 
> +	= get_mask_size (window->format->Gmask >> window->format->Gshift);
> +      sdl_render_target.mode_info.green_field_pos = window->format->Gshift;
> +      sdl_render_target.mode_info.blue_mask_size 
> +	= get_mask_size (window->format->Bmask >> window->format->Bshift);
> +      sdl_render_target.mode_info.blue_field_pos = window->format->Bshift;
> +      sdl_render_target.mode_info.reserved_mask_size 
> +	= get_mask_size (window->format->Amask >> window->format->Ashift);
> +      sdl_render_target.mode_info.reserved_field_pos = window->format->Ashift;
> +      sdl_render_target.mode_info.blit_format 
> +	= grub_video_get_blit_format (&sdl_render_target.mode_info);
> +    }
> +
> +  sdl_render_target.viewport.x = sdl_render_target.viewport.y = 0;
> +  sdl_render_target.viewport.width = window->w;
> +  sdl_render_target.viewport.height = window->h;
> +  sdl_render_target.is_allocated = 0;
> +  sdl_render_target.data = window->pixels;
> +
> +  /* Copy default palette to initialize emulated palette.  */
> +  grub_video_sdl_set_palette (0, (sizeof (grub_video_fbstd_colors) 
> +				  / sizeof (grub_video_fbstd_colors[0])),
> +			      grub_video_fbstd_colors);
> +
> +  /* Reset render target to SDL one.  */
> +  return grub_video_fb_set_active_render_target (&sdl_render_target);
> +}
> +
> +static grub_err_t
> +grub_video_sdl_set_palette (unsigned int start, unsigned int count,
> +                            struct grub_video_palette_data *palette_data)
> +{
> +  unsigned i;
> +  if (window->format->palette)
> +    {
> +      SDL_Color *tmp = grub_malloc (count * sizeof (tmp[0]));
> +      for (i = 0; i < count; i++)
> +	{
> +	  tmp[i].r = palette_data[i].r;
> +	  tmp[i].g = palette_data[i].g;
> +	  tmp[i].b = palette_data[i].b;
> +	  tmp[i].unused = palette_data[i].a;
> +	}
> +      SDL_SetColors (window, tmp, start, count);
> +      grub_free (tmp);
> +    }
> +
> +  return grub_video_fb_set_palette (start, count, palette_data);
> +}
> +
> +grub_err_t
> +grub_video_sdl_set_viewport (unsigned int x, unsigned int y,
> +			     unsigned int width, unsigned int height)
> +{
> +  /* Make sure viewport is withing screen dimensions.  If viewport was set
> +     to be out of the region, mark its size as zero.  */
> +  if (x > (unsigned) window->w)
> +    {
> +      x = 0;
> +      width = 0;
> +    }
> +
> +  if (y > (unsigned) window->h)
> +    {
> +      y = 0;
> +      height = 0;
> +    }
> +
> +  if (x + width > (unsigned) window->w)
> +    width = window->w - x;
> +
> +  if (y + height > (unsigned) window->h)
> +    height = window->h - y;
> +  return grub_video_fb_set_viewport (x, y, width, height);
> +}
> +
> +static grub_err_t
> +grub_video_sdl_swap_buffers (void)
> +{
> +  if (SDL_Flip (window) < 0)
> +    return grub_error (GRUB_ERR_BAD_DEVICE, "couldn't swap buffers: %s",
> +		       SDL_GetError ());
> +  return GRUB_ERR_NONE;
> +}
> +
> +static grub_err_t
> +grub_video_sdl_set_active_render_target (struct grub_video_render_target *target)
> +{
> +  if (target == GRUB_VIDEO_RENDER_TARGET_FRONT_BUFFER)
> +    return grub_video_fb_set_active_render_target (&sdl_render_target);
> +
> +  return grub_video_fb_set_active_render_target (target);
> +}
> +
> +static struct grub_video_adapter grub_video_sdl_adapter =
> +  {
> +    .name = "SDL Video Driver",
> +
> +    .init = grub_video_sdl_init,
> +    .fini = grub_video_sdl_fini,
> +    .setup = grub_video_sdl_setup,
> +    .get_info = grub_video_fb_get_info,
> +    .set_palette = grub_video_sdl_set_palette,
> +    .get_palette = grub_video_fb_get_palette,
> +    .set_viewport = grub_video_fb_set_viewport,
> +    .get_viewport = grub_video_fb_get_viewport,
> +    .map_color = grub_video_fb_map_color,
> +    .map_rgb = grub_video_fb_map_rgb,
> +    .map_rgba = grub_video_fb_map_rgba,
> +    .unmap_color = grub_video_fb_unmap_color,
> +    .fill_rect = grub_video_fb_fill_rect,
> +    .blit_bitmap = grub_video_fb_blit_bitmap,
> +    .blit_render_target = grub_video_fb_blit_render_target,
> +    .scroll = grub_video_fb_scroll,
> +    .swap_buffers = grub_video_sdl_swap_buffers,
> +    .create_render_target = grub_video_fb_create_render_target,
> +    .delete_render_target = grub_video_fb_delete_render_target,
> +    .set_active_render_target = grub_video_sdl_set_active_render_target,
> +    .get_active_render_target = grub_video_fb_get_active_render_target,
> +
> +    .next = 0
> +  };
> +
> +GRUB_MOD_INIT(sdl)
> +{
> +  grub_video_register (&grub_video_sdl_adapter);
> +}
> +
> +GRUB_MOD_FINI(sdl)
> +{
> +  grub_video_unregister (&grub_video_sdl_adapter);
> +}
> diff --git a/video/video.c b/video/video.c
> index 8271d79..2f70274 100644
> --- a/video/video.c
> +++ b/video/video.c
> @@ -699,8 +699,6 @@ grub_video_set_mode (char *modestring,
>  /* Initialize Video API module.  */
>  GRUB_MOD_INIT(video_video)
>  {
> -  grub_video_adapter_active = 0;
> -  grub_video_adapter_list = 0;
>  }
>  
>  /* Finalize Video API module.  */

> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel


-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



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

end of thread, other threads:[~2009-08-23 12:47 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-06-15 15:21 [WIP PATCH 2/2] SDL support Vladimir 'phcoder' Serbinenko
2009-06-15 23:01 ` Pavel Roskin
2009-06-15 23:08   ` Vladimir 'phcoder' Serbinenko
2009-08-23 12:47 ` Robert Millan

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.