Skip to content

display: shared cabinet outputs and plug-in system defaults - #615

Merged
freezy merged 10 commits into
masterfrom
fix/cabinet-playfield-integration
Nov 7, 2026
Merged

freezy merged 10 commits into
masterfrom
fix/cabinet-playfield-integration

Conversation

@freezy

@freezy freezy commented Nov 7, 2026

Copy link
Copy Markdown
Owner

The engine side of the player's cabinet display setup and first-start welcome screen. The display plug-ins (DMD, B2S, PinUP, Kiki) build on these contracts and are already on their master/main, and the Player and PinMAME PRs need this one.

  • Cabinet outputs (CabinetDisplays): output plans with known cabinet roles, which plug-ins may provide each role, and copy targets the player owns. Cabinet targets are desktop regions only, and assignments are keyed by plug-in and role. Physical DMD panels are no longer player destinations, and the import of the plug-ins' saved window positions is gone. The full DMD scene surface stays for the plug-in that publishes it.
  • Composition: CabinetOutputTexture and its shader make transformed copies (rotation, mirroring) and inset composition. CabinetSurfaceSelector shares the provider ranking and skips scene surfaces that don't fit. The screen binder takes a provider order per role.
  • System defaults (IPluginSystemDefaults): a plug-in can describe what it takes from other applications on this computer while its own settings are empty: folders, configuration files and the output placements they suggest. The player shows them on its first start without knowing the plug-in, and the user can replace each one with the player's own value. They are only read, never written back.
  • Packaging: collision-only playfield meshes are kept when a table is packaged.

Tests: CabinetDisplayTests, CabinetOutputTextureTests, CabinetNativeWindowTests and more cases in PlayfieldMeshPackagingTests. The developer guide has a new page on cabinet display outputs.

Add immutable output plans, consumer eligibility, and owned SDR copy targets. Share provider ranking and skip incompatible scene surfaces. Include contract, GPU-copy, and native-window probes.
… output from the cabinet contract

Physical DMD panels are no longer player destinations, so cabinet targets are desktop regions only and assignments are keyed by plug-in and role. The import of plug-in saved window positions is gone. The full DMD scene surface stays for the plug-in that publishes it.
IPluginSystemDefaults lets a plug-in describe what it takes from other applications on this computer while its own settings are empty: folders, configuration files and the output placements they suggest. The Player shows them on its first start without knowing the plug-in, and the user can replace each one with the player's own value. Only read, never written back.
@greptile-apps

greptile-apps Bot commented Nov 7, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The documentation update appears safe to merge.

Summary

Adds shared cabinet output contracts, plug-in system defaults, transformed texture copies, and packaging support for collision-only playfields.

  • Cabinet displays use shared roles, targets, and provider choices.
  • Desktop outputs compose transformed plug-in frames into a Player-owned texture.
  • Plug-ins can report defaults found in other applications.
  • Table packages keep hidden authored playfield meshes for collision.

Reviews (2) · Last reviewed commit: "doc: Full DMD isn't a cabinet output rol..." · Reviewed by Greptile

The guide still listed FullDmd as a role, and device profiles and import candidates as enum users, though the contract dropped them. A plug-in that publishes a Full DMD surface opens its own window, and old full-dmd layout records are dropped on load.
@freezy
freezy merged commit a1dbff2 into master Nov 7, 2026
18 checks passed
@freezy
freezy deleted the fix/cabinet-playfield-integration branch November 7, 2026 00:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant