summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxXJsonDeruloXx <danielhimebauch@gmail.com>2026-08-06 21:26:40 -0400
committerxXJsonDeruloXx <danielhimebauch@gmail.com>2026-08-06 21:26:40 -0400
commit598931c87995a9e2f3af045ca51c736729ae5197 (patch)
tree95999a21ffd0b2ecb83c8b1b226aced4ddbbd171
parent6435769b270c8f849839a971f21b802a3f70662e (diff)
downloaddecky-lsfg-vk-598931c87995a9e2f3af045ca51c736729ae5197.tar.gz
decky-lsfg-vk-598931c87995a9e2f3af045ca51c736729ae5197.zip
fix: expose runtime 1x passthrough in Decky
-rw-r--r--README.md9
-rw-r--r--package.json6
-rw-r--r--py_modules/lsfg_vk/config_schema.py8
-rw-r--r--py_modules/lsfg_vk/config_schema_generated.py8
-rw-r--r--scripts/generate_python_boilerplate.py1
-rw-r--r--shared_config.py7
-rw-r--r--src/components/ConfigurationSection.tsx11
-rw-r--r--src/components/FpsMultiplierControl.tsx4
-rw-r--r--src/config/configSchema.ts2
-rw-r--r--src/config/generatedConfigSchema.ts10
-rw-r--r--tests/test_lsfg_v2_migration.py20
11 files changed, 33 insertions, 53 deletions
diff --git a/README.md b/README.md
index d8bca9e..ebbda0f 100644
--- a/README.md
+++ b/README.md
@@ -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