Commit Graph
92 Commits
Author SHA1 Message Date
lucannez64 f1dc596c5b Bound submit-worker drains to work already queued 2026-10-17 22:54:50 +02:00
lucannez64 3264ca86fa Test merge root certificates 2026-10-17 21:08:12 +02:00
lucannez64 9330765f94 Test merge metal device name 2026-10-17 21:08:12 +02:00
lucannez64andClaude Opus 5.5 52a6dae432 Build Darling's system root store from the host CA bundle
Security reads the system trust domain from
/System/Library/Keychains/SystemRootCertificates.keychain and
SystemTrustSettings.plist (TrustSettingsSchema.h). Darling ships neither, so
SecTrustSettingsCopyCertificates(kSecTrustSettingsDomainSystem) returns
errSecNoTrustSettings (-25263); Chromium's known_roots_mac and Riot's
CertBundle then report that they cannot read the system roots.

ensure-darling-root-certificates.py parses each host root with a minimal DER
walker and writes the trust record keyed by the uppercase SHA-1, with the
encoded issuer Name, the serial INTEGER's content octets, modDate and an
empty (unrestricted) trustSettings array. The keychain is built with the
guest security tool in one darling shell, in a private temporary directory,
and published from inside the guest so a running Darling sees it, falling
back to the host when the guest cannot write the directory. A digest stamp
skips later runs without starting Darling. The launcher warns and continues
on failure; install-runtime.sh runs it before stopping Darling.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 21:03:32 +02:00
lucannez64andClaude Opus 5.5 40f7a650d1 Report the host GPU name and VRAM from MTLDevice
-[MTLDevice name] returned "Darling Indium Device" for every GPU. It now
returns the selected Vulkan device's name in macOS Metal style: the
trailing driver note in brackets and the (R)/(TM) marks are removed, and
NVIDIA names are unchanged. The name is never replaced with another
vendor's. recommendedMaxWorkingSetSize is the device-local heap size on
discrete GPUs and all heaps on integrated/CPU devices, with the old 1 GiB
as fallback. Both are computed once per device.

hasUnifiedMemory stays YES by default: synchronizeResource:/
synchronizeTexture: are missing and Private buffers created with data
abort in Indium, so reporting NO on discrete GPUs would send apps down
unimplemented paths. DARLING_METAL_HOST_UNIFIED_MEMORY=1 opts in to the
GPU-type answer. DARLING_METAL_GPU_NAME and DARLING_METAL_VRAM_MB
override the name and working set.

The cleaning logic lives in private-include/Metal/MTLDeviceInfo.h and is
covered by the host check tools/test-metal-device-info.cpp. Metal now
links indium_private for the Vulkan properties, and the runtime build
script adds Indium's private headers before compiling MTLDevice.mm.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 20:49:42 +02:00
Kalah 845aee22d2 Merge pull request #33 from ztancrell/fix/installer-region-codes
Map LAN, LAS and OCE to Riot's installer codes
2026-10-17 20:37:20 +02:00
lucannez64 2b0e18010b Test merge #37 2026-10-17 20:36:55 +02:00
lucannez64 9c112e44d0 Test merge #32 2026-10-17 20:36:54 +02:00
lucannez64 4cd94f27e7 Test merge #36 2026-10-17 20:36:54 +02:00
lucannez64 0a9940272b Test merge #25 2026-10-17 20:36:53 +02:00
Kalah 545f83f8b4 Merge branch 'main' into fix/installer-region-codes 2026-10-17 20:36:32 +02:00
lucannez64andClaude Opus 5.5 03d88631df Merge PR #22 NVIDIA black screen fix onto #20 compositor changes
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 20:28:58 +02:00
Kalah 5334b41915 Merge pull request #20 from lucannez64/fix/metal-iosurface-drawable-starvation
Fix Metal drawable starvation in mixed IOSurface layer trees
2026-10-17 20:27:49 +02:00
ztancrellandClaude Opus 5.5 8d5a18aabc Derive IOPlatformUUID and serial per host instead of hardcoding them
Every install reported the same IOPlatformUUID and an Apple-format serial
(C02ZL0GVMD6N) that may belong to a real MacBook Pro. Derive both from a
SHA-256 of the host machine-id and a fixed app string: stable per host,
distinct between hosts, and the raw machine-id is not exposed. The serial
is DARLING-<8 hex>, a form no Mac uses. iokitd is built without ARC, so
the derived strings are owned for the daemon's lifetime. Fix the header
comment that said the values came from DMI.

Refs #24

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 11:05:28 -04:00
ztancrellandClaude Opus 5.5 e4fd017e1f Return a valid NSScroller preferredScrollerStyle
The unimplemented method returned whatever was left in a register.
Chromium forwards the style to its renderer, which rejected the
out-of-range value (VALIDATION_ERROR_DESERIALIZATION_FAILED) and left
the Riot Client window black. Report NSScrollerStyleLegacy, as macOS
does without a trackpad.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 08:20:34 -04:00
ztancrellandClaude Opus 5.5 f18bcb460e Map LAN, LAS and OCE to Riot's installer codes
Riot's CDN has no live.lan.zip, live.las.zip or live.oce.zip (HTTP 404);
the installers are published as la1, la2 and oc1. installer.sh now maps
the friendly names to those codes and accepts the codes directly.

Refs #30

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 08:06:05 -04:00
ztancrellandClaude Opus 5.5 4b5144a31d Fix Riot Client crashes on sign-in buttons and file dialogs
The Riot Client (Electron) aborted with unrecognized selectors in
Cocotron's AppKit:

- -[NSOpenPanel setShowsTagField:]: Electron sets it on every file
  dialog. Add the missing NSSavePanel setters it uses (showsTagField,
  nameFieldLabel, extensionHidden, canSelectHiddenExtension) as no-ops,
  and implement beginWithCompletionHandler: and
  beginSheetModalForWindow:completionHandler: by running the panel
  modally and calling the handler (the old stub never called it).
- -[MacWorkspace openURLs:withAppBundleIdentifier:options:
  additionalEventParamDescriptor:launchIdentifiers:]: used by
  shell.openExternal for the third-party sign-in buttons. Open each URL
  through openURL: (LaunchServices).

Fixes #28

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 07:59:09 -04:00
Polar 58a1fdb6a0 mldr: never replace another owner's descriptor with an RPC socket
On NVIDIA the game aborts within minutes: a thread's darlingserver RPC
socket is closed behind Darling's back, and its next RPC fails with
EBADF (or ENOTSOCK once the number is reused), then __simple_abort in
mach_msg_overwrite_trap_impl (#23).

__mldr_create_rpc_socket moved each new socket onto its slot with
dup2(), which silently closes whatever already holds that number. The
slots count down from the soft RLIMIT_NOFILE read at the process's first
socket. The game starts with a soft limit of 1024 (systemd's default,
inherited from the terminal) and then holds ~5500 fds, one per NVIDIA
driver allocation, so the kernel hands numbers in the slot range
(900-1023) to the driver whenever a slot is free, for instance after a
thread exits. The next new thread's dup2() replaced the driver's fd with
its socket; when the driver later closed "its" fd, it closed the socket.
Mesa never comes near 1000 fds, which is why AMD works.

Use fcntl(F_DUPFD, slot) instead: it never replaces a descriptor. If the
slot is taken, give it back and keep the socket at the lowest free
number above it, which is above all of the bitmap's slots and owned by
nobody else; socket_bitmap_put ignores sockets above the slots. The
process lifetime pipe helper gets the same treatment.

This is the remaining case of the 2026-10-10 LeagueClient crash: that
fix stopped two Darling threads from sharing a slot, this one stops
Darling from taking a slot that belongs to someone else.
2026-10-17 01:19:28 +00:00
Polar e581a8196b Point the layer compositor's GL context at the window's back buffer
Second half of the NVIDIA black screen (#3). With the visual fix the
compositor gets a window surface and drawables recycle, but the window
stays black: after CARenderer draws, the back buffer reads back black and
even a glClear to blue changes nothing. GL_DRAW_BUFFER and GL_READ_BUFFER
are GL_NONE.

CALayerContext -setSubwindow: creates the context and then notifies the
layer tree; CAMetalLayer -_setContext: makes the context current (to
create its textures) before any window surface is attached. Per
EGL_KHR_surfaceless_context, a context first made current without a
default framebuffer starts with DRAW_BUFFER = NONE, and attaching a
window later doesn't change it. NVIDIA follows that; Mesa resets it on
bind, which is why AMD works.

After CGLContextMakeCurrentAndAttachToWindow in -renderLayer:, set the
draw and read buffers to GL_BACK.
2026-10-17 00:14:31 +00:00
Polar 8af92993be Create X11 windows with an EGL-compatible visual (NVIDIA black screen)
On NVIDIA (RTX 2070 SUPER, driver 615.78, Xwayland) the game showed a
black screen and logged "Metal Device timed out giving us a Drawable to
present" every second (#3).

X11Window picked its visual with glXChooseVisual, which on NVIDIA returns
a GLX-only visual (0x304 here). NVIDIA's EGL configs only map to the
default visual (0x69) and the 32-bit one (0x99), so CGLGetWindow's
eglCreateWindowSurface failed with EGL_BAD_CONFIG for the window and its
subwindows, for every one of the 40 window configs. CGLGetWindow returns
NULL without logging, CALayerContext keeps _cglWindow == NULL, -render
returns before prepareMetalLayers, and CAMetalLayer never gets its three
drawables back. Mesa accepts the GLX visual, which is why AMD works.

Use the default visual when it is TrueColor with depth >= 24, falling
back to glXChooseVisual otherwise. This also fixes every other Darling
window on NVIDIA: plain AppKit windows (title bars included),
layer-backed views and NSOpenGLView were all black without it.
2026-10-17 00:14:31 +00:00
lucannez64 fc57385c68 Keep Metal presentation active in mixed IOSurface layer trees 2026-10-17 01:06:50 +02:00
Kalah e490e2e353 Merge pull request #19 from lucannez64/pr16-fixes-v2
Integrate runtime fixes with fullscreen and visible-cursor repairs
2026-10-17 00:27:45 +02:00
lucannez64 698d295b6d Merge PR #18 visible-cursor tracking with serial-aware mouse warps 2026-10-17 00:26:47 +02:00
lucannez64 44faf79bd8 Merge PR #15 fullscreen transitions with runtime review fixes 2026-10-17 00:26:09 +02:00
lucannez64 6c742155e9 Fix runtime safety, Xorg mouse synchronization and fullscreen startup 2026-10-17 00:25:34 +02:00
DevWebeloperandClaude Opus 5.5 8c01fe1547 Keep the relative-mode cursor on the visible pointer when warps are not honoured
League enters relative mouse mode on GNOME (Xwayland) and inside gamescope, but
keeps a visible cursor and warps it every frame at its own mouse speed. Xwayland
cannot move a visible pointer, so those warps never took effect: the virtual
cursor, where clicks land, drifted hundreds of pixels from the cursor on screen
and never reached the screen edges, which also stopped edge panning.

Where warps are not honoured, the virtual cursor now follows the physical
pointer and the game's warps leave it in place. With a hidden cursor, or on a
server that honours warps, nothing changes. The host model test gains a case
replaying the drift from an in-game trace.

Tested manually in the practice tool under gamescope 3.16.31 on GNOME 51 with
AMD RADV: clicks land on the cursor and edge panning works.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 00:49:53 +03:00
Andras Laszlo 603b310b6f fix(input): eliminate motion warp feedback loop, fix fullscreen promotion, and restore camera edge panning 2026-10-16 20:58:43 +02:00
Andras Laszlo bd111a5ddc fix(input,video): restore click accuracy, prevent Alt-Tab focus steal, and eliminate 144Hz display link stutter 2026-10-16 20:38:32 +02:00
Andras Laszlo 9d2c23b737 fix(launcher,display): fix desktop launcher icon, Alt-Tab grab, and 144Hz camera panning 2026-10-16 20:21:58 +02:00
Andras Laszlo 4055f314e9 cocotron: avoid dropping relative motion events and warp echoes during coalescing 2026-10-16 19:47:12 +02:00
Andras Laszlo 67f800d47a build: apply optimization flags to existing build trees and escape Exec path 2026-10-16 17:52:11 +02:00
Andras Laszlo 0e2a2dde61 Address code review feedback on input handling, pacing, and runtime cleanup 2026-10-16 17:50:22 +02:00
Andras Laszlo d981cbe8c3 Fix in-game keyboard input, initial fullscreen black screen, and desktop launcher icon 2026-10-16 17:40:51 +02:00
Andras Laszlo 4699618e9f Sync patches/cocotron.patch with submodule mywork 2026-10-16 17:17:31 +02:00
Andras Laszlo d8b1eaf23c Merge upstream/main into main 2026-10-16 17:16:20 +02:00
Andras Laszlo 49919d03c9 cocotron: Fix initial fullscreen black screen and camera panning stutter on Wayland 2026-10-16 17:15:43 +02:00
lucannez64 ed9cc8310a Restore X11 fullscreen requests for monitor-sized borderless windows
Port the fullscreen policy omitted when adapting PR #12. Track requested fullscreen state across frame and style changes, exclude unmanaged windows, and use EWMH REMOVE when leaving fullscreen.

Extend the native geometry probe and document passive tracing for the reported vertical click offset, whose cause remains unconfirmed.
2026-10-16 17:13:11 +02:00
Kalah 8453c07ca9 Merge pull request #14 from ztancrell/screen-size-display-modes
Return a real physical size from CGDisplayScreenSize; never return NULL display modes
2026-10-16 16:59:22 +02:00
lucannez64 b1b97e4d1d Handle EDID DTV aspect ratios in physical display size 2026-10-16 16:57:55 +02:00
Andras Laszlo 7815feb542 AppKit/X11: Robust multi-monitor mouse boundary confinement and clean stale Darling/Riot state 2026-10-16 16:55:22 +02:00
ztancrellandClaude Opus 5.5 4f7916370a Return a real physical size from CGDisplayScreenSize; never return NULL display modes
CGDisplayScreenSize returned 0x0 for any display with EDID (upstream left
that branch unimplemented). League divides by it for its camera aspect
ratio, so the view-projection x row became NaN: every 3D vertex was
discarded, the scene showed only its blue clear colour, and world clicks
were ignored. Read the size from the EDID detailed timing (mm) or basic
parameters (cm), fall back to 96 dpi, and use the main display for an
unknown id.

CGDisplayCopyAllDisplayModes returned NULL for display 0 (a window off
every screen), which League passes straight to CFArrayGetCount. Fall back
to the main display, then to an empty array.

Add riot-display-modes-check covering both for the main display,
display 0 and an unknown id.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 10:44:04 -04:00
Andras Laszlo 10a864d5cb QuartzCore/CAMetalLayer: Fix nextDrawable deadlock preventing Metal in-game rendering 2026-10-16 16:29:48 +02:00
Andras Laszlo 5e5636de22 Merge upstream d89a303: primary monitor geometry coordinates with Wayland fullscreen and mouse confinement fixes 2026-10-16 16:16:02 +02:00
Andras Laszlo 015aa5c6fb Fix black screen in Riot Client launcher and strictly confine mouse only for League in-game 2026-10-16 16:01:25 +02:00
Andras Laszlo 0f1d5b62cd Fix symbol visibility in AppKit and X11 build scripts to preserve exported symbols like _NSApp 2026-10-16 15:52:49 +02:00
lucannez64andMaka d89a303ebe Fix X11 primary-monitor coordinates without changing fullscreen policy
Adapt the geometry fix from PR #12 to the current relative-mouse implementation. Keep display IDs independent of primary-first screen ordering, translate window and pointer coordinates consistently, and invalidate geometry on both RandR event types.

Handle failed RandR snapshots and free EDID data. Add isolated native geometry regression coverage and use the configured SDK when linking the X11 probe.

Validated all 30 component patches, the X11 and CoreGraphics builds, six native geometry groups, and the existing relative-mouse checks. The user confirmed the installed fix works on 2026-10-16.

Co-authored-by: Maka <[email protected]>
2026-10-16 15:52:42 +02:00
Andras Laszlo a9b68485e7 Merge upstream changes: relative mouse mode emulation and skip redundant cursor updates 2026-10-16 15:48:29 +02:00
Andras Laszlo 229efe881f Fix GNOME 51 Wayland fullscreen, mouse confinement and top bar / dock popup 2026-10-16 15:18:04 +02:00
lucannez64andClaude Opus 5.5 70fd5fdebd Emulate macOS relative mouse mode in the X11 backend and skip redundant cursor updates
CGAssociateMouseAndMouseCursorPosition(false) used to warp the pointer to the
window center, freeze the reported position there and treat the game's own
CGWarpMouseCursorPosition calls as motion. On Xwayland, which ignores warps
while the cursor is visible, this left League's cursor stuck in the middle.
The backend now keeps a frozen virtual cursor: physical motion only produces
deltas (deltaY positive downwards), application warps move the virtual cursor
and their echoes are dropped, mouseLocation returns it, and the pointer is only
warped back where the server honours warps. The grab no longer uses the
invalid FocusChangeMask and is released and retaken across focus changes.

setCursor: no longer re-sends XDefineCursor/XFlush when the window already has
that cursor; League set it about 190 times per second.

Also carries the opt-in input trace (/tmp/rclol-input-trace in the guest).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-16 15:14:06 +02:00
Andras Laszlo 1a7916a153 Add GNOME desktop entry and icon generator to installer and runtime tools 2026-10-16 14:41:20 +02:00