2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2006,2007,2008,2009 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
19 #ifndef GRUB_VIDEO_HEADER
20 #define GRUB_VIDEO_HEADER 1
23 #include <grub/types.h>
24 #include <grub/list.h>
26 /* Video color in hardware dependent format. Users should not assume any
27 specific coding format. */
28 typedef grub_uint32_t grub_video_color_t
;
30 /* Video color in hardware independent format. */
31 typedef struct grub_video_rgba_color
37 } grub_video_rgba_color_t
;
39 /* This structure is driver specific and should not be accessed directly by
41 struct grub_video_render_target
;
43 /* Forward declarations for used data structures. */
44 struct grub_video_bitmap
;
46 /* Defines used to describe video mode or rendering target. */
47 /* If following is set render target contains currenly displayed image
48 after swapping buffers (otherwise it contains previously displayed image).
50 typedef enum grub_video_mode_type
52 GRUB_VIDEO_MODE_TYPE_RGB
= 0x00000001,
53 GRUB_VIDEO_MODE_TYPE_INDEX_COLOR
= 0x00000002,
54 GRUB_VIDEO_MODE_TYPE_1BIT_BITMAP
= 0x00000004,
55 GRUB_VIDEO_MODE_TYPE_YUV
= 0x00000008,
57 /* Defines used to mask flags. */
58 GRUB_VIDEO_MODE_TYPE_COLOR_MASK
= 0x0000000F,
60 GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED
= 0x00000010,
61 GRUB_VIDEO_MODE_TYPE_ALPHA
= 0x00000020,
62 GRUB_VIDEO_MODE_TYPE_PURE_TEXT
= 0x00000040,
63 GRUB_VIDEO_MODE_TYPE_UPDATING_SWAP
= 0x00000080,
64 GRUB_VIDEO_MODE_TYPE_OPERATIONAL_MASK
= 0x000000F0,
66 /* Defines used to specify requested bit depth. */
67 GRUB_VIDEO_MODE_TYPE_DEPTH_MASK
= 0x0000FF00,
68 #define GRUB_VIDEO_MODE_TYPE_DEPTH_POS 8
70 GRUB_VIDEO_MODE_TYPE_UNKNOWN
= 0x00010000,
71 GRUB_VIDEO_MODE_TYPE_HERCULES
= 0x00020000,
72 GRUB_VIDEO_MODE_TYPE_PLANAR
= 0x00040000,
73 GRUB_VIDEO_MODE_TYPE_NONCHAIN4
= 0x00080000,
74 GRUB_VIDEO_MODE_TYPE_CGA
= 0x00100000,
75 GRUB_VIDEO_MODE_TYPE_INFO_MASK
= 0x00FF0000,
76 } grub_video_mode_type_t
;
78 /* The basic render target representing the whole display. This always
79 renders to the back buffer when double-buffering is in use. */
80 #define GRUB_VIDEO_RENDER_TARGET_DISPLAY \
81 ((struct grub_video_render_target *) 0)
83 /* Defined blitting formats. */
84 enum grub_video_blit_format
86 /* Generic RGBA, use fields & masks. */
87 GRUB_VIDEO_BLIT_FORMAT_RGBA
,
89 /* Optimized RGBA's. */
90 GRUB_VIDEO_BLIT_FORMAT_RGBA_8888
,
91 GRUB_VIDEO_BLIT_FORMAT_BGRA_8888
,
93 /* Generic RGB, use fields & masks. */
94 GRUB_VIDEO_BLIT_FORMAT_RGB
,
96 /* Optimized RGB's. */
97 GRUB_VIDEO_BLIT_FORMAT_RGB_888
,
98 GRUB_VIDEO_BLIT_FORMAT_BGR_888
,
99 GRUB_VIDEO_BLIT_FORMAT_RGB_565
,
100 GRUB_VIDEO_BLIT_FORMAT_BGR_565
,
102 /* When needed, decode color or just use value as is. */
103 GRUB_VIDEO_BLIT_FORMAT_INDEXCOLOR
,
105 /* Two color bitmap; bits packed: rows are not padded to byte boundary. */
106 GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED
109 /* Define blitting operators. */
110 enum grub_video_blit_operators
112 /* Replace target bitmap data with source. */
113 GRUB_VIDEO_BLIT_REPLACE
,
114 /* Blend target and source based on source's alpha value. */
115 GRUB_VIDEO_BLIT_BLEND
118 struct grub_video_mode_info
120 /* Width of the screen. */
123 /* Height of the screen. */
126 /* Mode type bitmask. Contains information like is it Index color or
128 grub_video_mode_type_t mode_type
;
130 /* Bits per pixel. */
133 /* Bytes per pixel. */
134 unsigned int bytes_per_pixel
;
136 /* Pitch of one scanline. How many bytes there are for scanline. */
139 /* In index color mode, number of colors. In RGB mode this is 256. */
140 unsigned int number_of_colors
;
142 unsigned int mode_number
;
143 #define GRUB_VIDEO_MODE_NUMBER_INVALID 0xffffffff
145 /* Optimization hint how binary data is coded. */
146 enum grub_video_blit_format blit_format
;
148 /* How many bits are reserved for red color. */
149 unsigned int red_mask_size
;
151 /* What is location of red color bits. In Index Color mode, this is 0. */
152 unsigned int red_field_pos
;
154 /* How many bits are reserved for green color. */
155 unsigned int green_mask_size
;
157 /* What is location of green color bits. In Index Color mode, this is 0. */
158 unsigned int green_field_pos
;
160 /* How many bits are reserved for blue color. */
161 unsigned int blue_mask_size
;
163 /* What is location of blue color bits. In Index Color mode, this is 0. */
164 unsigned int blue_field_pos
;
166 /* How many bits are reserved in color. */
167 unsigned int reserved_mask_size
;
169 /* What is location of reserved color bits. In Index Color mode,
171 unsigned int reserved_field_pos
;
173 /* For 1-bit bitmaps, the background color. Used for bits = 0. */
175 grub_uint8_t bg_green
;
176 grub_uint8_t bg_blue
;
177 grub_uint8_t bg_alpha
;
179 /* For 1-bit bitmaps, the foreground color. Used for bits = 1. */
181 grub_uint8_t fg_green
;
182 grub_uint8_t fg_blue
;
183 grub_uint8_t fg_alpha
;
186 /* A 2D rectangle type. */
187 struct grub_video_rect
194 typedef struct grub_video_rect grub_video_rect_t
;
196 struct grub_video_signed_rect
203 typedef struct grub_video_signed_rect grub_video_signed_rect_t
;
205 struct grub_video_palette_data
207 grub_uint8_t r
; /* Red color value (0-255). */
208 grub_uint8_t g
; /* Green color value (0-255). */
209 grub_uint8_t b
; /* Blue color value (0-255). */
210 grub_uint8_t a
; /* Reserved bits value (0-255). */
213 struct grub_video_edid_info
215 grub_uint8_t header
[8];
216 grub_uint16_t manufacturer_id
;
217 grub_uint16_t product_id
;
218 grub_uint32_t serial_number
;
219 grub_uint8_t week_of_manufacture
;
220 grub_uint8_t year_of_manufacture
;
221 grub_uint8_t version
;
222 grub_uint8_t revision
;
224 grub_uint8_t video_input_definition
;
225 grub_uint8_t max_horizontal_image_size
;
226 grub_uint8_t max_vertical_image_size
;
227 grub_uint8_t display_gamma
;
228 grub_uint8_t feature_support
;
229 #define GRUB_VIDEO_EDID_FEATURE_PREFERRED_TIMING_MODE (1 << 1)
231 grub_uint8_t red_green_lo
;
232 grub_uint8_t blue_white_lo
;
233 grub_uint8_t red_x_hi
;
234 grub_uint8_t red_y_hi
;
235 grub_uint8_t green_x_hi
;
236 grub_uint8_t green_y_hi
;
237 grub_uint8_t blue_x_hi
;
238 grub_uint8_t blue_y_hi
;
239 grub_uint8_t white_x_hi
;
240 grub_uint8_t white_y_hi
;
242 grub_uint8_t established_timings_1
;
243 grub_uint8_t established_timings_2
;
244 grub_uint8_t manufacturer_reserved_timings
;
246 grub_uint16_t standard_timings
[8];
249 grub_uint16_t pixel_clock
;
250 /* Only valid if the pixel clock is non-null. */
251 grub_uint8_t horizontal_active_lo
;
252 grub_uint8_t horizontal_blanking_lo
;
253 grub_uint8_t horizontal_hi
;
254 grub_uint8_t vertical_active_lo
;
255 grub_uint8_t vertical_blanking_lo
;
256 grub_uint8_t vertical_hi
;
257 grub_uint8_t horizontal_sync_offset_lo
;
258 grub_uint8_t horizontal_sync_pulse_width_lo
;
259 grub_uint8_t vertical_sync_lo
;
260 grub_uint8_t sync_hi
;
261 grub_uint8_t horizontal_image_size_lo
;
262 grub_uint8_t vertical_image_size_lo
;
263 grub_uint8_t image_size_hi
;
264 grub_uint8_t horizontal_border
;
265 grub_uint8_t vertical_border
;
267 } detailed_timings
[4];
269 grub_uint8_t extension_flag
;
270 grub_uint8_t checksum
;
271 } __attribute__ ((packed
));
273 typedef enum grub_video_driver_id
275 GRUB_VIDEO_DRIVER_NONE
,
276 GRUB_VIDEO_DRIVER_VBE
,
277 GRUB_VIDEO_DRIVER_EFI_UGA
,
278 GRUB_VIDEO_DRIVER_EFI_GOP
,
279 GRUB_VIDEO_DRIVER_SM712
,
280 GRUB_VIDEO_DRIVER_VGA
,
281 GRUB_VIDEO_DRIVER_CIRRUS
,
282 GRUB_VIDEO_DRIVER_BOCHS
,
283 GRUB_VIDEO_DRIVER_SDL
,
284 GRUB_VIDEO_DRIVER_SIS315PRO
,
285 GRUB_VIDEO_DRIVER_RADEON_FULOONG2E
,
286 } grub_video_driver_id_t
;
288 typedef enum grub_video_adapter_prio
290 GRUB_VIDEO_ADAPTER_PRIO_FALLBACK
= 60,
291 GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE_DIRTY
= 70,
292 GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE
= 80,
293 GRUB_VIDEO_ADAPTER_PRIO_NATIVE
= 100
294 } grub_video_adapter_prio_t
;
297 struct grub_video_adapter
299 /* The next video adapter. */
300 struct grub_video_adapter
*next
;
301 struct grub_video_adapter
**prev
;
303 /* The video adapter name. */
305 grub_video_driver_id_t id
;
307 grub_video_adapter_prio_t prio
;
309 /* Initialize the video adapter. */
310 grub_err_t (*init
) (void);
312 /* Clean up the video adapter. */
313 grub_err_t (*fini
) (void);
315 grub_err_t (*setup
) (unsigned int width
, unsigned int height
,
316 grub_video_mode_type_t mode_type
,
317 grub_video_mode_type_t mode_mask
);
319 grub_err_t (*get_info
) (struct grub_video_mode_info
*mode_info
);
321 grub_err_t (*get_info_and_fini
) (struct grub_video_mode_info
*mode_info
,
324 grub_err_t (*set_palette
) (unsigned int start
, unsigned int count
,
325 struct grub_video_palette_data
*palette_data
);
327 grub_err_t (*get_palette
) (unsigned int start
, unsigned int count
,
328 struct grub_video_palette_data
*palette_data
);
330 grub_err_t (*set_viewport
) (unsigned int x
, unsigned int y
,
331 unsigned int width
, unsigned int height
);
333 grub_err_t (*get_viewport
) (unsigned int *x
, unsigned int *y
,
334 unsigned int *width
, unsigned int *height
);
336 grub_video_color_t (*map_color
) (grub_uint32_t color_name
);
338 grub_video_color_t (*map_rgb
) (grub_uint8_t red
, grub_uint8_t green
,
341 grub_video_color_t (*map_rgba
) (grub_uint8_t red
, grub_uint8_t green
,
342 grub_uint8_t blue
, grub_uint8_t alpha
);
344 grub_err_t (*unmap_color
) (grub_video_color_t color
,
345 grub_uint8_t
*red
, grub_uint8_t
*green
,
346 grub_uint8_t
*blue
, grub_uint8_t
*alpha
);
348 grub_err_t (*fill_rect
) (grub_video_color_t color
, int x
, int y
,
349 unsigned int width
, unsigned int height
);
351 grub_err_t (*blit_bitmap
) (struct grub_video_bitmap
*bitmap
,
352 enum grub_video_blit_operators oper
,
353 int x
, int y
, int offset_x
, int offset_y
,
354 unsigned int width
, unsigned int height
);
356 grub_err_t (*blit_render_target
) (struct grub_video_render_target
*source
,
357 enum grub_video_blit_operators oper
,
358 int x
, int y
, int offset_x
, int offset_y
,
359 unsigned int width
, unsigned int height
);
361 grub_err_t (*scroll
) (grub_video_color_t color
, int dx
, int dy
);
363 grub_err_t (*swap_buffers
) (void);
365 grub_err_t (*create_render_target
) (struct grub_video_render_target
**result
,
366 unsigned int width
, unsigned int height
,
367 unsigned int mode_type
);
369 grub_err_t (*delete_render_target
) (struct grub_video_render_target
*target
);
371 grub_err_t (*set_active_render_target
) (struct grub_video_render_target
*target
);
373 grub_err_t (*get_active_render_target
) (struct grub_video_render_target
**target
);
375 int (*iterate
) (int (*hook
) (const struct grub_video_mode_info
*info
));
377 grub_err_t (*get_edid
) (struct grub_video_edid_info
*edid_info
);
379 void (*print_adapter_specific_info
) (void);
381 typedef struct grub_video_adapter
*grub_video_adapter_t
;
383 extern grub_video_adapter_t
EXPORT_VAR(grub_video_adapter_list
);
385 #ifndef GRUB_LST_GENERATOR
386 /* Register video driver. */
388 grub_video_register (grub_video_adapter_t adapter
)
390 grub_video_adapter_t
*p
;
391 for (p
= &grub_video_adapter_list
; *p
&& (*p
)->prio
> adapter
->prio
;
398 /* Unregister video driver. */
400 grub_video_unregister (grub_video_adapter_t adapter
)
402 grub_list_remove (GRUB_AS_LIST (adapter
));
405 #define FOR_VIDEO_ADAPTERS(var) FOR_LIST_ELEMENTS((var), (grub_video_adapter_list))
407 grub_err_t
EXPORT_FUNC (grub_video_restore
) (void);
409 grub_err_t
EXPORT_FUNC (grub_video_get_info
) (struct grub_video_mode_info
*mode_info
);
411 /* Framebuffer address may change as a part of normal operation
412 (e.g. double buffering). That's why you need to stop video subsystem to be
413 sure that framebuffer address doesn't change. To ensure this abstraction
414 grub_video_get_info_and_fini is the only function supplying framebuffer
416 grub_err_t
EXPORT_FUNC (grub_video_get_info_and_fini
) (struct grub_video_mode_info
*mode_info
,
419 enum grub_video_blit_format
grub_video_get_blit_format (struct grub_video_mode_info
*mode_info
);
421 grub_err_t
grub_video_set_palette (unsigned int start
, unsigned int count
,
422 struct grub_video_palette_data
*palette_data
);
424 grub_err_t
EXPORT_FUNC (grub_video_get_palette
) (unsigned int start
,
426 struct grub_video_palette_data
*palette_data
);
428 grub_err_t
EXPORT_FUNC (grub_video_set_viewport
) (unsigned int x
,
431 unsigned int height
);
433 grub_err_t
EXPORT_FUNC (grub_video_get_viewport
) (unsigned int *x
,
436 unsigned int *height
);
438 grub_video_color_t
EXPORT_FUNC (grub_video_map_color
) (grub_uint32_t color_name
);
440 grub_video_color_t
EXPORT_FUNC (grub_video_map_rgb
) (grub_uint8_t red
,
444 grub_video_color_t
EXPORT_FUNC (grub_video_map_rgba
) (grub_uint8_t red
,
449 grub_err_t
EXPORT_FUNC (grub_video_unmap_color
) (grub_video_color_t color
,
453 grub_uint8_t
*alpha
);
455 grub_err_t
EXPORT_FUNC (grub_video_fill_rect
) (grub_video_color_t color
,
458 unsigned int height
);
460 grub_err_t
EXPORT_FUNC (grub_video_blit_bitmap
) (struct grub_video_bitmap
*bitmap
,
461 enum grub_video_blit_operators oper
,
463 int offset_x
, int offset_y
,
465 unsigned int height
);
467 grub_err_t
EXPORT_FUNC (grub_video_blit_render_target
) (struct grub_video_render_target
*source
,
468 enum grub_video_blit_operators oper
,
473 unsigned int height
);
475 grub_err_t
grub_video_scroll (grub_video_color_t color
, int dx
, int dy
);
477 grub_err_t
EXPORT_FUNC (grub_video_swap_buffers
) (void);
479 grub_err_t
EXPORT_FUNC (grub_video_create_render_target
) (struct grub_video_render_target
**result
,
482 unsigned int mode_type
);
484 grub_err_t
EXPORT_FUNC (grub_video_delete_render_target
) (struct grub_video_render_target
*target
);
486 grub_err_t
EXPORT_FUNC (grub_video_set_active_render_target
) (struct grub_video_render_target
*target
);
488 grub_err_t
grub_video_get_active_render_target (struct grub_video_render_target
**target
);
490 grub_err_t
EXPORT_FUNC (grub_video_edid_checksum
) (struct grub_video_edid_info
*edid_info
);
491 grub_err_t
EXPORT_FUNC (grub_video_edid_preferred_mode
) (struct grub_video_edid_info
*edid_info
,
493 unsigned int *height
);
495 grub_err_t
EXPORT_FUNC (grub_video_set_mode
) (const char *modestring
,
496 unsigned int modemask
,
497 unsigned int modevalue
);
500 grub_video_check_mode_flag (grub_video_mode_type_t flags
,
501 grub_video_mode_type_t mask
,
502 grub_video_mode_type_t flag
, int def
)
504 return (flag
& mask
) ? !! (flags
& flag
) : def
;
507 grub_video_driver_id_t
EXPORT_FUNC (grub_video_get_driver_id
) (void);
509 static __inline grub_video_rgba_color_t
510 grub_video_rgba_color_rgb (int r
, int g
, int b
)
512 grub_video_rgba_color_t c
;
520 static __inline grub_video_color_t
521 grub_video_map_rgba_color (grub_video_rgba_color_t c
)
523 return grub_video_map_rgba (c
.red
, c
.green
, c
.blue
, c
.alpha
);
526 int EXPORT_FUNC (grub_video_get_named_color
) (const char *name
,
527 grub_video_rgba_color_t
*color
);
529 grub_err_t
EXPORT_FUNC (grub_video_parse_color
) (const char *s
,
530 grub_video_rgba_color_t
*color
);
532 #ifndef GRUB_MACHINE_EMU
533 extern void grub_font_init (void);
534 extern void grub_font_fini (void);
535 extern void grub_gfxterm_init (void);
536 extern void grub_gfxterm_fini (void);
537 extern void grub_video_sm712_init (void);
538 extern void grub_video_sm712_fini (void);
539 extern void grub_video_sis315pro_init (void);
540 extern void grub_video_radeon_fuloong2e_init (void);
541 extern void grub_video_sis315pro_fini (void);
542 extern void grub_video_radeon_fuloong2e_fini (void);
545 #endif /* ! GRUB_VIDEO_HEADER */