diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9c1beb0..29af7d4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -56,8 +56,8 @@ jobs: cmake -S . -B build/pc-win64 -G Ninja -DCMAKE_BUILD_TYPE=Release -DFRAME_HOME_PC=ON -DCMAKE_TOOLCHAIN_FILE=cmake/llvm-mingw.cmake -DWINDOWS_ARCH=x86_64 -DLLVM_MINGW="$HOME/llvm-mingw" cmake --build build/pc-win64 --target frame-home frame-switcher d3d11.dll --parallel mkdir -p "build/stage/FrameHome-PC-windows-x64" dist - cp build/pc-win64/frame-home.exe build/pc-win64/frame-switcher.exe build/pc-win64/d3d11.dll frame/pc/install-frame-home-pc.ps1 \ - "frame/pc/Install Frame Home on this PC.bat" "frame/pc/Remove Frame Home from this PC.bat" "build/stage/FrameHome-PC-windows-x64/" + cp build/pc-win64/frame-home.exe build/pc-win64/frame-switcher.exe build/pc-win64/d3d11.dll pc-streaming/install-frame-home-pc.ps1 \ + "pc-streaming/Install Frame Home on this PC.bat" "pc-streaming/Remove Frame Home from this PC.bat" "build/stage/FrameHome-PC-windows-x64/" cp LICENSE build/stage/FrameHome-PC-windows-x64/LICENSE.txt (cd build/stage && zip -qr ../../dist/FrameHome-PC-windows-x64.zip FrameHome-PC-windows-x64) - uses: actions/upload-artifact@v4 diff --git a/CMakeLists.txt b/CMakeLists.txt index 367d4d1..0c44685 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,9 +142,9 @@ if(NOT FRAME_HOME_PC) endif() # The Windows compositor layer: a proxy d3d11.dll that wraps vrcompositor's Direct3D 11 device and draws the home in -# Aurora's place (layer/frame_home_layer_d3d11.cpp). The .def forwards every other d3d11 export to the real library. +# Aurora's place (pc-streaming/frame_home_layer_d3d11.cpp). The .def forwards every other d3d11 export to the real library. if(WIN32 AND FRAME_HOME_PC) - add_library(frame-home-d3d11 MODULE layer/frame_home_layer_d3d11.cpp layer/d3d11_proxy.def) + add_library(frame-home-d3d11 MODULE pc-streaming/frame_home_layer_d3d11.cpp pc-streaming/d3d11_proxy.def) set_target_properties(frame-home-d3d11 PROPERTIES OUTPUT_NAME d3d11 PREFIX "") target_include_directories(frame-home-d3d11 PRIVATE src) target_link_libraries(frame-home-d3d11 PRIVATE dxguid uuid) diff --git a/README.md b/README.md index 8dfc52b..c89405a 100644 --- a/README.md +++ b/README.md @@ -50,10 +50,11 @@ very largest homes may not fit. thermal governor that keeps the headset cool. - Safe: a compositor layer that steps aside if Frame Home stops, and a one-file off switch. -**On a PC with SteamVR** +**On a PC with SteamVR (experimental, separate)** -- The same Frame Home as SteamVR's environment on Windows and Linux, switched from the Steam menu, showing what you - save in Studio ([guide](docs/pc-steamvr.md)). +- A PC-side compositor layer that aims to make your homes SteamVR's environment on a desktop PC, kept apart in + [`pc-streaming/`](pc-streaming/README.md). It is for a tethered PC headset; it does **not** work for the Steam + Frame, which renders its home on the headset itself. **Frame Studio (on your computer)** @@ -78,7 +79,7 @@ very largest homes may not fit. | [Performance](docs/performance.md) | Reaching 120 fps, checking it, fixing stutter | | [Frame Studio guide](docs/studio-guide.md) | The Studio window, tools and panels | | [Bundles](docs/bundles.md) | Several environments in one `.fbundle` | -| [Frame Home on a PC](docs/pc-steamvr.md) | Your homes as SteamVR's environment on a Windows or Linux PC | +| [Frame Home on a PC](pc-streaming/README.md) | Experimental PC-side layer (separate; not for the Steam Frame) | | [Building from source](docs/building.md) | Building on each system, CI, the headset side | | [Troubleshooting](docs/troubleshooting.md) | Symptoms and fixes, logs, the self-test | diff --git a/frame/pc/Install Frame Home on this PC.bat b/pc-streaming/Install Frame Home on this PC.bat similarity index 100% rename from frame/pc/Install Frame Home on this PC.bat rename to pc-streaming/Install Frame Home on this PC.bat diff --git a/pc-streaming/README.md b/pc-streaming/README.md new file mode 100644 index 0000000..82fe3f7 --- /dev/null +++ b/pc-streaming/README.md @@ -0,0 +1,35 @@ +# PC streaming environments (experimental — not for the Steam Frame) + +This folder holds Frame Home's **PC-side** attempt to make your environments SteamVR's environment on a desktop PC, +separate from the Steam Frame build. It is kept apart on purpose: it does **not** work for the Steam Frame, and the +main project ships without it. + +## What's here + +| File | What | +|---|---| +| `frame_home_layer_d3d11.cpp` | A proxy `d3d11.dll` that wraps SteamVR's Windows compositor and draws the home where it draws Aurora — the Direct3D 11 counterpart of the Steam Frame's Vulkan layer (`../layer/frame_home_layer.cpp`). | +| `d3d11_proxy.def` | The proxy's exports: `D3D11CreateDevice` is ours, every other export forwards to the real `d3d11.dll`. | +| `install-frame-home-pc.ps1`, `*.bat` | The Windows installer that places the layer beside SteamVR's compositor. | +| `pc-steamvr.md` | Notes on how it was meant to work. | + +The renderer's Windows support (importing the compositor's textures, the named-pipe hand-over, the `--system` path) +lives in the shared sources under `src/` behind `#ifdef _WIN32` / the `FRAME_HOME_PC` CMake option, so it only +compiles into a PC build and never affects the Steam Frame build. + +## Why it's set aside + +The compositor layer is the right design for a **tethered** PC headset (Index, Vive, Reverb), and likely for standard +streaming (e.g. a Quest over Steam Link), where the **PC** renders the SteamVR environment. It was never confirmed on +such hardware. + +It **cannot** work for the **Steam Frame**. Tracing every PC process showed the Steam Frame renders its home +environment **on the headset itself** — `vrcompositor.exe` draws nothing and the `vrlink` streaming driver makes none +of the environment's shaders; only game video is streamed. So there is nothing on the PC to replace. The home on the +Steam Frame belongs to the **headset-side Frame Home** (the Vulkan layer in `../layer/`), which runs inside the Steam +Frame's own compositor. + +## Building it + +With the main project configured for a PC (`FRAME_HOME_PC=ON`, the default on Windows/x86-64), the `frame-home-d3d11` +target builds `d3d11.dll` from this folder. `install-frame-home-pc.ps1` installs it. diff --git a/frame/pc/Remove Frame Home from this PC.bat b/pc-streaming/Remove Frame Home from this PC.bat similarity index 100% rename from frame/pc/Remove Frame Home from this PC.bat rename to pc-streaming/Remove Frame Home from this PC.bat diff --git a/layer/d3d11_proxy.def b/pc-streaming/d3d11_proxy.def similarity index 100% rename from layer/d3d11_proxy.def rename to pc-streaming/d3d11_proxy.def diff --git a/layer/frame_home_layer_d3d11.cpp b/pc-streaming/frame_home_layer_d3d11.cpp similarity index 100% rename from layer/frame_home_layer_d3d11.cpp rename to pc-streaming/frame_home_layer_d3d11.cpp diff --git a/frame/pc/install-frame-home-pc.ps1 b/pc-streaming/install-frame-home-pc.ps1 similarity index 100% rename from frame/pc/install-frame-home-pc.ps1 rename to pc-streaming/install-frame-home-pc.ps1 diff --git a/docs/pc-steamvr.md b/pc-streaming/pc-steamvr.md similarity index 100% rename from docs/pc-steamvr.md rename to pc-streaming/pc-steamvr.md diff --git a/scripts/build-studio.sh b/scripts/build-studio.sh index fda2212..2ff5bae 100755 --- a/scripts/build-studio.sh +++ b/scripts/build-studio.sh @@ -72,8 +72,8 @@ stage_pc() { case "$target" in windows-x64) mkdir -p "$stage/pc" cp "$home/frame-home.exe" "$home/frame-switcher.exe" "$home/d3d11.dll" "$stage/pc/" - cp "$ROOT/frame/pc/install-frame-home-pc.ps1" "$ROOT/frame/pc/Install Frame Home on this PC.bat" \ - "$ROOT/frame/pc/Remove Frame Home from this PC.bat" "$stage/pc/" ;; + cp "$ROOT/pc-streaming/install-frame-home-pc.ps1" "$ROOT/pc-streaming/Install Frame Home on this PC.bat" \ + "$ROOT/pc-streaming/Remove Frame Home from this PC.bat" "$stage/pc/" ;; linux-x64) mkdir -p "$stage/pc/bin" "$stage/pc/layer" cp "$home/frame-home" "$home/frame-switcher" "$stage/pc/bin/" ${CXX:-g++} -O2 -shared -fPIC -std=c++17 -fvisibility=hidden -I"$ROOT/third_party/vulkan-headers/include" -I"$ROOT/src" \