// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#ifndef ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_GRAPHICS_OUTPUT_H_
#define ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_GRAPHICS_OUTPUT_H_

#include <zircon/compiler.h>

#include <efi/types.h>

__BEGIN_CDECLS

#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID                                          \
  {                                                                                \
    0x9042a9de, 0x23dc, 0x4a38, { 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a } \
  }
extern const 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;

__END_CDECLS

#endif  // ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_GRAPHICS_OUTPUT_H_
