Files
Toastconcern--FrameStudio/layer/d3d11_proxy.def
T
ToastconcernandClaude Opus 4.8 d22cc04cb3 Frame Home as the real SteamVR environment on a PC (Windows too), not a home app
On the Steam Frame a layer inside SteamVR's compositor draws the home where it would draw Aurora, so the home is the
environment itself: at boot, during game loads, behind the Steam menu, with the controllers and passthrough, and it
steps aside for a game the instant it opens. On a PC this was faked with SteamVR's home-app slot and a flat 360 photo
in the gaps, which launched and handed off like an app and showed a picture, not the live home. This does it properly
on any PC that runs SteamVR, the Frame's way:

- Windows: the compositor is Direct3D 11, so the layer is a proxy d3d11.dll beside the compositor (layer/
  frame_home_layer_d3d11.cpp, built from the .def that forwards every other export to the real d3d11.dll, kept as
  fh_d3d11real.dll). It wraps the compositor's device, finds Aurora's draws by their shader bytecode and draws the
  home over the sky, leaving the floor and stars off; everything else passes straight through. Pure pass-through in
  any process that isn't vrcompositor.
- The home's frames cross from Frame Home (Vulkan) to the compositor (D3D11): the layer owns kSlots shared textures
  and hands Frame Home their NT handles over a named pipe; Frame Home imports them (VK_KHR_external_memory_win32) and
  renders into them. No cross-API lock — a slot is published only once the GPU has finished it and the four rotate,
  as on Linux. The shared State stays Frame Home's.
- The Environments panel runs frame-home --system and keeps it alive (one at a time, a pid file across panel
  restarts), the same systemEnv path as the Frame. The installer places/removes the proxy and marks the layer with a
  root/layer folder, in place of the old home-app registration and background pictures.
- Safe like the Vulkan layer: no home, or one stale over half a second, and the compositor draws Aurora as usual;
  the layer turns itself off after two unhealthy compositor starts, and root/layer/off turns it off by hand.

Linux keeps its Vulkan layer (unchanged). Verified without a headset on the null driver: the proxy loads and wraps
the compositor without crashing, recognises Aurora's shaders, and the frame hand-over completes (Frame Home connects,
imports the textures, renders). The compositor only draws the environment while presenting to a headset, so the final
on-headset image is the one step the null driver can't exercise.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-21 19:39:36 -05:00

58 lines
3.8 KiB
Modula-2

; Frame Home's d3d11.dll proxy (layer/frame_home_layer_d3d11.cpp): D3D11CreateDevice is ours, so we can wrap the
; SteamVR compositor's device and draw the home where it would draw Aurora. Every other export forwards to the real
; d3d11.dll, copied beside us as fh_d3d11real.dll by the installer, so the compositor behaves exactly as before in
; every way we don't touch, and so does any other program that happens to load this proxy.
LIBRARY d3d11
EXPORTS
D3D11CreateDevice
CreateDirect3D11DeviceFromDXGIDevice = fh_d3d11real.CreateDirect3D11DeviceFromDXGIDevice
CreateDirect3D11SurfaceFromDXGISurface = fh_d3d11real.CreateDirect3D11SurfaceFromDXGISurface
D3D11CoreCreateDevice = fh_d3d11real.D3D11CoreCreateDevice
D3D11CoreCreateLayeredDevice = fh_d3d11real.D3D11CoreCreateLayeredDevice
D3D11CoreGetLayeredDeviceSize = fh_d3d11real.D3D11CoreGetLayeredDeviceSize
D3D11CoreRegisterLayers = fh_d3d11real.D3D11CoreRegisterLayers
D3D11CreateDeviceAndSwapChain = fh_d3d11real.D3D11CreateDeviceAndSwapChain
D3D11CreateDeviceForD3D12 = fh_d3d11real.D3D11CreateDeviceForD3D12
D3D11On12CreateDevice = fh_d3d11real.D3D11On12CreateDevice
D3DKMTCloseAdapter = fh_d3d11real.D3DKMTCloseAdapter
D3DKMTCreateAllocation = fh_d3d11real.D3DKMTCreateAllocation
D3DKMTCreateContext = fh_d3d11real.D3DKMTCreateContext
D3DKMTCreateDevice = fh_d3d11real.D3DKMTCreateDevice
D3DKMTCreateSynchronizationObject = fh_d3d11real.D3DKMTCreateSynchronizationObject
D3DKMTDestroyAllocation = fh_d3d11real.D3DKMTDestroyAllocation
D3DKMTDestroyContext = fh_d3d11real.D3DKMTDestroyContext
D3DKMTDestroyDevice = fh_d3d11real.D3DKMTDestroyDevice
D3DKMTDestroySynchronizationObject = fh_d3d11real.D3DKMTDestroySynchronizationObject
D3DKMTEscape = fh_d3d11real.D3DKMTEscape
D3DKMTGetContextSchedulingPriority = fh_d3d11real.D3DKMTGetContextSchedulingPriority
D3DKMTGetDeviceState = fh_d3d11real.D3DKMTGetDeviceState
D3DKMTGetDisplayModeList = fh_d3d11real.D3DKMTGetDisplayModeList
D3DKMTGetMultisampleMethodList = fh_d3d11real.D3DKMTGetMultisampleMethodList
D3DKMTGetRuntimeData = fh_d3d11real.D3DKMTGetRuntimeData
D3DKMTGetSharedPrimaryHandle = fh_d3d11real.D3DKMTGetSharedPrimaryHandle
D3DKMTLock = fh_d3d11real.D3DKMTLock
D3DKMTOpenAdapterFromHdc = fh_d3d11real.D3DKMTOpenAdapterFromHdc
D3DKMTOpenResource = fh_d3d11real.D3DKMTOpenResource
D3DKMTPresent = fh_d3d11real.D3DKMTPresent
D3DKMTQueryAdapterInfo = fh_d3d11real.D3DKMTQueryAdapterInfo
D3DKMTQueryAllocationResidency = fh_d3d11real.D3DKMTQueryAllocationResidency
D3DKMTQueryResourceInfo = fh_d3d11real.D3DKMTQueryResourceInfo
D3DKMTRender = fh_d3d11real.D3DKMTRender
D3DKMTSetAllocationPriority = fh_d3d11real.D3DKMTSetAllocationPriority
D3DKMTSetContextSchedulingPriority = fh_d3d11real.D3DKMTSetContextSchedulingPriority
D3DKMTSetDisplayMode = fh_d3d11real.D3DKMTSetDisplayMode
D3DKMTSetDisplayPrivateDriverFormat = fh_d3d11real.D3DKMTSetDisplayPrivateDriverFormat
D3DKMTSetGammaRamp = fh_d3d11real.D3DKMTSetGammaRamp
D3DKMTSetVidPnSourceOwner = fh_d3d11real.D3DKMTSetVidPnSourceOwner
D3DKMTSignalSynchronizationObject = fh_d3d11real.D3DKMTSignalSynchronizationObject
D3DKMTUnlock = fh_d3d11real.D3DKMTUnlock
D3DKMTWaitForSynchronizationObject = fh_d3d11real.D3DKMTWaitForSynchronizationObject
D3DKMTWaitForVerticalBlankEvent = fh_d3d11real.D3DKMTWaitForVerticalBlankEvent
D3DPerformance_BeginEvent = fh_d3d11real.D3DPerformance_BeginEvent
D3DPerformance_EndEvent = fh_d3d11real.D3DPerformance_EndEvent
D3DPerformance_GetStatus = fh_d3d11real.D3DPerformance_GetStatus
D3DPerformance_SetMarker = fh_d3d11real.D3DPerformance_SetMarker
EnableFeatureLevelUpgrade = fh_d3d11real.EnableFeatureLevelUpgrade
OpenAdapter10 = fh_d3d11real.OpenAdapter10
OpenAdapter10_2 = fh_d3d11real.OpenAdapter10_2