Home | History | Annotate | Line # | Download | only in apps
bltgrid.c revision 1.1
      1  1.1  jmcneill /*	$NetBSD: bltgrid.c,v 1.1 2018/08/16 18:17:47 jmcneill Exp $	*/
      2  1.1  jmcneill 
      3  1.1  jmcneill #include <efi.h>
      4  1.1  jmcneill #include <efilib.h>
      5  1.1  jmcneill 
      6  1.1  jmcneill extern EFI_GUID GraphicsOutputProtocol;
      7  1.1  jmcneill 
      8  1.1  jmcneill static void
      9  1.1  jmcneill fill_boxes(UINT32 *PixelBuffer, UINT32 Width, UINT32 Height)
     10  1.1  jmcneill {
     11  1.1  jmcneill 	UINT32 y, x = 0;
     12  1.1  jmcneill 	/*
     13  1.1  jmcneill 	 * This assums BGRR, but it doesn't really matter; we pick red and
     14  1.1  jmcneill 	 * green so it'll just be blue/green if the pixel format is backwards.
     15  1.1  jmcneill 	 */
     16  1.1  jmcneill 	EFI_GRAPHICS_OUTPUT_BLT_PIXEL Red = {0, 0, 0xff, 0},
     17  1.1  jmcneill 				      Green = {0, 0xff, 0, 0},
     18  1.1  jmcneill 				      *Color;
     19  1.1  jmcneill 
     20  1.1  jmcneill 	for (y = 0; y < Height; y++) {
     21  1.1  jmcneill 		Color = ((y / 32) % 2 == 0) ? &Red : &Green;
     22  1.1  jmcneill 		for (x = 0; x < Width; x++) {
     23  1.1  jmcneill 			if (x % 32 == 0 && x != 0)
     24  1.1  jmcneill 				Color = (Color == &Red) ? &Green : &Red;
     25  1.1  jmcneill 			PixelBuffer[y * Width + x] = *(UINT32 *)Color;
     26  1.1  jmcneill 		}
     27  1.1  jmcneill 	}
     28  1.1  jmcneill }
     29  1.1  jmcneill 
     30  1.1  jmcneill static void
     31  1.1  jmcneill draw_boxes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop)
     32  1.1  jmcneill {
     33  1.1  jmcneill 	int i, imax;
     34  1.1  jmcneill 	EFI_STATUS rc;
     35  1.1  jmcneill 	EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info;
     36  1.1  jmcneill 	UINTN NumPixels;
     37  1.1  jmcneill 	UINT32 *PixelBuffer;
     38  1.1  jmcneill 	UINT32 BufferSize;
     39  1.1  jmcneill 
     40  1.1  jmcneill 	if (gop->Mode) {
     41  1.1  jmcneill 		imax = gop->Mode->MaxMode;
     42  1.1  jmcneill 	} else {
     43  1.1  jmcneill 		Print(L"gop->Mode is NULL\n");
     44  1.1  jmcneill 		return;
     45  1.1  jmcneill 	}
     46  1.1  jmcneill 
     47  1.1  jmcneill 	for (i = 0; i < imax; i++) {
     48  1.1  jmcneill 		UINTN SizeOfInfo;
     49  1.1  jmcneill 		rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo,
     50  1.1  jmcneill 					&info);
     51  1.1  jmcneill 		if (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) {
     52  1.1  jmcneill 			Print(L"gop->QueryMode() returned %r\n", rc);
     53  1.1  jmcneill 			Print(L"Trying to start GOP with SetMode().\n");
     54  1.1  jmcneill 			rc = uefi_call_wrapper(gop->SetMode, 2, gop,
     55  1.1  jmcneill 				gop->Mode ? gop->Mode->Mode : 0);
     56  1.1  jmcneill 			rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i,
     57  1.1  jmcneill 				&SizeOfInfo, &info);
     58  1.1  jmcneill 		}
     59  1.1  jmcneill 
     60  1.1  jmcneill 		if (EFI_ERROR(rc)) {
     61  1.1  jmcneill 			Print(L"%d: Bad response from QueryMode: %r (%d)\n",
     62  1.1  jmcneill 			      i, rc, rc);
     63  1.1  jmcneill 			continue;
     64  1.1  jmcneill 		}
     65  1.1  jmcneill 
     66  1.1  jmcneill 		if (CompareMem(info, gop->Mode->Info, sizeof (*info)))
     67  1.1  jmcneill 			continue;
     68  1.1  jmcneill 
     69  1.1  jmcneill 		NumPixels = info->VerticalResolution * info->HorizontalResolution;
     70  1.1  jmcneill 		BufferSize = NumPixels * sizeof(UINT32);
     71  1.1  jmcneill 
     72  1.1  jmcneill 		PixelBuffer = AllocatePool(BufferSize);
     73  1.1  jmcneill 		if (!PixelBuffer) {
     74  1.1  jmcneill 			Print(L"Allocation of 0x%08lx bytes failed.\n",
     75  1.1  jmcneill 			      sizeof(UINT32) * NumPixels);
     76  1.1  jmcneill 			return;
     77  1.1  jmcneill 		}
     78  1.1  jmcneill 
     79  1.1  jmcneill 		fill_boxes(PixelBuffer,
     80  1.1  jmcneill 			   info->HorizontalResolution, info->VerticalResolution);
     81  1.1  jmcneill 
     82  1.1  jmcneill 		uefi_call_wrapper(gop->Blt, 10, gop,
     83  1.1  jmcneill 				  (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)PixelBuffer,
     84  1.1  jmcneill 				  EfiBltBufferToVideo,
     85  1.1  jmcneill 				  0, 0, 0, 0,
     86  1.1  jmcneill 				  info->HorizontalResolution,
     87  1.1  jmcneill 				  info->VerticalResolution,
     88  1.1  jmcneill 				  0);
     89  1.1  jmcneill 		return;
     90  1.1  jmcneill 	}
     91  1.1  jmcneill 	Print(L"Never found the active video mode?\n");
     92  1.1  jmcneill }
     93  1.1  jmcneill 
     94  1.1  jmcneill static EFI_STATUS
     95  1.1  jmcneill SetWatchdog(UINTN seconds)
     96  1.1  jmcneill {
     97  1.1  jmcneill 	EFI_STATUS rc;
     98  1.1  jmcneill 	rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff,
     99  1.1  jmcneill 				0, NULL);
    100  1.1  jmcneill 	if (EFI_ERROR(rc)) {
    101  1.1  jmcneill 		CHAR16 Buffer[64];
    102  1.1  jmcneill 		StatusToString(Buffer, rc);
    103  1.1  jmcneill 		Print(L"Bad response from QueryMode: %s (%d)\n", Buffer, rc);
    104  1.1  jmcneill 	}
    105  1.1  jmcneill 	return rc;
    106  1.1  jmcneill }
    107  1.1  jmcneill 
    108  1.1  jmcneill EFI_STATUS
    109  1.1  jmcneill efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab)
    110  1.1  jmcneill {
    111  1.1  jmcneill 	EFI_STATUS rc;
    112  1.1  jmcneill 	EFI_GRAPHICS_OUTPUT_PROTOCOL *gop;
    113  1.1  jmcneill 
    114  1.1  jmcneill 	InitializeLib(image_handle, systab);
    115  1.1  jmcneill 
    116  1.1  jmcneill 	SetWatchdog(10);
    117  1.1  jmcneill 
    118  1.1  jmcneill 	rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop);
    119  1.1  jmcneill 	if (EFI_ERROR(rc)) {
    120  1.1  jmcneill 		Print(L"Could not locate GOP: %r\n", rc);
    121  1.1  jmcneill 		return rc;
    122  1.1  jmcneill 	}
    123  1.1  jmcneill 
    124  1.1  jmcneill 	if (!gop) {
    125  1.1  jmcneill 		Print(L"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc);
    126  1.1  jmcneill 		return EFI_UNSUPPORTED;
    127  1.1  jmcneill 	}
    128  1.1  jmcneill 
    129  1.1  jmcneill 	draw_boxes(gop);
    130  1.1  jmcneill 
    131  1.1  jmcneill 	SetWatchdog(0);
    132  1.1  jmcneill 	return EFI_SUCCESS;
    133  1.1  jmcneill }
    134