mirror of
https://github.com/Toastconcern/FrameStudio.git
synced 2026-10-28 23:03:21 +01:00
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>
58 lines
3.8 KiB
Modula-2
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
|