root/headers/private/kernel/platform/efi/protocol/graphics-output.h
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once

#include <efi/types.h>

#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \
    {0x9042a9de, 0x23dc, 0x4a38, {0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a}}
extern efi_guid GraphicsOutputProtocol;

typedef struct {
    uint32_t RedMask;
    uint32_t GreenMask;
    uint32_t BlueMask;
    uint32_t ReservedMask;
} efi_pixel_bitmask;

typedef enum {
    PixelRedGreenBlueReserved8BitPerColor,
    PixelBlueGreenRedReserved8BitPerColor,
    PixelBitMask,
    PixelBltOnly,
    PixelFormatMax
} efi_graphics_pixel_format;

typedef struct {
    uint32_t Version;
    uint32_t HorizontalResolution;
    uint32_t VerticalResolution;
    efi_graphics_pixel_format PixelFormat;
    efi_pixel_bitmask PixelInformation;
    uint32_t PixelsPerScanLine;
} efi_graphics_output_mode_information;

typedef struct {
    uint32_t MaxMode;
    uint32_t Mode;
    efi_graphics_output_mode_information* Info;
    size_t SizeOfInfo;
    efi_physical_addr FrameBufferBase;
    size_t FrameBufferSize;
} efi_graphics_output_mode;

typedef struct {
    uint8_t Blue;
    uint8_t Green;
    uint8_t Red;
    uint8_t Reserved;
} efi_graphics_output_blt_pixel;

typedef enum {
    EfiBltVideoFill,
    EfiBltVideoToBltBuffer,
    EfiBltBufferToVideo,
    EfiBltVideoToVideo,
    EfiGraphicsOutputBltOperationMax
} efi_graphics_output_blt_operation;

typedef struct efi_graphics_output_protocol {
    efi_status (*QueryMode) (struct efi_graphics_output_protocol* self,
                             uint32_t mode_num, size_t* info_len,
                             efi_graphics_output_mode_information** info) EFIAPI;

    efi_status (*SetMode) (struct efi_graphics_output_protocol* self,
                           uint32_t mode_num) EFIAPI;

    efi_status (*Blt) (struct efi_graphics_output_protocol* self,
                       efi_graphics_output_blt_pixel* blt_buf,
                       efi_graphics_output_blt_operation blt_operation,
                       size_t src_x, size_t src_y, size_t dest_x, size_t dest_y,
                       size_t width, size_t height, size_t delta) EFIAPI;

    efi_graphics_output_mode* Mode;
} efi_graphics_output_protocol;