1*1370a723SSascha Wildner /** @file
2*1370a723SSascha Wildner   UGA Draw protocol from the EFI 1.10 specification.
3*1370a723SSascha Wildner 
4*1370a723SSascha Wildner   Abstraction of a very simple graphics device.
5*1370a723SSascha Wildner 
6*1370a723SSascha Wildner   Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
7*1370a723SSascha Wildner   SPDX-License-Identifier: BSD-2-Clause-Patent
8*1370a723SSascha Wildner 
9*1370a723SSascha Wildner **/
10*1370a723SSascha Wildner 
11*1370a723SSascha Wildner #ifndef __UGA_DRAW_H__
12*1370a723SSascha Wildner #define __UGA_DRAW_H__
13*1370a723SSascha Wildner 
14*1370a723SSascha Wildner #define EFI_UGA_DRAW_PROTOCOL_GUID \
15*1370a723SSascha Wildner   { \
16*1370a723SSascha Wildner     0x982c298b, 0xf4fa, 0x41cb, {0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39 } \
17*1370a723SSascha Wildner   }
18*1370a723SSascha Wildner 
19*1370a723SSascha Wildner typedef struct _EFI_UGA_DRAW_PROTOCOL EFI_UGA_DRAW_PROTOCOL;
20*1370a723SSascha Wildner 
21*1370a723SSascha Wildner /**
22*1370a723SSascha Wildner   Return the current video mode information.
23*1370a723SSascha Wildner 
24*1370a723SSascha Wildner   @param  This                  The EFI_UGA_DRAW_PROTOCOL instance.
25*1370a723SSascha Wildner   @param  HorizontalResolution  The size of video screen in pixels in the X dimension.
26*1370a723SSascha Wildner   @param  VerticalResolution    The size of video screen in pixels in the Y dimension.
27*1370a723SSascha Wildner   @param  ColorDepth            Number of bits per pixel, currently defined to be 32.
28*1370a723SSascha Wildner   @param  RefreshRate           The refresh rate of the monitor in Hertz.
29*1370a723SSascha Wildner 
30*1370a723SSascha Wildner   @retval EFI_SUCCESS           Mode information returned.
31*1370a723SSascha Wildner   @retval EFI_NOT_STARTED       Video display is not initialized. Call SetMode ()
32*1370a723SSascha Wildner   @retval EFI_INVALID_PARAMETER One of the input args was NULL.
33*1370a723SSascha Wildner 
34*1370a723SSascha Wildner **/
35*1370a723SSascha Wildner typedef
36*1370a723SSascha Wildner EFI_STATUS
37*1370a723SSascha Wildner (EFIAPI *EFI_UGA_DRAW_PROTOCOL_GET_MODE)(
38*1370a723SSascha Wildner   IN  EFI_UGA_DRAW_PROTOCOL *This,
39*1370a723SSascha Wildner   OUT UINT32                *HorizontalResolution,
40*1370a723SSascha Wildner   OUT UINT32                *VerticalResolution,
41*1370a723SSascha Wildner   OUT UINT32                *ColorDepth,
42*1370a723SSascha Wildner   OUT UINT32                *RefreshRate
43*1370a723SSascha Wildner   );
44*1370a723SSascha Wildner 
45*1370a723SSascha Wildner /**
46*1370a723SSascha Wildner   Set the current video mode information.
47*1370a723SSascha Wildner 
48*1370a723SSascha Wildner   @param  This                 The EFI_UGA_DRAW_PROTOCOL instance.
49*1370a723SSascha Wildner   @param  HorizontalResolution The size of video screen in pixels in the X dimension.
50*1370a723SSascha Wildner   @param  VerticalResolution   The size of video screen in pixels in the Y dimension.
51*1370a723SSascha Wildner   @param  ColorDepth           Number of bits per pixel, currently defined to be 32.
52*1370a723SSascha Wildner   @param  RefreshRate          The refresh rate of the monitor in Hertz.
53*1370a723SSascha Wildner 
54*1370a723SSascha Wildner   @retval EFI_SUCCESS          Mode information returned.
55*1370a723SSascha Wildner   @retval EFI_NOT_STARTED      Video display is not initialized. Call SetMode ()
56*1370a723SSascha Wildner 
57*1370a723SSascha Wildner **/
58*1370a723SSascha Wildner typedef
59*1370a723SSascha Wildner EFI_STATUS
60*1370a723SSascha Wildner (EFIAPI *EFI_UGA_DRAW_PROTOCOL_SET_MODE)(
61*1370a723SSascha Wildner   IN  EFI_UGA_DRAW_PROTOCOL *This,
62*1370a723SSascha Wildner   IN  UINT32                HorizontalResolution,
63*1370a723SSascha Wildner   IN  UINT32                VerticalResolution,
64*1370a723SSascha Wildner   IN  UINT32                ColorDepth,
65*1370a723SSascha Wildner   IN  UINT32                RefreshRate
66*1370a723SSascha Wildner   );
67*1370a723SSascha Wildner 
68*1370a723SSascha Wildner typedef struct {
69*1370a723SSascha Wildner   UINT8 Blue;
70*1370a723SSascha Wildner   UINT8 Green;
71*1370a723SSascha Wildner   UINT8 Red;
72*1370a723SSascha Wildner   UINT8 Reserved;
73*1370a723SSascha Wildner } EFI_UGA_PIXEL;
74*1370a723SSascha Wildner 
75*1370a723SSascha Wildner typedef union {
76*1370a723SSascha Wildner   EFI_UGA_PIXEL Pixel;
77*1370a723SSascha Wildner   UINT32        Raw;
78*1370a723SSascha Wildner } EFI_UGA_PIXEL_UNION;
79*1370a723SSascha Wildner 
80*1370a723SSascha Wildner ///
81*1370a723SSascha Wildner /// Enumration value for actions of Blt operations.
82*1370a723SSascha Wildner ///
83*1370a723SSascha Wildner typedef enum {
84*1370a723SSascha Wildner   EfiUgaVideoFill,          ///< Write data from the  BltBuffer pixel (SourceX, SourceY)
85*1370a723SSascha Wildner                             ///< directly to every pixel of the video display rectangle
86*1370a723SSascha Wildner                             ///< (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height).
87*1370a723SSascha Wildner                             ///< Only one pixel will be used from the BltBuffer. Delta is NOT used.
88*1370a723SSascha Wildner 
89*1370a723SSascha Wildner   EfiUgaVideoToBltBuffer,   ///< Read data from the video display rectangle
90*1370a723SSascha Wildner                             ///< (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in
91*1370a723SSascha Wildner                             ///< the BltBuffer rectangle (DestinationX, DestinationY )
92*1370a723SSascha Wildner                             ///< (DestinationX + Width, DestinationY + Height). If DestinationX or
93*1370a723SSascha Wildner                             ///< DestinationY is not zero then Delta must be set to the length in bytes
94*1370a723SSascha Wildner                             ///< of a row in the BltBuffer.
95*1370a723SSascha Wildner 
96*1370a723SSascha Wildner   EfiUgaBltBufferToVideo,   ///< Write data from the  BltBuffer rectangle
97*1370a723SSascha Wildner                             ///< (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the
98*1370a723SSascha Wildner                             ///< video display rectangle (DestinationX, DestinationY)
99*1370a723SSascha Wildner                             ///< (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is
100*1370a723SSascha Wildner                             ///< not zero then Delta must be set to the length in bytes of a row in the
101*1370a723SSascha Wildner                             ///< BltBuffer.
102*1370a723SSascha Wildner 
103*1370a723SSascha Wildner   EfiUgaVideoToVideo,       ///< Copy from the video display rectangle (SourceX, SourceY)
104*1370a723SSascha Wildner                             ///< (SourceX + Width, SourceY + Height) .to the video display rectangle
105*1370a723SSascha Wildner                             ///< (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height).
106*1370a723SSascha Wildner                             ///< The BltBuffer and Delta  are not used in this mode.
107*1370a723SSascha Wildner 
108*1370a723SSascha Wildner   EfiUgaBltMax              ///< Maxmimum value for enumration value of Blt operation. If a Blt operation
109*1370a723SSascha Wildner                             ///< larger or equal to this enumration value, it is invalid.
110*1370a723SSascha Wildner } EFI_UGA_BLT_OPERATION;
111*1370a723SSascha Wildner 
112*1370a723SSascha Wildner /**
113*1370a723SSascha Wildner     Blt a rectangle of pixels on the graphics screen.
114*1370a723SSascha Wildner 
115*1370a723SSascha Wildner     @param[in] This          - Protocol instance pointer.
116*1370a723SSascha Wildner     @param[in] BltBuffer     - Buffer containing data to blit into video buffer. This
117*1370a723SSascha Wildner                                buffer has a size of Width*Height*sizeof(EFI_UGA_PIXEL)
118*1370a723SSascha Wildner     @param[in] BltOperation  - Operation to perform on BlitBuffer and video memory
119*1370a723SSascha Wildner     @param[in] SourceX       - X coordinate of source for the BltBuffer.
120*1370a723SSascha Wildner     @param[in] SourceY       - Y coordinate of source for the BltBuffer.
121*1370a723SSascha Wildner     @param[in] DestinationX  - X coordinate of destination for the BltBuffer.
122*1370a723SSascha Wildner     @param[in] DestinationY  - Y coordinate of destination for the BltBuffer.
123*1370a723SSascha Wildner     @param[in] Width         - Width of rectangle in BltBuffer in pixels.
124*1370a723SSascha Wildner     @param[in] Height        - Hight of rectangle in BltBuffer in pixels.
125*1370a723SSascha Wildner     @param[in] Delta         - OPTIONAL
126*1370a723SSascha Wildner 
127*1370a723SSascha Wildner     @retval EFI_SUCCESS           - The Blt operation completed.
128*1370a723SSascha Wildner     @retval EFI_INVALID_PARAMETER - BltOperation is not valid.
129*1370a723SSascha Wildner     @retval EFI_DEVICE_ERROR      - A hardware error occurred writting to the video buffer.
130*1370a723SSascha Wildner 
131*1370a723SSascha Wildner **/
132*1370a723SSascha Wildner typedef
133*1370a723SSascha Wildner EFI_STATUS
134*1370a723SSascha Wildner (EFIAPI *EFI_UGA_DRAW_PROTOCOL_BLT)(
135*1370a723SSascha Wildner   IN  EFI_UGA_DRAW_PROTOCOL                   * This,
136*1370a723SSascha Wildner   IN  EFI_UGA_PIXEL                           *BltBuffer  OPTIONAL,
137*1370a723SSascha Wildner   IN  EFI_UGA_BLT_OPERATION                   BltOperation,
138*1370a723SSascha Wildner   IN  UINTN                                   SourceX,
139*1370a723SSascha Wildner   IN  UINTN                                   SourceY,
140*1370a723SSascha Wildner   IN  UINTN                                   DestinationX,
141*1370a723SSascha Wildner   IN  UINTN                                   DestinationY,
142*1370a723SSascha Wildner   IN  UINTN                                   Width,
143*1370a723SSascha Wildner   IN  UINTN                                   Height,
144*1370a723SSascha Wildner   IN  UINTN                                   Delta         OPTIONAL
145*1370a723SSascha Wildner   );
146*1370a723SSascha Wildner 
147*1370a723SSascha Wildner ///
148*1370a723SSascha Wildner /// This protocol provides a basic abstraction to set video modes and
149*1370a723SSascha Wildner /// copy pixels to and from the graphics controller's frame buffer.
150*1370a723SSascha Wildner ///
151*1370a723SSascha Wildner struct _EFI_UGA_DRAW_PROTOCOL {
152*1370a723SSascha Wildner   EFI_UGA_DRAW_PROTOCOL_GET_MODE  GetMode;
153*1370a723SSascha Wildner   EFI_UGA_DRAW_PROTOCOL_SET_MODE  SetMode;
154*1370a723SSascha Wildner   EFI_UGA_DRAW_PROTOCOL_BLT       Blt;
155*1370a723SSascha Wildner };
156*1370a723SSascha Wildner 
157*1370a723SSascha Wildner extern EFI_GUID gEfiUgaDrawProtocolGuid;
158*1370a723SSascha Wildner 
159*1370a723SSascha Wildner #endif
160