using System.Runtime.InteropServices; namespace XFESystem.Boot { // Version 1 intentionally keeps the existing fixed-width firmware handoff. // It contains original EDID/path bytes, never pointers to temporary firmware data. [StructLayout(LayoutKind.Sequential)] public struct DisplayMode { public uint Id, Width, Height, StridePixels, BitsPerPixel, Flags; public bool IsValid => (Flags & 1) != 0 && Width >= 320 && Width <= 16384 && Height >= 200 && Height <= 16384 && StridePixels >= Width && (BitsPerPixel == 24 || BitsPerPixel == 32) && (ulong)StridePixels * Height * BitsPerPixel / 8 <= 256 * 1024 * 1024; } [StructLayout(LayoutKind.Sequential)] public unsafe struct DisplayRecord { public ulong FramebufferBase, FramebufferBytes, Handle; public uint ModeCount, FirmwareModeCount, SelectedMode, OriginalMode; public uint Width, Height, Flags, SetStatus, EdidBytes, EdidSource, PathBytes, Choice; public uint StridePixels, PixelFormat, RedMask, GreenMask, BlueMask, RequestedMode; public fixed byte Modes[128 * 24]; public fixed byte Edid[4096]; public fixed byte Path[256]; } [StructLayout(LayoutKind.Sequential)] public unsafe struct DisplayHandoff { public const int MaximumDisplays = 8, MaximumModes = 128; public const uint FinalGeometry = 256, BootloaderChangedMode = 512, SelectedModeHint = 1024; public ulong Magic; public uint Version, Bytes, DisplayCount, DisplayControllers, ConnectFailures, Flags; public fixed byte Displays[8 * 7520]; } public static unsafe class DisplayPolicy { public static bool IsEdidValid(byte* edid, uint bytes) { if (edid == null || bytes < 128 || bytes > 4096 || edid[0] != 0 || edid[7] != 0 || edid[18] != 1) return false; for (int i = 1; i < 7; i++) if (edid[i] != 255) return false; byte sum = 0; for (int i = 0; i < 128; i++) sum = (byte)(sum + edid[i]); return sum == 0; } static bool DetailedMatches(byte* data, uint width, uint height) => (data[0] != 0 || data[1] != 0) && ((uint)data[2] | ((uint)(data[4] & 0xF0) << 4)) == width && ((uint)data[5] | ((uint)(data[7] & 0xF0) << 4)) == height; public static bool EdidAdvertises(byte* edid, uint bytes, uint width, uint height) { if (!IsEdidValid(edid, bytes)) return false; for (int at = 54; at + 18 <= 126; at += 18) if (DetailedMatches(edid + at, width, height)) return true; for (int at = 38; at < 54; at += 2) { if (edid[at] <= 1) continue; uint w = ((uint)edid[at] + 31) * 8; uint aspect = (uint)(edid[at + 1] >> 6); uint h = aspect == 0 ? w * 10 / 16 : aspect == 1 ? w * 3 / 4 : aspect == 2 ? w * 4 / 5 : w * 9 / 16; if (w == width && h == height) return true; } uint blocks = edid[126] < 31 ? edid[126] : 31u; for (uint block = 0; block < blocks && (block + 2) * 128 <= bytes; block++) { byte* data = edid + (block + 1) * 128; byte sum = 0; for (int i = 0; i < 128; i++) sum = (byte)(sum + data[i]); uint end = data[2]; if (data[0] != 2 || sum != 0 || end < 4 || end > 127) continue; for (uint at = end; at + 18 <= 127; at += 18) if (DetailedMatches(data + at, width, height)) return true; uint cursor = 4; while (cursor < end) { uint length = (uint)(data[cursor] & 31), kind = (uint)(data[cursor] >> 5); cursor++; if (cursor + length > end) break; if (kind == 2) for (uint i = 0; i < length; i++) { uint w, h; VicResolution((uint)(data[cursor + i] & 127), out w, out h); if (w == width && h == height && w != 0) return true; } cursor += length; } } return false; } static void VicResolution(uint id, out uint width, out uint height) { width = height = 0; if (id == 1) { width = 640; height = 480; } else if (id == 2 || id == 3 || id == 6 || id == 7 || id >= 48 && id <= 51 || id >= 56 && id <= 59) { width = 720; height = 480; } else if (id == 4 || id == 19 || id == 41 || id == 47 || id >= 60 && id <= 62 || id >= 65 && id <= 71 || id == 108 || id == 109) { width = 1280; height = 720; } else if (id == 5 || id == 16 || id == 20 || id >= 31 && id <= 34 || id == 39 || id == 40 || id == 46 || id == 63 || id == 64 || id >= 72 && id <= 78 || id == 110 || id == 111) { width = 1920; height = 1080; } else if (id == 17 || id == 18 || id == 21 || id == 22 || id >= 42 && id <= 45 || id >= 52 && id <= 55) { width = 720; height = 576; } else if (id >= 79 && id <= 85 || id == 112) { width = 1680; height = 720; } else if (id >= 86 && id <= 92 || id == 113) { width = 2560; height = 1080; } else if (id >= 93 && id <= 97 || id >= 103 && id <= 107 || id == 114 || id >= 116 && id <= 120) { width = 3840; height = 2160; } else if (id >= 98 && id <= 102 || id == 115) { width = 4096; height = 2160; } else if (id >= 121 && id <= 127) { width = 5120; height = 2160; } } public static uint ChooseMode(DisplayMode* modes, uint count, byte* edid, uint edidBytes, uint fallback) { if (modes == null || count > DisplayHandoff.MaximumModes) return fallback; bool restrict = false; for (uint i = 0; i < count; i++) if (modes[i].IsValid && EdidAdvertises(edid, edidBytes, modes[i].Width, modes[i].Height)) restrict = true; DisplayMode best = default; bool found = false; for (uint i = 0; i < count; i++) { DisplayMode candidate = modes[i]; if (!candidate.IsValid || restrict && !EdidAdvertises(edid, edidBytes, candidate.Width, candidate.Height)) continue; ulong area = (ulong)candidate.Width * candidate.Height, previous = (ulong)best.Width * best.Height; if (!found || area > previous || area == previous && (candidate.Width > best.Width || candidate.Width == best.Width && (candidate.Height > best.Height || candidate.Height == best.Height && (candidate.BitsPerPixel > best.BitsPerPixel || candidate.BitsPerPixel == best.BitsPerPixel && candidate.Id < best.Id)))) { best = candidate; found = true; } } return found ? best.Id : fallback; } } }