using System.Buffers.Binary;
using Cosmos.Kernel.Boot.Limine;
using XFESystem.Desktop;
namespace XFESystem.Kernel;
internal readonly record struct NativeMonitorInfo(DisplayTimingResult Timing, string Origin, int FirmwareOutputs);
/// Copies bounded original firmware data. Boot Services are never called after exit.
internal static class NativeDisplayInfo
{
private static ReadOnlySpan HandoffGuid => [0x44,0x46,0x45,0x58,0x49,0x53,0x50,0x31,0x9c,0x46,0x58,0x46,0x45,0x53,0x59,0x53];
public static unsafe NativeMonitorInfo Read(int width, int height)
{
const int ReportBytes = 60192, DisplayBytes = 7520;
byte* table = (byte*)(Limine.EfiSystemTable.Response == null ? null : Limine.EfiSystemTable.Response->Address);
if (table != null)
{
var header = new ReadOnlySpan(table, 120);
ulong count = BinaryPrimitives.ReadUInt64LittleEndian(header[104..]);
ulong entriesAddress = BinaryPrimitives.ReadUInt64LittleEndian(header[112..]);
if (count <= 4096 && entriesAddress != 0)
{
var entries = new ReadOnlySpan((void*)entriesAddress, checked((int)count * 24));
for (int i = 0; i < (int)count; i++)
{
var entry = entries.Slice(i * 24, 24);
if (!entry[..16].SequenceEqual(HandoffGuid)) continue;
ulong address = BinaryPrimitives.ReadUInt64LittleEndian(entry[16..]);
if (address == 0) continue;
var reportHeader = new ReadOnlySpan((void*)address, 32);
if (!reportHeader[..8].SequenceEqual("XFEDISP1"u8) ||
BinaryPrimitives.ReadUInt32LittleEndian(reportHeader[8..]) != 1 ||
BinaryPrimitives.ReadUInt32LittleEndian(reportHeader[12..]) != ReportBytes ||
(BinaryPrimitives.ReadUInt32LittleEndian(reportHeader[28..]) & 256) == 0) continue;
uint outputs = BinaryPrimitives.ReadUInt32LittleEndian(reportHeader[16..]);
if (outputs is 0 or > 8) continue;
var report = new ReadOnlySpan((void*)address, ReportBytes);
for (int display = 0; display < (int)outputs; display++)
{
var record = report.Slice(32 + display * DisplayBytes, DisplayBytes);
if (BinaryPrimitives.ReadUInt32LittleEndian(record[40..]) != width ||
BinaryPrimitives.ReadUInt32LittleEndian(record[44..]) != height ||
(BinaryPrimitives.ReadUInt32LittleEndian(record[48..]) & 256) == 0) continue;
uint bytes = BinaryPrimitives.ReadUInt32LittleEndian(record[56..]);
if (bytes is < 128 or > 4096) continue;
var timing = DisplayTiming.Read(record.Slice(3168, (int)bytes), width, height);
if (timing.IsValid) return new(timing, "Original UEFI display handoff", (int)outputs);
}
}
}
}
var response = Limine.Framebuffer.Response;
if (response != null && response->Framebuffers != null && response->FramebufferCount is > 0 and <= 8)
for (int i = 0; i < (int)response->FramebufferCount; i++)
{
var framebuffer = response->Framebuffers[i];
if (framebuffer == null || framebuffer->Width != (ulong)width || framebuffer->Height != (ulong)height ||
framebuffer->Edid == null || framebuffer->EdidSize is < 128 or > 4096) continue;
return new(DisplayTiming.Read(new ReadOnlySpan(framebuffer->Edid, (int)framebuffer->EdidSize), width, height),
"Limine EDID (possibly base block only)", (int)response->FramebufferCount);
}
return new(DisplayTiming.Read([], width, height), "Firmware EDID unavailable", 1);
}
}