mirror of
https://github.com/spoopyghosty0/frameport.git
synced 2026-10-24 11:02:57 +02:00
Adapter rebuilt from the combined source (fixed_resolution + swapchain_pool), libfp_xrruntime.so back in SHA256SUMS, ANALYSIS_VERSION 24 for static OpenXR loaders (23 is frame.main_process), agent v108 for the static-loader launcher line (above the MR branches' 104-107 so a Frame with one of those still updates), patch docs and translations template regenerated, Ruff line length.
88 lines
4.0 KiB
Python
88 lines
4.0 KiB
Python
"""Full swapchain recommendations and opt-in OVRPlugin routing."""
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
from test_patches import _analysis
|
|
|
|
from frameport.patches import base
|
|
from frameport.patches.frame.adapter import needs_xrshim
|
|
from frameport.patches.settings import UI, adapter_settings
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def test_setting_is_opt_in_and_routes_ovrplugin():
|
|
base.load_all()
|
|
patch = base.get("adapter.fixed_resolution")
|
|
assert patch.default == 0
|
|
assert patch.detect(_analysis()) is None
|
|
assert not adapter_settings({}).get("fixed_resolution")
|
|
assert needs_xrshim({patch.id: {"value": 1}})
|
|
assert not needs_xrshim({patch.id: {"value": 0}, "adapter.haptic_fix": {"value": 0}})
|
|
assert UI[patch.key]["group"] == "picture"
|
|
assert patch.applies(_analysis(xr="OpenXR", libs=[]))
|
|
assert patch.applies(_analysis(xr="VrApi", libs=["libOVRPlugin.so"]))
|
|
assert not patch.applies(_analysis(xr="VrApi", libs=[]))
|
|
assert not patch.applies(_analysis(abis=["armeabi-v7a"], xr="OpenXR"))
|
|
|
|
|
|
@pytest.mark.native
|
|
def test_layer_dimensions(tmp_path):
|
|
inc = next(iter((ROOT / "native/.cache").glob("openxr-*")), None)
|
|
cc = shutil.which("cc")
|
|
if not os.environ.get("FRAMEPORT_NATIVE_TESTS") or not inc or not cc:
|
|
pytest.skip("needs FRAMEPORT_NATIVE_TESTS=1, OpenXR headers and cc")
|
|
exe = tmp_path / "fixed-resolution"
|
|
subprocess.run([cc, "-std=c11", "-Wall", "-Wextra", "-Werror",
|
|
"-Wno-missing-field-initializers", "-I", str(inc),
|
|
"-I", str(ROOT / "native/adapter"),
|
|
str(ROOT / "tests/fixtures/src/fixed_resolution_test.c"), "-o", str(exe)], check=True)
|
|
subprocess.run([str(exe)], check=True)
|
|
|
|
|
|
def test_triage_only_offers_fix_for_offset_rects():
|
|
from frameport.validate.triage import triage
|
|
log = "projection view 0 rect change: swapchain=0x123 rect=0,32 2736x2736 array=0"
|
|
found = [f for f in triage(log).findings if f.id == "dynamic-resolution-foveation"]
|
|
assert found and found[0].suggest == ["adapter.fixed_resolution"] and found[0].question
|
|
assert not any(f.id == "dynamic-resolution-foveation" for f in
|
|
triage(log.replace("rect=0,32", "rect=0,0")).findings)
|
|
assert not any(f.id == "dynamic-resolution-foveation" for f in
|
|
triage(log + "\nfixed_resolution: recommended 2704x2704 -> 2768x2768").findings)
|
|
|
|
|
|
def test_catalog_requires_app_with_the_fix(monkeypatch):
|
|
import yaml
|
|
|
|
import frameport
|
|
from frameport.recommend.catalog import unusable_reason
|
|
entry = yaml.safe_load((ROOT / "catalog/games/com.camouflaj.manta.yaml").read_text())
|
|
assert entry["adapter"]["fixed_resolution"] == 1
|
|
monkeypatch.setattr(frameport, "__version__", "1.2.1")
|
|
assert unusable_reason(entry) == "needs FramePort 1.2.2"
|
|
monkeypatch.setattr(frameport, "__version__", "1.2.2")
|
|
assert unusable_reason(entry) is None
|
|
|
|
|
|
@pytest.mark.native
|
|
def test_recommendation_wrapper(tmp_path):
|
|
inc = next(iter((ROOT / "native/.cache").glob("openxr-*")), None)
|
|
cc = shutil.which("cc")
|
|
if not os.environ.get("FRAMEPORT_NATIVE_TESTS") or not inc or not cc:
|
|
pytest.skip("needs FRAMEPORT_NATIVE_TESTS=1, OpenXR headers and cc")
|
|
# Compile the actual wrapper with a stand-in runtime and swapchain table.
|
|
source = (ROOT / "native/adapter/frame_adapter.c").read_text()
|
|
wrapper = source[source.index("static XRAPI_ATTR XrResult XRAPI_CALL fixed_recommended_resolution"):
|
|
source.index("// Clamp `r` to a w x h image;")]
|
|
harness = (ROOT / "tests/fixtures/src/fixed_resolution_wrapper_test.c").read_text()
|
|
unit = tmp_path / "wrapper.c"
|
|
unit.write_text(harness.replace("/* WRAPPER */", wrapper))
|
|
exe = tmp_path / "wrapper"
|
|
subprocess.run([cc, "-std=c11", "-Wall", "-Wextra", "-Werror",
|
|
"-Wno-missing-field-initializers", "-I", str(inc),
|
|
"-I", str(ROOT / "native/adapter"), str(unit), "-o", str(exe)], check=True)
|
|
subprocess.run([str(exe)], check=True)
|