* grub-core/term/efi/console.c (grub_efi_console_init): Set text mode.
(grub_efi_console_fini): Likewise. * grub-core/video/efi_gop.c (framebuffer): New field offscreen. (grub_video_gop_fill_mode_info): Rename to ... (grub_video_gop_fill_real_mode_info): ... this. (grub_video_gop_fill_mode_info): New function. (grub_video_gop_setup): Setup double framebuffer. (grub_video_gop_get_info_and_fini): Use original framebuffer. Free offscreen. (grub_video_gop_swap_buffers): Copy framebuffer. (grub_video_gop_fini): Free offscreen buffer. * include/grub/efi/graphics_output.h (grub_efi_gop_blt_operation_t): New enum. (grub_efi_gop_blt_pixel): New struct.
This commit is contained in:
parent
683031bac4
commit
4ce776d23e
4 changed files with 109 additions and 6 deletions
17
ChangeLog
17
ChangeLog
|
@ -1,3 +1,20 @@
|
||||||
|
2012-05-26 Matthew Garrett <mjg@redhat.com>
|
||||||
|
|
||||||
|
* grub-core/term/efi/console.c (grub_efi_console_init): Set text mode.
|
||||||
|
(grub_efi_console_fini): Likewise.
|
||||||
|
* grub-core/video/efi_gop.c (framebuffer): New field offscreen.
|
||||||
|
(grub_video_gop_fill_mode_info): Rename to ...
|
||||||
|
(grub_video_gop_fill_real_mode_info): ... this.
|
||||||
|
(grub_video_gop_fill_mode_info): New function.
|
||||||
|
(grub_video_gop_setup): Setup double framebuffer.
|
||||||
|
(grub_video_gop_get_info_and_fini): Use original framebuffer.
|
||||||
|
Free offscreen.
|
||||||
|
(grub_video_gop_swap_buffers): Copy framebuffer.
|
||||||
|
(grub_video_gop_fini): Free offscreen buffer.
|
||||||
|
* include/grub/efi/graphics_output.h (grub_efi_gop_blt_operation_t):
|
||||||
|
New enum.
|
||||||
|
(grub_efi_gop_blt_pixel): New struct.
|
||||||
|
|
||||||
2012-05-26 Vladimir Serbinenko <phcoder@gmail.com>
|
2012-05-26 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* gentpl.py: Remove error disabling for objconv.
|
* gentpl.py: Remove error disabling for objconv.
|
||||||
|
|
|
@ -234,6 +234,7 @@ grub_console_setcursor (struct grub_term_output *term __attribute__ ((unused)),
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_efi_console_init (struct grub_term_output *term)
|
grub_efi_console_init (struct grub_term_output *term)
|
||||||
{
|
{
|
||||||
|
grub_efi_set_text_mode (1);
|
||||||
grub_console_setcursor (term, 1);
|
grub_console_setcursor (term, 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -242,6 +243,7 @@ static grub_err_t
|
||||||
grub_efi_console_fini (struct grub_term_output *term)
|
grub_efi_console_fini (struct grub_term_output *term)
|
||||||
{
|
{
|
||||||
grub_console_setcursor (term, 0);
|
grub_console_setcursor (term, 0);
|
||||||
|
grub_efi_set_text_mode (0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ static struct
|
||||||
struct grub_video_mode_info mode_info;
|
struct grub_video_mode_info mode_info;
|
||||||
struct grub_video_render_target *render_target;
|
struct grub_video_render_target *render_target;
|
||||||
grub_uint8_t *ptr;
|
grub_uint8_t *ptr;
|
||||||
|
grub_uint8_t *offscreen;
|
||||||
} framebuffer;
|
} framebuffer;
|
||||||
|
|
||||||
|
|
||||||
|
@ -105,6 +106,8 @@ grub_video_gop_fini (void)
|
||||||
efi_call_2 (gop->set_mode, gop, old_mode);
|
efi_call_2 (gop->set_mode, gop, old_mode);
|
||||||
restore_needed = 0;
|
restore_needed = 0;
|
||||||
}
|
}
|
||||||
|
grub_free (framebuffer.offscreen);
|
||||||
|
framebuffer.offscreen = 0;
|
||||||
return grub_video_fb_fini ();
|
return grub_video_fb_fini ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,9 +168,9 @@ grub_video_gop_get_bitmask (grub_uint32_t mask, unsigned int *mask_size,
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_video_gop_fill_mode_info (unsigned mode,
|
grub_video_gop_fill_real_mode_info (unsigned mode,
|
||||||
struct grub_efi_gop_mode_info *in,
|
struct grub_efi_gop_mode_info *in,
|
||||||
struct grub_video_mode_info *out)
|
struct grub_video_mode_info *out)
|
||||||
{
|
{
|
||||||
out->mode_number = mode;
|
out->mode_number = mode;
|
||||||
out->number_of_colors = 256;
|
out->number_of_colors = 256;
|
||||||
|
@ -223,6 +226,35 @@ grub_video_gop_fill_mode_info (unsigned mode,
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_video_gop_fill_mode_info (unsigned mode,
|
||||||
|
struct grub_efi_gop_mode_info *in,
|
||||||
|
struct grub_video_mode_info *out)
|
||||||
|
{
|
||||||
|
out->mode_number = mode;
|
||||||
|
out->number_of_colors = 256;
|
||||||
|
out->width = in->width;
|
||||||
|
out->height = in->height;
|
||||||
|
out->mode_type = GRUB_VIDEO_MODE_TYPE_RGB;
|
||||||
|
out->bytes_per_pixel = sizeof (struct grub_efi_gop_blt_pixel);
|
||||||
|
out->bpp = out->bytes_per_pixel << 3;
|
||||||
|
out->pitch = in->width * out->bytes_per_pixel;
|
||||||
|
out->red_mask_size = 8;
|
||||||
|
out->red_field_pos = 16;
|
||||||
|
out->green_mask_size = 8;
|
||||||
|
out->green_field_pos = 8;
|
||||||
|
out->blue_mask_size = 8;
|
||||||
|
out->blue_field_pos = 0;
|
||||||
|
out->reserved_mask_size = 8;
|
||||||
|
out->reserved_field_pos = 24;
|
||||||
|
|
||||||
|
out->blit_format = GRUB_VIDEO_BLIT_FORMAT_BGRA_8888;
|
||||||
|
out->mode_type |= (GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED
|
||||||
|
| GRUB_VIDEO_MODE_TYPE_UPDATING_SWAP);
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
grub_video_gop_iterate (int (*hook) (const struct grub_video_mode_info *info))
|
grub_video_gop_iterate (int (*hook) (const struct grub_video_mode_info *info))
|
||||||
{
|
{
|
||||||
|
@ -327,6 +359,7 @@ grub_video_gop_setup (unsigned int width, unsigned int height,
|
||||||
int found = 0;
|
int found = 0;
|
||||||
unsigned long long best_volume = 0;
|
unsigned long long best_volume = 0;
|
||||||
unsigned int preferred_width = 0, preferred_height = 0;
|
unsigned int preferred_width = 0, preferred_height = 0;
|
||||||
|
grub_uint8_t *buffer;
|
||||||
|
|
||||||
depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
|
depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
|
||||||
>> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
|
>> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
|
||||||
|
@ -442,13 +475,28 @@ grub_video_gop_setup (unsigned int width, unsigned int height,
|
||||||
}
|
}
|
||||||
|
|
||||||
framebuffer.ptr = (void *) (grub_addr_t) gop->mode->fb_base;
|
framebuffer.ptr = (void *) (grub_addr_t) gop->mode->fb_base;
|
||||||
|
framebuffer.offscreen
|
||||||
|
= grub_malloc (framebuffer.mode_info.height
|
||||||
|
* framebuffer.mode_info.width
|
||||||
|
* sizeof (struct grub_efi_gop_blt_pixel));
|
||||||
|
|
||||||
|
buffer = framebuffer.offscreen;
|
||||||
|
|
||||||
|
if (!buffer)
|
||||||
|
{
|
||||||
|
grub_dprintf ("video", "GOP: couldn't allocate shadow\n");
|
||||||
|
grub_errno = 0;
|
||||||
|
err = grub_video_gop_fill_mode_info (gop->mode->mode, info,
|
||||||
|
&framebuffer.mode_info);
|
||||||
|
buffer = framebuffer.ptr;
|
||||||
|
}
|
||||||
|
|
||||||
grub_dprintf ("video", "GOP: initialising FB @ %p %dx%dx%d\n",
|
grub_dprintf ("video", "GOP: initialising FB @ %p %dx%dx%d\n",
|
||||||
framebuffer.ptr, framebuffer.mode_info.width,
|
framebuffer.ptr, framebuffer.mode_info.width,
|
||||||
framebuffer.mode_info.height, framebuffer.mode_info.bpp);
|
framebuffer.mode_info.height, framebuffer.mode_info.bpp);
|
||||||
|
|
||||||
err = grub_video_fb_create_render_target_from_pointer
|
err = grub_video_fb_create_render_target_from_pointer
|
||||||
(&framebuffer.render_target, &framebuffer.mode_info, framebuffer.ptr);
|
(&framebuffer.render_target, &framebuffer.mode_info, buffer);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
|
@ -478,7 +526,13 @@ grub_video_gop_setup (unsigned int width, unsigned int height,
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_video_gop_swap_buffers (void)
|
grub_video_gop_swap_buffers (void)
|
||||||
{
|
{
|
||||||
/* TODO: Implement buffer swapping. */
|
if (framebuffer.offscreen)
|
||||||
|
{
|
||||||
|
efi_call_10 (gop->blt, gop, framebuffer.offscreen,
|
||||||
|
GRUB_EFI_BLT_BUFFER_TO_VIDEO, 0, 0, 0, 0,
|
||||||
|
framebuffer.mode_info.width, framebuffer.mode_info.height,
|
||||||
|
framebuffer.mode_info.width * 4);
|
||||||
|
}
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -495,11 +549,23 @@ static grub_err_t
|
||||||
grub_video_gop_get_info_and_fini (struct grub_video_mode_info *mode_info,
|
grub_video_gop_get_info_and_fini (struct grub_video_mode_info *mode_info,
|
||||||
void **framebuf)
|
void **framebuf)
|
||||||
{
|
{
|
||||||
grub_memcpy (mode_info, &(framebuffer.mode_info), sizeof (*mode_info));
|
grub_err_t err;
|
||||||
|
|
||||||
|
err = grub_video_gop_fill_real_mode_info (gop->mode->mode, gop->mode->info,
|
||||||
|
mode_info);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
grub_dprintf ("video", "GOP: couldn't fill mode info\n");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
*framebuf = (char *) framebuffer.ptr;
|
*framebuf = (char *) framebuffer.ptr;
|
||||||
|
|
||||||
grub_video_fb_fini ();
|
grub_video_fb_fini ();
|
||||||
|
|
||||||
|
grub_free (framebuffer.offscreen);
|
||||||
|
framebuffer.offscreen = 0;
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,24 @@ typedef enum
|
||||||
}
|
}
|
||||||
grub_efi_gop_pixel_format_t;
|
grub_efi_gop_pixel_format_t;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GRUB_EFI_BLT_VIDEO_FILL,
|
||||||
|
GRUB_EFI_BLT_VIDEO_TO_BLT_BUFFER,
|
||||||
|
GRUB_EFI_BLT_BUFFER_TO_VIDEO,
|
||||||
|
GRUB_EFI_BLT_VIDEO_TO_VIDEO,
|
||||||
|
GRUB_EFI_BLT_OPERATION_MAX
|
||||||
|
}
|
||||||
|
grub_efi_gop_blt_operation_t;
|
||||||
|
|
||||||
|
struct grub_efi_gop_blt_pixel
|
||||||
|
{
|
||||||
|
grub_uint8_t blue;
|
||||||
|
grub_uint8_t green;
|
||||||
|
grub_uint8_t red;
|
||||||
|
grub_uint8_t reserved;
|
||||||
|
};
|
||||||
|
|
||||||
struct grub_efi_gop_pixel_bitmask
|
struct grub_efi_gop_pixel_bitmask
|
||||||
{
|
{
|
||||||
grub_uint32_t r;
|
grub_uint32_t r;
|
||||||
|
|
Loading…
Add table
Reference in a new issue