diff options
| author | xXJsonDeruloXx <danielhimebauch@gmail.com> | 2026-08-06 21:26:40 -0400 |
|---|---|---|
| committer | xXJsonDeruloXx <danielhimebauch@gmail.com> | 2026-08-06 21:26:40 -0400 |
| commit | 598931c87995a9e2f3af045ca51c736729ae5197 (patch) | |
| tree | 95999a21ffd0b2ecb83c8b1b226aced4ddbbd171 | |
| parent | 6435769b270c8f849839a971f21b802a3f70662e (diff) | |
| download | decky-lsfg-vk-598931c87995a9e2f3af045ca51c736729ae5197.tar.gz decky-lsfg-vk-598931c87995a9e2f3af045ca51c736729ae5197.zip | |
fix: expose runtime 1x passthrough in Decky
| -rw-r--r-- | README.md | 9 | ||||
| -rw-r--r-- | package.json | 6 | ||||
| -rw-r--r-- | py_modules/lsfg_vk/config_schema.py | 8 | ||||
| -rw-r--r-- | py_modules/lsfg_vk/config_schema_generated.py | 8 | ||||
| -rw-r--r-- | scripts/generate_python_boilerplate.py | 1 | ||||
| -rw-r--r-- | shared_config.py | 7 | ||||
| -rw-r--r-- | src/components/ConfigurationSection.tsx | 11 | ||||
| -rw-r--r-- | src/components/FpsMultiplierControl.tsx | 4 | ||||
| -rw-r--r-- | src/config/configSchema.ts | 2 | ||||
| -rw-r--r-- | src/config/generatedConfigSchema.ts | 10 | ||||
| -rw-r--r-- | tests/test_lsfg_v2_migration.py | 20 |
11 files changed, 33 insertions, 53 deletions
@@ -18,7 +18,7 @@ A Decky plugin that streamlines the installation of **lsfg-vk** ([Lossless Scaling Frame Generation Vulkan layer](https://github.com/PancakeTAS/lsfg-vk)) on Steam Deck, allowing you to use the Lossless Scaling frame generation features on Linux with a controller friendly UI in SteamOS, Bazzite, or any other Linux platform compatible with Decky Loader. -> The v2 x86_64 and Flatpak payloads remain pinned to [`v2.0.0-decky.2`](https://github.com/xXJSONDeruloXx/lsfg-vk/releases/tag/v2.0.0-decky.2); the Armada/aarch64 layer uses the rebuilt ARM-port prerelease [`v2.0.0-decky.3-arm64`](https://github.com/xXJSONDeruloXx/lsfg-vk-arm64/releases/tag/v2.0.0-decky.3-arm64). +> The x86_64 layer uses the patched statically linked prerelease [`v2.0.0-decky.4-runtime-1x`](https://github.com/xXJSONDeruloXx/lsfg-vk/releases/tag/v2.0.0-decky.4-runtime-1x); the Armada/aarch64 layer uses the rebuilt ARM-port prerelease [`v2.0.0-decky.3-arm64`](https://github.com/xXJSONDeruloXx/lsfg-vk-arm64/releases/tag/v2.0.0-decky.3-arm64). ## Installation @@ -46,14 +46,13 @@ A Decky plugin that streamlines the installation of **lsfg-vk** ([Lossless Scali The plugin provides several configuration options to optimize frame generation for your games: ### Core Settings -- **FPS Multiplier**: Choose between 2x, 3x, or 4x frame generation +- **FPS Multiplier**: Choose between 1x, 2x, 3x, or 4x frame generation - **Flow Scale**: Adjust motion estimation quality (lower = better performance, higher = better quality) - **Performance Mode**: Uses a lighter processing model - **Allow FP16**: Enable half-precision acceleration; disable it for older NVIDIA GPUs - **Active In**: Optionally match a profile to executable names, Wine executables, or process names - **Automatic Profile Matching**: Explicitly let lsfg-vk choose an `Active In` profile; otherwise the Decky-selected profile is always forced - **GPU**: Optionally select the GPU by name, vendor/device ID, or PCI bus ID -- **Disable Frame Generation**: Disable the layer for the next launch without creating an invalid 1x profile ## Feedback and Support @@ -77,7 +76,7 @@ For per-game feedback and community support, please join the [decky-lsfg-vk Disc ## What it does The plugin: -- Downloads checksum-pinned x86_64 or Armada/aarch64 lsfg-vk v2 assets from the owner-fork release to `~/.local/lib/` +- Downloads checksum-pinned statically linked x86_64 or Armada/aarch64 lsfg-vk v2 layers to `~/.local/lib/` - Bundles checksum-pinned lsfg-vk v2 Flatpak extensions for runtimes 23.08, 24.08, and 25.08, and installs the selected local bundle - Updates already-installed user Flatpak runtimes and migrates the plugin's legacy app overrides when the native layer is updated - Records existing Flatpak runtime commits and rolls back already-updated runtimes when a multi-runtime migration fails, when Flatpak permits it @@ -85,7 +84,7 @@ The plugin: - Migrates the existing `~/.config/lsfg-vk/conf.toml` from v1 to v2 automatically on layer update, retaining a one-time `.v1.bak` backup - Automatically detects your Lossless Scaling DLL installation - Provides an easy-to-use interface to configure frame generation settings: - - **FPS Multiplier**: Choose 2x, 3x, or 4x frame generation + - **FPS Multiplier**: Choose 1x, 2x, 3x, or 4x frame generation - **Flow Scale**: Adjust motion estimation quality vs performance - **Performance Mode**: Use lighter processing for better performance - **FP16, Active In, GPU, and explicit automatic matching**: Use v2 profile parameters without ambiguous profile selection diff --git a/package.json b/package.json index f775a22..72ef5b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "decky-lsfg-vk", - "version": "0.13.2", + "version": "0.13.3", "description": "Use Lossless Scaling on the Steam Deck using the lsfg-vk vulkan layer", "type": "module", "scripts": { @@ -50,8 +50,8 @@ "remote_binary": [ { "name": "lsfg-vk-layer-x86_64.tar.xz", - "url": "https://github.com/xXJSONDeruloXx/lsfg-vk/releases/download/v2.0.0-decky.2/lsfg-vk-layer-x86_64.tar.xz", - "sha256hash": "3bf5baaf391c6240de9978161a68aa8c9a54eff4246b79f9ea5b2ad1ec1a53a4" + "url": "https://github.com/xXJSONDeruloXx/lsfg-vk/releases/download/v2.0.0-decky.4-runtime-1x/lsfg-vk-layer-x86_64.tar.xz", + "sha256hash": "c8478d791076b143d787dad05f791000d47df733d3881fcff67e8c73298dfbe2" }, { "name": "lsfg-vk-layer-aarch64.tar.xz", diff --git a/py_modules/lsfg_vk/config_schema.py b/py_modules/lsfg_vk/config_schema.py index f8a9fe6..72adb44 100644 --- a/py_modules/lsfg_vk/config_schema.py +++ b/py_modules/lsfg_vk/config_schema.py @@ -93,8 +93,8 @@ class ConfigurationManager: value = str(value) validated[name] = value - if validated["multiplier"] < 2: - raise ValueError("multiplier must be 2 or greater") + if validated["multiplier"] < 1: + raise ValueError("multiplier must be 1 or greater") if not 0.25 <= validated["flow_scale"] <= 1.0: raise ValueError("flow_scale must be between 0.25 and 1.0") if validated["pacing"] != "none": @@ -167,9 +167,7 @@ class ConfigurationManager: for game in data.get("game", []): name = str(game.get("exe", DEFAULT_PROFILE_NAME)) migrated_profile = dict(game) - if int(migrated_profile.get("multiplier", 2)) <= 1: - migrated_profile["disable_lsfgvk"] = True - migrated_profile["multiplier"] = max(2, int(migrated_profile.get("multiplier", 2))) + migrated_profile["multiplier"] = max(1, int(migrated_profile.get("multiplier", 2))) profiles[name] = ConfigurationManager._config_from_profile(migrated_profile, global_config) if not profiles: profiles[DEFAULT_PROFILE_NAME] = ConfigurationManager.get_defaults() diff --git a/py_modules/lsfg_vk/config_schema_generated.py b/py_modules/lsfg_vk/config_schema_generated.py index 9cfda51..4703dae 100644 --- a/py_modules/lsfg_vk/config_schema_generated.py +++ b/py_modules/lsfg_vk/config_schema_generated.py @@ -22,7 +22,6 @@ PACING = "pacing" ACTIVE_IN = "active_in" USE_NATIVE_MATCHING = "use_native_matching" GPU = "gpu" -DISABLE_LSFGVK = "disable_lsfgvk" DXVK_FRAME_RATE = "dxvk_frame_rate" ENABLE_WOW64 = "enable_wow64" DISABLE_STEAMDECK_MODE = "disable_steamdeck_mode" @@ -44,7 +43,6 @@ class ConfigurationData(TypedDict): active_in: str use_native_matching: bool gpu: str - disable_lsfgvk: bool dxvk_frame_rate: int enable_wow64: bool disable_steamdeck_mode: bool @@ -72,8 +70,6 @@ def get_script_parsing_logic(): # Auto-generated parsing logic: if key == "DECKY_LSFGVK_AUTO_PROFILE": script_values["use_native_matching"] = value == "1" - if key == "DISABLE_LSFGVK": - script_values["disable_lsfgvk"] = value == "1" if key == "DXVK_FRAME_RATE": try: script_values["dxvk_frame_rate"] = int(value) @@ -108,8 +104,6 @@ def get_script_generation_logic(): lines = [] if config.get("use_native_matching", False): lines.append("export DECKY_LSFGVK_AUTO_PROFILE=1") - if config.get("disable_lsfgvk", False): - lines.append("export DISABLE_LSFGVK=1") dxvk_frame_rate = config.get("dxvk_frame_rate", 0) if dxvk_frame_rate > 0: lines.append(f"export DXVK_FRAME_RATE={dxvk_frame_rate}") @@ -133,4 +127,4 @@ def get_script_generation_logic(): return generate_script_lines -ALL_FIELDS = ['dll', 'allow_fp16', 'multiplier', 'flow_scale', 'performance_mode', 'pacing', 'active_in', 'use_native_matching', 'gpu', 'disable_lsfgvk', 'dxvk_frame_rate', 'enable_wow64', 'disable_steamdeck_mode', 'mangohud_workaround', 'disable_vkbasalt', 'force_enable_vkbasalt', 'enable_wsi', 'enable_zink'] +ALL_FIELDS = ['dll', 'allow_fp16', 'multiplier', 'flow_scale', 'performance_mode', 'pacing', 'active_in', 'use_native_matching', 'gpu', 'dxvk_frame_rate', 'enable_wow64', 'disable_steamdeck_mode', 'mangohud_workaround', 'disable_vkbasalt', 'force_enable_vkbasalt', 'enable_wsi', 'enable_zink'] diff --git a/scripts/generate_python_boilerplate.py b/scripts/generate_python_boilerplate.py index 5027023..cc5197c 100644 --- a/scripts/generate_python_boilerplate.py +++ b/scripts/generate_python_boilerplate.py @@ -34,7 +34,6 @@ def get_env_var_name(field_name: str) -> str: "enable_wow64": "PROTON_USE_WOW64", "disable_steamdeck_mode": "SteamDeck", "mangohud_workaround": "MANGOHUD", - "disable_lsfgvk": "DISABLE_LSFGVK", "use_native_matching": "DECKY_LSFGVK_AUTO_PROFILE", "disable_vkbasalt": "DISABLE_VKBASALT", "force_enable_vkbasalt": "ENABLE_VKBASALT", diff --git a/shared_config.py b/shared_config.py index 77b4c01..83672f1 100644 --- a/shared_config.py +++ b/shared_config.py @@ -75,13 +75,6 @@ CONFIG_SCHEMA_DEF = { "description": "optional GPU name, vendor:device ID, or PCI bus ID", "location": "profile", }, - "disable_lsfgvk": { - "name": "disable_lsfgvk", - "fieldType": ConfigFieldType.BOOLEAN, - "default": False, - "description": "disable lsfg-vk on the next game launch", - "location": "script", - }, "dxvk_frame_rate": { "name": "dxvk_frame_rate", "fieldType": ConfigFieldType.INTEGER, diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx index 538975e..f332ad2 100644 --- a/src/components/ConfigurationSection.tsx +++ b/src/components/ConfigurationSection.tsx @@ -3,7 +3,7 @@ import { useState, useEffect } from "react"; import { RiArrowDownSFill, RiArrowUpSFill } from "react-icons/ri"; import { ConfigurationData } from "../config/configSchema"; import { - ACTIVE_IN, ALLOW_FP16, DISABLE_LSFGVK, DLL, FLOW_SCALE, GPU, + ACTIVE_IN, ALLOW_FP16, DLL, FLOW_SCALE, GPU, PERFORMANCE_MODE, USE_NATIVE_MATCHING, DXVK_FRAME_RATE, DISABLE_STEAMDECK_MODE, MANGOHUD_WORKAROUND, DISABLE_VKBASALT, FORCE_ENABLE_VKBASALT, ENABLE_WSI, ENABLE_ZINK } from "../config/generatedConfigSchema"; @@ -136,15 +136,6 @@ export function ConfigurationSection({ <PanelSectionRow> <ToggleField - label="Disable Frame Generation" - description="Disables lsfg-vk on the next game launch. Requires a game restart." - checked={config.disable_lsfgvk} - onChange={(value) => onConfigChange(DISABLE_LSFGVK, value)} - /> - </PanelSectionRow> - - <PanelSectionRow> - <ToggleField label="Allow FP16" description="Improves performance on AMD; disable for older NVIDIA GPUs." checked={config.allow_fp16} diff --git a/src/components/FpsMultiplierControl.tsx b/src/components/FpsMultiplierControl.tsx index 3f559ea..b9a0f80 100644 --- a/src/components/FpsMultiplierControl.tsx +++ b/src/components/FpsMultiplierControl.tsx @@ -33,8 +33,8 @@ export function FpsMultiplierControl({ padding: "5px 0px 0px 0px", minWidth: "40px", }} - onClick={() => onConfigChange(MULTIPLIER, Math.max(2, config.multiplier - 1))} - disabled={config.multiplier <= 2} + onClick={() => onConfigChange(MULTIPLIER, Math.max(1, config.multiplier - 1))} + disabled={config.multiplier <= 1} > − </DialogButton> diff --git a/src/config/configSchema.ts b/src/config/configSchema.ts index 7b608c3..4fa64a6 100644 --- a/src/config/configSchema.ts +++ b/src/config/configSchema.ts @@ -7,7 +7,7 @@ export { getDefaults, getFieldTypes, DLL, ALLOW_FP16, MULTIPLIER, FLOW_SCALE, PERFORMANCE_MODE, PACING, - ACTIVE_IN, USE_NATIVE_MATCHING, GPU, DISABLE_LSFGVK, DXVK_FRAME_RATE, ENABLE_WOW64, + ACTIVE_IN, USE_NATIVE_MATCHING, GPU, DXVK_FRAME_RATE, ENABLE_WOW64, DISABLE_STEAMDECK_MODE, MANGOHUD_WORKAROUND, DISABLE_VKBASALT, FORCE_ENABLE_VKBASALT, ENABLE_WSI, ENABLE_ZINK } from './generatedConfigSchema'; diff --git a/src/config/generatedConfigSchema.ts b/src/config/generatedConfigSchema.ts index 5c5df39..cdc63a3 100644 --- a/src/config/generatedConfigSchema.ts +++ b/src/config/generatedConfigSchema.ts @@ -17,7 +17,6 @@ export const PACING = "pacing" as const; export const ACTIVE_IN = "active_in" as const; export const USE_NATIVE_MATCHING = "use_native_matching" as const; export const GPU = "gpu" as const; -export const DISABLE_LSFGVK = "disable_lsfgvk" as const; export const DXVK_FRAME_RATE = "dxvk_frame_rate" as const; export const ENABLE_WOW64 = "enable_wow64" as const; export const DISABLE_STEAMDECK_MODE = "disable_steamdeck_mode" as const; @@ -91,12 +90,6 @@ export const CONFIG_SCHEMA: Record<string, ConfigField> = { default: "", description: "optional GPU name, vendor:device ID, or PCI bus ID" }, - disable_lsfgvk: { - name: "disable_lsfgvk", - fieldType: ConfigFieldType.BOOLEAN, - default: false, - description: "disable lsfg-vk on the next game launch" - }, dxvk_frame_rate: { name: "dxvk_frame_rate", fieldType: ConfigFieldType.INTEGER, @@ -158,7 +151,6 @@ export interface ConfigurationData { active_in: string; use_native_matching: boolean; gpu: string; - disable_lsfgvk: boolean; dxvk_frame_rate: number; enable_wow64: boolean; disable_steamdeck_mode: boolean; @@ -185,7 +177,6 @@ export function getDefaults(): ConfigurationData { active_in: "", use_native_matching: false, gpu: "", - disable_lsfgvk: false, dxvk_frame_rate: 0, enable_wow64: false, disable_steamdeck_mode: false, @@ -208,7 +199,6 @@ export function getFieldTypes(): Record<string, ConfigFieldType> { active_in: ConfigFieldType.STRING, use_native_matching: ConfigFieldType.BOOLEAN, gpu: ConfigFieldType.STRING, - disable_lsfgvk: ConfigFieldType.BOOLEAN, dxvk_frame_rate: ConfigFieldType.INTEGER, enable_wow64: ConfigFieldType.BOOLEAN, disable_steamdeck_mode: ConfigFieldType.BOOLEAN, diff --git a/tests/test_lsfg_v2_migration.py b/tests/test_lsfg_v2_migration.py index 8b2e2a3..503ae60 100644 --- a/tests/test_lsfg_v2_migration.py +++ b/tests/test_lsfg_v2_migration.py @@ -43,7 +43,7 @@ class ConfigurationMigrationTests(unittest.TestCase): self.assertIn("allow_fp16 = false", serialized) self.assertIn("[[profile]]", serialized) self.assertIn('name = "decky-lsfg-vk"', serialized) - self.assertIn("multiplier = 2", serialized) + self.assertIn("multiplier = 1", serialized) self.assertNotIn("[[game]]", serialized) self.assertNotIn("no_fp16", serialized) self.assertNotIn("hdr_mode", serialized) @@ -155,13 +155,29 @@ class InstallerInfrastructureTests(unittest.TestCase): service._create_lsfg_launch_script(profile_data) launch_script = script_path.read_text(encoding="utf-8") self.assertIn("export DXVK_FRAME_RATE=45", launch_script) - self.assertIn("export DISABLE_LSFGVK=1", launch_script) + self.assertNotIn("DISABLE_LSFGVK", launch_script) with mock.patch("lsfg_vk.dll_detection.DllDetectionService") as detection_service: detection_service.return_value.check_lossless_scaling_dll.return_value = {"detected": False} service._create_config_file() self.assertEqual(len(list(config_dir.glob("conf.toml.v1.bak*"))), 1) + def test_multiplier_one_is_a_valid_runtime_passthrough_value(self): + config = ConfigurationManager.get_defaults() + config["multiplier"] = 1 + + self.assertEqual(ConfigurationManager.validate_config(config)["multiplier"], 1) + + def test_legacy_disable_environment_is_removed_when_launcher_is_rewritten(self): + config = ConfigurationManager.get_defaults() + script = ConfigurationManager.parse_script_content( + "export DISABLE_LSFGVK=1\nexport DXVK_FRAME_RATE=45\n" + ) + merged = ConfigurationManager.merge_config_with_script(config, script) + + self.assertNotIn("disable_lsfgvk", merged) + self.assertEqual(merged["dxvk_frame_rate"], 45) + def test_unrecognized_configuration_is_backed_up_before_reset(self): from lsfg_vk.installation import InstallationService |
