mirror of
https://github.com/Toastconcern/FrameStudio.git
synced 2026-10-29 01:02:16 +01:00
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>
This commit is contained in:
1 parent
283e19f87c
commit
d22cc04cb3
14 files changed
+1156
-117
No files matched your search
@@ -142,6 +142,23 @@ inline int run(const std::vector<std::string>& args, int nice, bool wait) {
|
||||
CloseHandle(pi.hProcess);
|
||||
return static_cast<int>(code);
|
||||
}
|
||||
// Starts args[0] detached (its own process, no window) and returns its pid, or 0. appKey, when given, is set as
|
||||
// STEAMVR_APPKEY for the child so SteamVR takes it as that application (the environment renderer is its own identity).
|
||||
inline Pid spawn(const std::vector<std::string>& args, const char* appKey = nullptr) {
|
||||
std::wstring cl = commandLine(args);
|
||||
if (appKey) SetEnvironmentVariableA("STEAMVR_APPKEY", appKey);
|
||||
STARTUPINFOW si = {};
|
||||
si.cb = sizeof si;
|
||||
PROCESS_INFORMATION pi = {};
|
||||
const BOOL ok = CreateProcessW(nullptr, cl.data(), nullptr, nullptr, FALSE, CREATE_NO_WINDOW | DETACHED_PROCESS, nullptr, nullptr, &si, &pi);
|
||||
if (appKey) SetEnvironmentVariableA("STEAMVR_APPKEY", nullptr);
|
||||
if (!ok) return 0;
|
||||
const Pid pid = pi.dwProcessId;
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
return pid;
|
||||
}
|
||||
|
||||
// This program again with the same arguments (settings that build the renderer differently, a lost GPU); this one
|
||||
// ends. SteamVR knows its home app by its file, so the new one is still the environment.
|
||||
[[noreturn]] inline void restartSelf() {
|
||||
|
||||
Reference in new issue
Block a user