> Considering that vbe.c and sdl.c currently aren't affected a lot
> whether there is or there isn't encapsulation in place, I'm ok tih
> encapsulating it but if any driver needs the breach of encapsulation
> it will be broken and I'll post no opposition to it.
> I'll do the encapsulation tomorrow.
Patch attached. One incremental version (for review) and one complete
(for patching)
>>
>> Thanks
>>
>> Michal
>>
>>
>> _______________________________________________
>> Grub-devel mailing list
>> Grub-devel@gnu.org
>> http://lists.gnu.org/mailman/listinfo/grub-devel
>>
>
>
>
> --
> Regards
> Vladimir 'phcoder' Serbinenko
>
> Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
>



-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
diff --git a/include/grub/fbfill.h b/include/grub/fbfill.h
index 11e22c6..08cd7b8 100644
--- a/include/grub/fbfill.h
+++ b/include/grub/fbfill.h
@@ -24,6 +24,29 @@
 
 struct grub_video_fbblit_info;
 
+struct grub_video_fbrender_target
+{
+  /* Copy of the screen's mode info structure, except that width, height and
+     mode_type has been re-adjusted to requested render target settings.  */
+  struct grub_video_mode_info mode_info;
+
+  struct
+  {
+    unsigned int x;
+    unsigned int y;
+    unsigned int width;
+    unsigned int height;
+  } viewport;
+
+  /* Indicates whether the data has been allocated by us and must be freed
+     when render target is destroyed.  */
+  int is_allocated;
+
+  /* Pointer to data.  Can either be in video card memory or in local host's
+     memory.  */
+  void *data;
+};
+
 void
 grub_video_fbfill (struct grub_video_fbblit_info *dst,
                   grub_video_color_t color, int x, int y,
diff --git a/include/grub/video_fb.h b/include/grub/video_fb.h
index 9ae4101..03ef385 100644
--- a/include/grub/video_fb.h
+++ b/include/grub/video_fb.h
@@ -28,28 +28,7 @@
 
 struct grub_video_fbblit_info;
 
-struct grub_video_fbrender_target
-{
-  /* Copy of the screen's mode info structure, except that width, height and
-     mode_type has been re-adjusted to requested render target settings.  */
-  struct grub_video_mode_info mode_info;
-
-  struct
-  {
-    unsigned int x;
-    unsigned int y;
-    unsigned int width;
-    unsigned int height;
-  } viewport;
-
-  /* Indicates whether the data has been allocated by us and must be freed
-     when render target is destroyed.  */
-  int is_allocated;
-
-  /* Pointer to data.  Can either be in video card memory or in local host's
-     memory.  */
-  void *data;
-};
+struct grub_video_fbrender_target;
 
 #define GRUB_VIDEO_FBSTD_NUMCOLORS 16
 extern struct grub_video_palette_data 
grub_video_fbstd_colors[GRUB_VIDEO_FBSTD_NUMCOLORS];
@@ -126,6 +105,11 @@ grub_video_fb_create_render_target (struct 
grub_video_fbrender_target **result,
                                    unsigned int mode_type __attribute__ 
((unused)));
 
 grub_err_t
+grub_video_fb_create_render_target_from_pointer (struct 
grub_video_fbrender_target **result,
+                                                const struct 
grub_video_mode_info *mode_info,
+                                                void *ptr);
+
+grub_err_t
 grub_video_fb_delete_render_target (struct grub_video_fbrender_target *target);
 
 grub_err_t
diff --git a/video/fb/video_fb.c b/video/fb/video_fb.c
index f97d7ac..e4f8f6d 100644
--- a/video/fb/video_fb.c
+++ b/video/fb/video_fb.c
@@ -1081,6 +1081,45 @@ grub_video_fb_create_render_target (struct 
grub_video_fbrender_target **result,
 }
 
 grub_err_t
+grub_video_fb_create_render_target_from_pointer (struct 
grub_video_fbrender_target **result,
+                                                const struct 
grub_video_mode_info *mode_info,
+                                                void *ptr)
+{
+  struct grub_video_fbrender_target *target;
+  unsigned y;
+
+  /* Allocate memory for render target.  */
+  target = grub_malloc (sizeof (struct grub_video_fbrender_target));
+  if (! target)
+    return grub_errno;
+
+  /* Mark render target as unallocated.  */
+  target->is_allocated = 0;
+  target->data = ptr;
+
+  grub_memcpy (&(target->mode_info), mode_info, sizeof (target->mode_info));
+
+  /* Reset viewport to match new mode.  */
+  target->viewport.x = 0;
+  target->viewport.y = 0;
+  target->viewport.width = mode_info->width;
+  target->viewport.height = mode_info->height;
+
+  /* Mark framebuffer memory as non allocated.  */
+  target->is_allocated = 0;
+
+  /* Clear render target with black and maximum transparency.  */
+  for (y = 0; y < mode_info->height; y++)
+    grub_memset (target->data + mode_info->pitch * y, 0,
+                mode_info->bytes_per_pixel * mode_info->width);
+
+  /* Save result to caller.  */
+  *result = target;
+
+  return GRUB_ERR_NONE;
+}
+
+grub_err_t
 grub_video_fb_delete_render_target (struct grub_video_fbrender_target *target)
 {
   /* If there is no target, then just return without error.  */
diff --git a/video/i386/pc/vbe.c b/video/i386/pc/vbe.c
index f73242f..1a0f587 100644
--- a/video/i386/pc/vbe.c
+++ b/video/i386/pc/vbe.c
@@ -35,7 +35,8 @@ static struct grub_vbe_mode_info_block active_mode_info;
 
 static struct
 {
-  struct grub_video_render_target render_target;
+  struct grub_video_mode_info mode_info;
+  struct grub_video_render_target *render_target;
 
   unsigned int bytes_per_scan_line;
   unsigned int bytes_per_pixel;
@@ -475,39 +476,29 @@ grub_video_vbe_setup (unsigned int width, unsigned int 
height,
          in order to fasten later operations.  */
       mode_in_use = best_mode;
 
-      /* Fill mode info details in framebuffer's render target.  */
-      framebuffer.render_target.data = framebuffer.ptr;
-      framebuffer.render_target.mode_info.width = 
active_mode_info.x_resolution;
-      framebuffer.render_target.mode_info.height = 
active_mode_info.y_resolution;
+      /* Fill mode info details.  */
+      framebuffer.mode_info.width = active_mode_info.x_resolution;
+      framebuffer.mode_info.height = active_mode_info.y_resolution;
 
       if (framebuffer.index_color_mode)
-        framebuffer.render_target.mode_info.mode_type = 
GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
+        framebuffer.mode_info.mode_type = GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
       else
-        framebuffer.render_target.mode_info.mode_type = 
GRUB_VIDEO_MODE_TYPE_RGB;
-
-      framebuffer.render_target.mode_info.bpp = 
active_mode_info.bits_per_pixel;
-      framebuffer.render_target.mode_info.bytes_per_pixel = 
framebuffer.bytes_per_pixel;
-      framebuffer.render_target.mode_info.pitch = 
framebuffer.bytes_per_scan_line;
-      framebuffer.render_target.mode_info.number_of_colors = 256; /* TODO: fix 
me.  */
-      framebuffer.render_target.mode_info.red_mask_size = 
active_mode_info.red_mask_size;
-      framebuffer.render_target.mode_info.red_field_pos = 
active_mode_info.red_field_position;
-      framebuffer.render_target.mode_info.green_mask_size = 
active_mode_info.green_mask_size;
-      framebuffer.render_target.mode_info.green_field_pos = 
active_mode_info.green_field_position;
-      framebuffer.render_target.mode_info.blue_mask_size = 
active_mode_info.blue_mask_size;
-      framebuffer.render_target.mode_info.blue_field_pos = 
active_mode_info.blue_field_position;
-      framebuffer.render_target.mode_info.reserved_mask_size = 
active_mode_info.rsvd_mask_size;
-      framebuffer.render_target.mode_info.reserved_field_pos = 
active_mode_info.rsvd_field_position;
-
-      framebuffer.render_target.mode_info.blit_format = 
grub_video_get_blit_format (&framebuffer.render_target.mode_info);
-
-      /* Reset viewport to match new mode.  */
-      framebuffer.render_target.viewport.x = 0;
-      framebuffer.render_target.viewport.y = 0;
-      framebuffer.render_target.viewport.width = active_mode_info.x_resolution;
-      framebuffer.render_target.viewport.height = 
active_mode_info.y_resolution;
-
-      /* Mark framebuffer memory as non allocated.  */
-      framebuffer.render_target.is_allocated = 0;
+        framebuffer.mode_info.mode_type = GRUB_VIDEO_MODE_TYPE_RGB;
+
+      framebuffer.mode_info.bpp = active_mode_info.bits_per_pixel;
+      framebuffer.mode_info.bytes_per_pixel = framebuffer.bytes_per_pixel;
+      framebuffer.mode_info.pitch = framebuffer.bytes_per_scan_line;
+      framebuffer.mode_info.number_of_colors = 256; /* TODO: fix me.  */
+      framebuffer.mode_info.red_mask_size = active_mode_info.red_mask_size;
+      framebuffer.mode_info.red_field_pos = 
active_mode_info.red_field_position;
+      framebuffer.mode_info.green_mask_size = active_mode_info.green_mask_size;
+      framebuffer.mode_info.green_field_pos = 
active_mode_info.green_field_position;
+      framebuffer.mode_info.blue_mask_size = active_mode_info.blue_mask_size;
+      framebuffer.mode_info.blue_field_pos = 
active_mode_info.blue_field_position;
+      framebuffer.mode_info.reserved_mask_size = 
active_mode_info.rsvd_mask_size;
+      framebuffer.mode_info.reserved_field_pos = 
active_mode_info.rsvd_field_position;
+
+      framebuffer.mode_info.blit_format = grub_video_get_blit_format 
(&framebuffer.mode_info);
 
       /* Copy default palette to initialize emulated palette.  */
       err = grub_video_fb_set_palette (0, GRUB_VIDEO_FBSTD_NUMCOLORS,
@@ -515,8 +506,12 @@ grub_video_vbe_setup (unsigned int width, unsigned int 
height,
       if (err)
        return err;
 
-      /* Reset render target to framebuffer one.  */
-      return grub_video_fb_set_active_render_target 
(&framebuffer.render_target);
+      err = grub_video_fb_create_render_target_from_pointer 
(&framebuffer.render_target, &framebuffer.mode_info, framebuffer.ptr);
+
+      if (err)
+       return err;
+
+      return grub_video_fb_set_active_render_target 
(framebuffer.render_target);
     }
 
   /* Couldn't found matching mode.  */
@@ -553,7 +548,7 @@ static grub_err_t
 grub_video_vbe_set_active_render_target (struct grub_video_render_target 
*target)
 {
   if (target == GRUB_VIDEO_RENDER_TARGET_DISPLAY)
-      target = &framebuffer.render_target;
+      target = framebuffer.render_target;
 
   return grub_video_fb_set_active_render_target (target);
 }
@@ -562,12 +557,14 @@ static grub_err_t
 grub_video_vbe_get_info_and_fini (struct grub_video_mode_info *mode_info,
                                  void **framebuf)
 {
-  grub_err_t err;
-  err = grub_video_fb_get_info (mode_info);
-  if (err)
-    return err;
+  grub_memcpy (mode_info, &(framebuffer.mode_info), sizeof (*mode_info));
   *framebuf = (char *) framebuffer.ptr;
 
+  grub_free (mode_list);
+  mode_list = 0;
+
+  grub_video_fb_fini ();
+
   return GRUB_ERR_NONE;
 }
 

Attachment: framebuf.diff.gz
Description: GNU Zip compressed data

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

Reply via email to