Avoid slow read-back from VRAM.
* include/grub/video_fb.h (grub_video_fb_doublebuf_update_screen_t): Move from here ... * grub-core/video/fb/video_fb.c (grub_video_fb_doublebuf_update_screen_t): ... here. Remove arguments. * grub-core/video/fb/video_fb.c (framebuf_t): New type. (front_target): Remove front_target. Add pages. (grub_video_fb_init): Skip setting front_pages. (grub_video_fb_fini): Likewise. (doublebuf_blit_update_screen): Use pages. (grub_video_fb_doublebuf_blit_init): Likewise. (doublebuf_pageflipping_init): Allocate offscreen buffer. (doublebuf_pageflipping_update_screen): Use offscreen buffer. (grub_video_fb_setup): Prefer doublebuffing.
This commit is contained in:
parent
377c98cba2
commit
ba67e2c635
4 changed files with 83 additions and 128 deletions
|
@ -40,7 +40,6 @@ static int have_setcolors = 0;
|
|||
static struct
|
||||
{
|
||||
struct grub_video_mode_info mode_info;
|
||||
struct grub_video_render_target *render_target;
|
||||
grub_uint8_t *ptr;
|
||||
} framebuffer;
|
||||
|
||||
|
@ -186,23 +185,12 @@ grub_video_ieee1275_setup (unsigned int width, unsigned int height,
|
|||
grub_dprintf ("video", "IEEE1275: initialising FB @ %p %dx%dx%d\n",
|
||||
framebuffer.ptr, framebuffer.mode_info.width,
|
||||
framebuffer.mode_info.height, framebuffer.mode_info.bpp);
|
||||
|
||||
err = grub_video_fb_create_render_target_from_pointer
|
||||
(&framebuffer.render_target, &framebuffer.mode_info, framebuffer.ptr);
|
||||
|
||||
err = grub_video_fb_setup (mode_type, mode_mask,
|
||||
&framebuffer.mode_info,
|
||||
framebuffer.ptr, NULL, NULL);
|
||||
if (err)
|
||||
{
|
||||
grub_dprintf ("video", "IEEE1275: Couldn't create FB target\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
err = grub_video_fb_set_active_render_target (framebuffer.render_target);
|
||||
|
||||
if (err)
|
||||
{
|
||||
grub_dprintf ("video", "IEEE1275: Couldn't set FB target\n");
|
||||
return err;
|
||||
}
|
||||
return err;
|
||||
|
||||
grub_video_ieee1275_set_palette (0, GRUB_VIDEO_FBSTD_NUMCOLORS,
|
||||
grub_video_fbstd_colors);
|
||||
|
@ -210,22 +198,6 @@ grub_video_ieee1275_setup (unsigned int width, unsigned int height,
|
|||
return err;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_ieee1275_swap_buffers (void)
|
||||
{
|
||||
/* TODO: Implement buffer swapping. */
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_ieee1275_set_active_render_target (struct grub_video_render_target *target)
|
||||
{
|
||||
if (target == GRUB_VIDEO_RENDER_TARGET_DISPLAY)
|
||||
target = framebuffer.render_target;
|
||||
|
||||
return grub_video_fb_set_active_render_target (target);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_ieee1275_get_info_and_fini (struct grub_video_mode_info *mode_info,
|
||||
void **framebuf)
|
||||
|
@ -287,10 +259,10 @@ static struct grub_video_adapter grub_video_ieee1275_adapter =
|
|||
.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_ieee1275_swap_buffers,
|
||||
.swap_buffers = grub_video_fb_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_ieee1275_set_active_render_target,
|
||||
.set_active_render_target = grub_video_fb_set_active_render_target,
|
||||
.get_active_render_target = grub_video_fb_get_active_render_target,
|
||||
|
||||
.next = 0
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue