mirror of
https://github.com/spoopyghosty0/frameport.git
synced 2026-10-17 12:01:23 +02:00
adapter: show a per-eye cylinder menu to both eyes (fix black curved menus)
Doom3Quest-based ports (PreyVR, #306) draw their menu on a curved cylinder layer submitted once per eye. The Frame's runtime has no cylinder layers, so FrameBridge shows each as ~7 flat quad strips; a per-eye pair is ~14 quad layers in one frame, which the runtime rejects whole (xrEndFrame -> XR_ERROR_LAYER_INVALID, -16). The menu then stays black while the game runs at 72 fps. Collapse the pair: drop the right-eye cylinder and show the left eye's strips to both eyes (the runtime composites a quad to both eyes anyway). That halves the layer count and drops the per-eye eyeVisibility, and the runtime accepts the frame. Only frames with per-eye cylinders change -- exactly the ones that were being rejected; mono (BOTH) cylinder games such as 4XVR are untouched. Verified on the dev Frame (headless): PreyVR v1.2.4 rebuilt + installed, the menu frame now submits (one transient -16 on the first frame before the space is locatable, then clean), 72 fps. Visual confirmation of the menu needs the headset. Triage signature cylinder-menu-layers-rejected. No adapter revision bump (installed games are not marked outdated).
This commit is contained in:
1 parent
741af0651e
commit
6cd1eaaf23
6 files changed
+17
-3
No files matched your search
@@ -13,11 +13,11 @@ e8c0965c188665a4e565e4a3af983ef1866d1cf9225665cc90d8df286bc96ef3 ./arm64-v8a/li
|
||||
5432674a59d02f411cd853a5dc57e3fa547d1ac518f25bf433fc54c43677177a ./arm64-v8a/libfpglmv.so
|
||||
8a8f6b1da8952cb3933a5b53558424a5fc56043b2527a16bb6dd62a00d2de01a ./arm64-v8a/libframe_xrshim.so
|
||||
19ba5ed3c4b780f5ae46251f6958f552acfc5f13c8bb39f995579593fa8990c6 ./arm64-v8a/libglshim.so
|
||||
aa1b91bdb48d49a78f516b04c568ac74017617aa6f8fe17b802f8ef59ebfd621 ./arm64-v8a/libopenxr_loader_generic.so
|
||||
0f058921e9c1f5b9ef5847cc9e6b80a23e75028c76c1d3bb02d1610b535f81c9 ./arm64-v8a/libopenxr_loader_generic.so
|
||||
1feaeafad467c4cafdf2b018a4d84b0bee200c3f711697b4ce97e66a3ba256ca ./arm64-v8a/libovrplatformcompat.so
|
||||
a4ed80ae45ca90758239f152ea5a2e8c127d491e1e697ea5680db6fd7f72db07 ./arm64-v8a/libvrapi.so
|
||||
a4ed80ae45ca90758239f152ea5a2e8c127d491e1e697ea5680db6fd7f72db07 ./arm64-v8a/libvrapi_foveation.so
|
||||
d40ecabc2f3f9cb8a165f768d920cdca05b2af8c95e8272aa2d8ef814f87c988 ./armeabi-v7a/libopenxr_loader_generic.so
|
||||
9e8a7ce599b62a7c607b0d3637e4ec1b1ea1974c3373a7af3f5920ad2adc5e00 ./armeabi-v7a/libopenxr_loader_generic.so
|
||||
1871eae093432d277da4bc751bf5f3269dfcf11f9168260b0c3caadb0dedb19d ./dex/oculusos-stubs.dex
|
||||
b634ab5640e258563c536e658cad87080553df6f34f62269a21d554844e58bfe ./hevc/COPYING.FFmpeg
|
||||
141de01f0d40b97d4f9a720db5ab8ea442f6aa35db5272048899292884994a1c ./hevc/libstagefrighthw.so
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -99,6 +99,11 @@ signatures:
|
||||
severity: fatal
|
||||
diagnosis: The runtime rejects the game's frames, so it stops drawing (for example stuck at a "Waiting" box). An image rect reaches a few pixels past its swapchain on some Frames; FrameBridge from FramePort 0.11.0 clamps the rects, so rebuild and reinstall the game.
|
||||
suggest: [frame.adapter]
|
||||
- id: cylinder-menu-layers-rejected
|
||||
pattern: 'xrEndFrame failed -16\b'
|
||||
severity: error
|
||||
diagnosis: The game draws a curved (cylinder) screen to each eye separately (for example the Doom3Quest / PreyVR menu). The Frame's runtime has no cylinder layers, so FrameBridge shows each as flat quad strips; a per-eye pair makes too many quad layers for one frame and the runtime rejects the whole frame (XR_ERROR_LAYER_INVALID), leaving the menu black while the game runs. FrameBridge from this build shows the left eye's strips to both eyes to halve the count; rebuild and reinstall the game to try it.
|
||||
suggest: [frame.adapter]
|
||||
- id: missing-ovr-symbol
|
||||
pattern: '(UnsatisfiedLinkError|cannot locate symbol) .*"?(ovr_[A-Za-z0-9_]+|ovr[A-Z][A-Za-z0-9]*_ToString)'
|
||||
severity: fatal
|
||||
|
||||
@@ -511,6 +511,7 @@ FramePort's layer between the game and the Steam Frame: fills in what the Frame
|
||||
- **Suggested (on):** Required for every OpenXR/overport build on the Frame.
|
||||
- **Suggested by launch-test signatures:**
|
||||
- `cube-swapchain-refused` (fatal): The game asked for a cube-map swapchain (for example an OVROverlay skybox or loading cube), which the Frame's runtime doesn't have.
|
||||
- `cylinder-menu-layers-rejected` (error): The game draws a curved (cylinder) screen to each eye separately (for example the Doom3Quest / PreyVR menu).
|
||||
- `graphics-requirements-missing` (fatal): The game can't start VR on the Frame; rebuild it with the current FramePort.
|
||||
- `swapchain-rect-invalid` (fatal): The runtime rejects the game's frames, so it stops drawing (for example stuck at a "Waiting" box).
|
||||
- `time-conversion` (warning): The Frame's runtime lacks timespec time conversion; the current adapter build emulates it.
|
||||
|
||||
@@ -746,7 +746,7 @@ static int cylinder_strips(const XrCompositionLayerCylinderKHR *c, XrComposition
|
||||
XrSwapchainSubImage sub = c->subImage;
|
||||
sub.imageRect = (XrRect2Di){{x0, rect.offset.y}, {x1 - x0, rect.extent.height}};
|
||||
out[i] = (XrCompositionLayerQuad){XR_TYPE_COMPOSITION_LAYER_QUAD, c->next, c->layerFlags, c->space,
|
||||
c->eyeVisibility, sub, pose, {2 * r * sinf(a / 2), height}};
|
||||
XR_EYE_VISIBILITY_BOTH, sub, pose, {2 * r * sinf(a / 2), height}};
|
||||
}
|
||||
static int logged;
|
||||
if (logged++ < 3) LOG("cylinder layer -> %d quad strips (r=%.2f angle=%.2f)", n, r, c->centralAngle);
|
||||
@@ -1707,6 +1707,14 @@ XRAPI_ATTR XrResult XRAPI_CALL xrEndFrame(XrSession session, const XrFrameEndInf
|
||||
++swapped;
|
||||
continue;
|
||||
}
|
||||
// A per-eye cylinder pair (eyeVisibility LEFT + RIGHT, e.g. Doom3Quest/PreyVR's curved menu) would expand to
|
||||
// twice the strips; the Frame's runtime composites a quad to both eyes and rejects a frame with that many
|
||||
// per-eye quad layers (XR_ERROR_LAYER_INVALID). Drop the right eye and show the left one's strips to both.
|
||||
if (layer_fix && cylinder_strips_on && no_cylinder && layer->type == XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR &&
|
||||
((const XrCompositionLayerCylinderKHR *)layer)->eyeVisibility == XR_EYE_VISIBILITY_RIGHT) {
|
||||
++dropped;
|
||||
continue;
|
||||
}
|
||||
if (layer_fix && cylinder_strips_on && no_cylinder && layer->type == XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR &&
|
||||
runtime_swapchain(((const XrCompositionLayerCylinderKHR *)layer)->subImage.swapchain)) {
|
||||
// keep the whole frame within the runtime's layer limit: every later layer still needs a slot
|
||||
|
||||
Reference in new issue
Block a user