62
/* Setup specified video mode. */
64
grub_video_setup (unsigned int width, unsigned int height,
65
unsigned int mode_type)
67
grub_video_adapter_t p;
69
/* De-activate last set video adapter. */
70
if (grub_video_adapter_active)
72
/* Finalize adapter. */
73
grub_video_adapter_active->fini ();
74
if (grub_errno != GRUB_ERR_NONE)
77
/* Mark active adapter as not set. */
78
grub_video_adapter_active = 0;
81
/* Loop thru all possible video adapter trying to find requested mode. */
82
for (p = grub_video_adapter_list; p; p = p->next)
84
/* Try to initialize adapter, if it fails, skip to next adapter. */
86
if (grub_errno != GRUB_ERR_NONE)
88
grub_errno = GRUB_ERR_NONE;
92
/* Try to initialize video mode. */
93
p->setup (width, height, mode_type);
94
if (grub_errno == GRUB_ERR_NONE)
96
/* Valid mode found from adapter, and it has been activated.
97
Specify it as active adapter. */
98
grub_video_adapter_active = p;
102
grub_errno = GRUB_ERR_NONE;
104
/* No valid mode found in this adapter, finalize adapter. */
106
if (grub_errno != GRUB_ERR_NONE)
110
/* We couldn't find suitable adapter for specified mode. */
111
return grub_error (GRUB_ERR_UNKNOWN_DEVICE,
112
"Can't locate valid adapter for mode");
115
64
/* Restore back to initial mode (where applicable). */
117
66
grub_video_restore (void)
152
101
if (mode_info->bpp == 32)
154
103
if ((mode_info->red_mask_size == 8)
155
&& (mode_info->red_field_pos == 0)
156
&& (mode_info->green_mask_size == 8)
157
&& (mode_info->green_field_pos == 8)
158
&& (mode_info->blue_mask_size == 8)
159
&& (mode_info->blue_field_pos == 16)
160
&& (mode_info->reserved_mask_size == 8)
161
&& (mode_info->reserved_field_pos == 24))
163
return GRUB_VIDEO_BLIT_FORMAT_R8G8B8A8;
104
&& (mode_info->red_field_pos == 16)
105
&& (mode_info->green_mask_size == 8)
106
&& (mode_info->green_field_pos == 8)
107
&& (mode_info->blue_mask_size == 8)
108
&& (mode_info->blue_field_pos == 0))
110
return GRUB_VIDEO_BLIT_FORMAT_BGRA_8888;
112
else if ((mode_info->red_mask_size == 8)
113
&& (mode_info->red_field_pos == 0)
114
&& (mode_info->green_mask_size == 8)
115
&& (mode_info->green_field_pos == 8)
116
&& (mode_info->blue_mask_size == 8)
117
&& (mode_info->blue_field_pos == 16))
119
return GRUB_VIDEO_BLIT_FORMAT_RGBA_8888;
167
122
/* Check if we have any known 24 bit modes. */
168
if (mode_info->bpp == 24)
123
else if (mode_info->bpp == 24)
170
125
if ((mode_info->red_mask_size == 8)
171
&& (mode_info->red_field_pos == 0)
172
&& (mode_info->green_mask_size == 8)
173
&& (mode_info->green_field_pos == 8)
174
&& (mode_info->blue_mask_size == 8)
175
&& (mode_info->blue_field_pos == 16))
177
return GRUB_VIDEO_BLIT_FORMAT_R8G8B8;
126
&& (mode_info->red_field_pos == 16)
127
&& (mode_info->green_mask_size == 8)
128
&& (mode_info->green_field_pos == 8)
129
&& (mode_info->blue_mask_size == 8)
130
&& (mode_info->blue_field_pos == 0))
132
return GRUB_VIDEO_BLIT_FORMAT_BGR_888;
134
else if ((mode_info->red_mask_size == 8)
135
&& (mode_info->red_field_pos == 0)
136
&& (mode_info->green_mask_size == 8)
137
&& (mode_info->green_field_pos == 8)
138
&& (mode_info->blue_mask_size == 8)
139
&& (mode_info->blue_field_pos == 16))
141
return GRUB_VIDEO_BLIT_FORMAT_RGB_888;
144
/* Check if we have any known 16 bit modes. */
145
else if (mode_info->bpp == 16)
147
if ((mode_info->red_mask_size == 5)
148
&& (mode_info->red_field_pos == 11)
149
&& (mode_info->green_mask_size == 6)
150
&& (mode_info->green_field_pos == 5)
151
&& (mode_info->blue_mask_size == 5)
152
&& (mode_info->blue_field_pos == 0))
154
return GRUB_VIDEO_BLIT_FORMAT_BGR_565;
156
else if ((mode_info->red_mask_size == 5)
157
&& (mode_info->red_field_pos == 0)
158
&& (mode_info->green_mask_size == 6)
159
&& (mode_info->green_field_pos == 5)
160
&& (mode_info->blue_mask_size == 5)
161
&& (mode_info->blue_field_pos == 11))
163
return GRUB_VIDEO_BLIT_FORMAT_RGB_565;
167
/* Backup route. Unknown format. */
181
169
/* If there are more than 8 bits per color, assume RGB(A) mode. */
182
170
if (mode_info->bpp > 8)
184
172
if (mode_info->reserved_mask_size > 0)
186
return GRUB_VIDEO_BLIT_FORMAT_RGBA;
188
return GRUB_VIDEO_BLIT_FORMAT_RGB;
174
return GRUB_VIDEO_BLIT_FORMAT_RGBA;
178
return GRUB_VIDEO_BLIT_FORMAT_RGB;
191
182
/* Assume as indexcolor mode. */
399
379
return grub_video_adapter_active->get_active_render_target (target);
383
grub_video_set_mode (char *modestring,
384
int NESTED_FUNC_ATTR (*hook) (grub_video_adapter_t p,
385
struct grub_video_mode_info *mode_info))
398
/* Take copy of env.var. as we don't want to modify that. */
399
modevar = grub_strdup (modestring);
401
/* Initialize next mode. */
405
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
406
"couldn't allocate space for local modevar copy");
408
if (grub_memcmp (next_mode, "keep", sizeof ("keep")) == 0
409
|| grub_memcmp (next_mode, "keep,", sizeof ("keep,") - 1) == 0
410
|| grub_memcmp (next_mode, "keep;", sizeof ("keep;") - 1) == 0)
412
struct grub_video_mode_info mode_info;
416
grub_memset (&mode_info, 0, sizeof (mode_info));
418
if (grub_video_adapter_active)
420
err = grub_video_get_info (&mode_info);
424
grub_errno = GRUB_ERR_NONE;
428
mode_info.mode_type = GRUB_VIDEO_MODE_TYPE_PURE_TEXT;
430
if (suitable && hook)
431
suitable = hook (grub_video_adapter_active, &mode_info);
435
return GRUB_ERR_NONE;
437
next_mode += sizeof ("keep") - 1;
442
return grub_error (GRUB_ERR_BAD_ARGUMENT,
443
"No suitable mode found.");
446
/* Skip separator. */
450
/* De-activate last set video adapter. */
451
if (grub_video_adapter_active)
453
/* Finalize adapter. */
454
grub_video_adapter_active->fini ();
455
if (grub_errno != GRUB_ERR_NONE)
456
grub_errno = GRUB_ERR_NONE;
458
/* Mark active adapter as not set. */
459
grub_video_adapter_active = 0;
462
/* Loop until all modes has been tested out. */
463
while (next_mode != NULL)
465
/* Use last next_mode as current mode. */
468
/* Reset video mode settings. */
474
/* Save position of next mode and separate modes. */
475
for (; *next_mode; next_mode++)
476
if (*next_mode == ',' || *next_mode == ';')
486
/* Skip whitespace. */
487
while (grub_isspace (*tmp))
490
/* Initialize token holders. */
495
/* XXX: we assume that we're in pure text mode if
496
no video mode is initialized. Is it always true? */
497
if (grub_strcmp (param, "text") == 0)
499
struct grub_video_mode_info mode_info;
501
grub_memset (&mode_info, 0, sizeof (mode_info));
502
mode_info.mode_type = GRUB_VIDEO_MODE_TYPE_PURE_TEXT;
504
if (! hook || hook (0, &mode_info))
506
/* Valid mode found from adapter, and it has been activated.
507
Specify it as active adapter. */
508
grub_video_adapter_active = NULL;
513
return GRUB_ERR_NONE;
517
/* Parse <width>x<height>[x<depth>]*/
519
/* Find width value. */
521
param = grub_strchr(param, 'x');
526
/* First setup error message. */
527
rc = grub_error (GRUB_ERR_BAD_ARGUMENT,
528
"Invalid mode: %s\n",
531
/* Free memory before returning. */
540
width = grub_strtoul (value, 0, 0);
541
if (grub_errno != GRUB_ERR_NONE)
545
/* First setup error message. */
546
rc = grub_error (GRUB_ERR_BAD_ARGUMENT,
547
"Invalid mode: %s\n",
550
/* Free memory before returning. */
556
/* Find height value. */
558
param = grub_strchr(param, 'x');
561
height = grub_strtoul (value, 0, 0);
562
if (grub_errno != GRUB_ERR_NONE)
566
/* First setup error message. */
567
rc = grub_error (GRUB_ERR_BAD_ARGUMENT,
568
"Invalid mode: %s\n",
571
/* Free memory before returning. */
579
/* We have optional color depth value. */
583
height = grub_strtoul (value, 0, 0);
584
if (grub_errno != GRUB_ERR_NONE)
588
/* First setup error message. */
589
rc = grub_error (GRUB_ERR_BAD_ARGUMENT,
590
"Invalid mode: %s\n",
593
/* Free memory before returning. */
599
/* Convert color depth value. */
601
depth = grub_strtoul (value, 0, 0);
602
if (grub_errno != GRUB_ERR_NONE)
606
/* First setup error message. */
607
rc = grub_error (GRUB_ERR_BAD_ARGUMENT,
608
"Invalid mode: %s\n",
611
/* Free memory before returning. */
618
/* Try out video mode. */
620
/* If we have 8 or less bits, then assume that it is indexed color mode. */
621
if ((depth <= 8) && (depth != -1))
622
flags |= GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
624
/* We have more than 8 bits, then assume that it is RGB color mode. */
626
flags |= GRUB_VIDEO_MODE_TYPE_RGB;
628
/* If user requested specific depth, forward that information to driver. */
630
flags |= (depth << GRUB_VIDEO_MODE_TYPE_DEPTH_POS)
631
& GRUB_VIDEO_MODE_TYPE_DEPTH_MASK;
633
/* Try to initialize requested mode. Ignore any errors. */
634
grub_video_adapter_t p;
636
/* Loop thru all possible video adapter trying to find requested mode. */
637
for (p = grub_video_adapter_list; p; p = p->next)
640
struct grub_video_mode_info mode_info;
642
grub_memset (&mode_info, 0, sizeof (mode_info));
644
/* Try to initialize adapter, if it fails, skip to next adapter. */
646
if (err != GRUB_ERR_NONE)
648
grub_errno = GRUB_ERR_NONE;
652
/* Try to initialize video mode. */
653
err = p->setup (width, height, flags);
654
if (err != GRUB_ERR_NONE)
657
grub_errno = GRUB_ERR_NONE;
661
err = p->get_info (&mode_info);
662
if (err != GRUB_ERR_NONE)
665
grub_errno = GRUB_ERR_NONE;
669
if (hook && ! hook (p, &mode_info))
672
grub_errno = GRUB_ERR_NONE;
676
/* Valid mode found from adapter, and it has been activated.
677
Specify it as active adapter. */
678
grub_video_adapter_active = p;
683
return GRUB_ERR_NONE;
691
return grub_error (GRUB_ERR_BAD_ARGUMENT,
692
"No suitable mode found.");
402
695
/* Initialize Video API module. */
403
696
GRUB_MOD_INIT(video_video)