summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package.json8
-rw-r--r--py_modules/lsfg_vk/config_schema.py34
-rw-r--r--py_modules/lsfg_vk/configuration.py15
-rw-r--r--py_modules/lsfg_vk/plugin.py8
-rw-r--r--src/components/ConfigurationSection.tsx38
-rw-r--r--src/components/UsageInstructions.tsx4
-rw-r--r--src/config/configSchema.ts12
-rw-r--r--tests/test_configuration.py4
8 files changed, 66 insertions, 57 deletions
diff --git a/package.json b/package.json
index dc41930..8755202 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
- "name": "lossless-scaling-vk",
- "version": "0.6.3",
+ "name": "decky-lossless-scaling-vk",
+ "version": "0.6.5",
"description": "Use Lossless Scaling on the Steam Deck using the lsfg-vk vulkan layer",
"type": "module",
"scripts": {
@@ -46,8 +46,8 @@
"remote_binary": [
{
"name": "lsfg-vk_archlinux.zip",
- "url": "https://github.com/xXJSONDeruloXx/lsfg-vk/releases/download/upstream-16378130046/lsfg-vk_archlinux.zip",
- "sha256hash": "779f2081a7b3096a116f3395a0d12f436bccacdee0a05b9dcf0e11c61f51b2ad"
+ "url": "https://github.com/xXJSONDeruloXx/lsfg-vk/releases/download/upstream-16389394927/lsfg-vk_archlinux.zip",
+ "sha256hash": "3ef1e2e89652f83089e326c67a7dbf586bcdb8cf5c427f300abd8887d733d6fa"
}
],
diff --git a/py_modules/lsfg_vk/config_schema.py b/py_modules/lsfg_vk/config_schema.py
index 45afc2d..54e414f 100644
--- a/py_modules/lsfg_vk/config_schema.py
+++ b/py_modules/lsfg_vk/config_schema.py
@@ -1,7 +1,7 @@
"""
Centralized configuration schema for lsfg-vk.
-This module defines the complete configuration structure for TOML-based config files, including:
+This module defines the complete configuration structure for lsfg-vk, managing TOML-based config files, including:
- Field definitions with types, defaults, and metadata
- TOML generation logic
- Validation rules
@@ -76,15 +76,18 @@ CONFIG_SCHEMA: Dict[str, ConfigField] = {
"experimental_present_mode": ConfigField(
name="experimental_present_mode",
field_type=ConfigFieldType.STRING,
- default="",
- description="experimental: override vulkan present mode (empty/fifo/vsync/mailbox/immediate)"
+ default="fifo",
+ description="experimental: override vulkan present mode (fifo/mailbox/immediate)"
),
-
- "experimental_fps_limit": ConfigField(
- name="experimental_fps_limit",
+}
+
+# Fields that should ONLY be in the lsfg script, not in TOML config
+SCRIPT_ONLY_FIELDS = {
+ "dxvk_frame_rate": ConfigField(
+ name="dxvk_frame_rate",
field_type=ConfigFieldType.INTEGER,
default=0,
- description="experimental: base framerate cap for dxvk games, before frame multiplier (0 = disabled)"
+ description="base framerate cap for DirectX games, before frame multiplier (0 = disabled, requires game re-launch)"
),
"enable_wow64": ConfigField(
@@ -102,6 +105,9 @@ CONFIG_SCHEMA: Dict[str, ConfigField] = {
)
}
+# Complete configuration schema (TOML + script-only fields)
+COMPLETE_CONFIG_SCHEMA = {**CONFIG_SCHEMA, **SCRIPT_ONLY_FIELDS}
+
class ConfigurationData(TypedDict):
"""Type-safe configuration data structure"""
@@ -111,7 +117,7 @@ class ConfigurationData(TypedDict):
performance_mode: bool
hdr_mode: bool
experimental_present_mode: str
- experimental_fps_limit: int
+ dxvk_frame_rate: int
enable_wow64: bool
disable_steamdeck_mode: bool
@@ -124,7 +130,7 @@ class ConfigurationManager:
"""Get default configuration values"""
return cast(ConfigurationData, {
field.name: field.default
- for field in CONFIG_SCHEMA.values()
+ for field in COMPLETE_CONFIG_SCHEMA.values()
})
@staticmethod
@@ -158,7 +164,7 @@ class ConfigurationManager:
@staticmethod
def get_field_names() -> list[str]:
"""Get ordered list of configuration field names"""
- return list(CONFIG_SCHEMA.keys())
+ return list(COMPLETE_CONFIG_SCHEMA.keys())
@staticmethod
def get_field_types() -> Dict[str, ConfigFieldType]:
@@ -173,7 +179,7 @@ class ConfigurationManager:
"""Validate and convert configuration data"""
validated = {}
- for field_name, field_def in CONFIG_SCHEMA.items():
+ for field_name, field_def in COMPLETE_CONFIG_SCHEMA.items():
value = config.get(field_name, field_def.default)
# Type validation and conversion
@@ -312,8 +318,8 @@ class ConfigurationManager:
@staticmethod
def create_config_from_args(dll: str, multiplier: int, flow_scale: float,
performance_mode: bool, hdr_mode: bool,
- experimental_present_mode: str = "",
- experimental_fps_limit: int = 0,
+ experimental_present_mode: str = "fifo",
+ dxvk_frame_rate: int = 0,
enable_wow64: bool = False,
disable_steamdeck_mode: bool = False) -> ConfigurationData:
"""Create configuration from individual arguments"""
@@ -324,7 +330,7 @@ class ConfigurationManager:
"performance_mode": performance_mode,
"hdr_mode": hdr_mode,
"experimental_present_mode": experimental_present_mode,
- "experimental_fps_limit": experimental_fps_limit,
+ "dxvk_frame_rate": dxvk_frame_rate,
"enable_wow64": enable_wow64,
"disable_steamdeck_mode": disable_steamdeck_mode
})
diff --git a/py_modules/lsfg_vk/configuration.py b/py_modules/lsfg_vk/configuration.py
index 1952a49..1336f21 100644
--- a/py_modules/lsfg_vk/configuration.py
+++ b/py_modules/lsfg_vk/configuration.py
@@ -67,8 +67,8 @@ class ConfigurationService(BaseService):
def update_config(self, dll: str, multiplier: int, flow_scale: float,
performance_mode: bool, hdr_mode: bool,
- experimental_present_mode: str = "",
- experimental_fps_limit: int = 0,
+ experimental_present_mode: str = "fifo",
+ dxvk_frame_rate: int = 0,
enable_wow64: bool = False,
disable_steamdeck_mode: bool = False) -> ConfigurationResponse:
"""Update TOML configuration
@@ -80,7 +80,7 @@ class ConfigurationService(BaseService):
performance_mode: Whether to enable performance mode
hdr_mode: Whether to enable HDR mode
experimental_present_mode: Experimental Vulkan present mode override
- experimental_fps_limit: Experimental FPS limit for DXVK games
+ dxvk_frame_rate: Frame rate cap for DirectX games, before frame multiplier (0 = disabled)
enable_wow64: Whether to enable PROTON_USE_WOW64=1 for 32-bit games
disable_steamdeck_mode: Whether to disable Steam Deck mode
@@ -91,7 +91,7 @@ class ConfigurationService(BaseService):
# Create configuration from individual arguments
config = ConfigurationManager.create_config_from_args(
dll, multiplier, flow_scale, performance_mode, hdr_mode,
- experimental_present_mode, experimental_fps_limit, enable_wow64, disable_steamdeck_mode
+ experimental_present_mode, dxvk_frame_rate, enable_wow64, disable_steamdeck_mode
)
# Generate TOML content using centralized manager
@@ -112,7 +112,7 @@ class ConfigurationService(BaseService):
f"dll='{dll}', multiplier={multiplier}, flow_scale={flow_scale}, "
f"performance_mode={performance_mode}, hdr_mode={hdr_mode}, "
f"experimental_present_mode='{experimental_present_mode}', "
- f"experimental_fps_limit={experimental_fps_limit}, "
+ f"dxvk_frame_rate={dxvk_frame_rate}, "
f"enable_wow64={enable_wow64}, disable_steamdeck_mode={disable_steamdeck_mode}")
return {
@@ -248,6 +248,11 @@ class ConfigurationService(BaseService):
if config.get("disable_steamdeck_mode", False):
lines.append("export SteamDeck=0")
+ # Add DXVK_FRAME_RATE if dxvk_frame_rate is set
+ dxvk_frame_rate = config.get("dxvk_frame_rate", 0)
+ if dxvk_frame_rate > 0:
+ lines.append(f"export DXVK_FRAME_RATE={dxvk_frame_rate}")
+
# Always add the LSFG_PROCESS export
lines.append("export LSFG_PROCESS=decky-lsfg-vk")
diff --git a/py_modules/lsfg_vk/plugin.py b/py_modules/lsfg_vk/plugin.py
index 4e19a2a..ae5c8e7 100644
--- a/py_modules/lsfg_vk/plugin.py
+++ b/py_modules/lsfg_vk/plugin.py
@@ -186,8 +186,8 @@ class Plugin:
async def update_lsfg_config(self, dll: str, multiplier: int, flow_scale: float,
performance_mode: bool, hdr_mode: bool,
- experimental_present_mode: str = "",
- experimental_fps_limit: int = 0,
+ experimental_present_mode: str = "fifo",
+ dxvk_frame_rate: int = 0,
enable_wow64: bool = False,
disable_steamdeck_mode: bool = False) -> Dict[str, Any]:
"""Update lsfg TOML configuration
@@ -199,7 +199,7 @@ class Plugin:
performance_mode: Whether to enable performance mode
hdr_mode: Whether to enable HDR mode
experimental_present_mode: Experimental Vulkan present mode override
- experimental_fps_limit: Experimental FPS limit for DXVK games
+ dxvk_frame_rate: Frame rate cap for DirectX games, before frame multiplier (0 = disabled)
enable_wow64: Whether to enable PROTON_USE_WOW64=1 for 32-bit games
disable_steamdeck_mode: Whether to disable Steam Deck mode
@@ -208,7 +208,7 @@ class Plugin:
"""
return self.configuration_service.update_config(
dll, multiplier, flow_scale, performance_mode, hdr_mode,
- experimental_present_mode, experimental_fps_limit, enable_wow64, disable_steamdeck_mode
+ experimental_present_mode, dxvk_frame_rate, enable_wow64, disable_steamdeck_mode
)
async def update_dll_path(self, dll_path: str) -> Dict[str, Any]:
diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx
index ad99c28..5afd8f6 100644
--- a/src/components/ConfigurationSection.tsx
+++ b/src/components/ConfigurationSection.tsx
@@ -98,14 +98,12 @@ export function ConfigurationSection({
<PanelSectionRow>
<DropdownItem
label="Override Vulkan present mode"
- description="Select a specific Vulkan presentation mode for better performance or compatibility (may cause crashes)"
+ description="Select a specific Vulkan presentation mode for better performance or compatibility (May cause crashes)"
menuLabel="Select presentation mode"
- selectedOption={config.experimental_present_mode}
+ selectedOption={config.experimental_present_mode || "fifo"}
onChange={(value) => onConfigChange('experimental_present_mode', value.data)}
rgOptions={[
- { data: "", label: "Default" },
- { data: "fifo", label: "FIFO" },
- { data: "vsync", label: "VSync" },
+ { data: "fifo", label: "FIFO (VSync) - Default" },
{ data: "mailbox", label: "Mailbox" },
{ data: "immediate", label: "Immediate" }
]}
@@ -113,18 +111,6 @@ export function ConfigurationSection({
</PanelSectionRow>
<PanelSectionRow>
- <SliderField
- label={`FPS Limit${config.experimental_fps_limit > 0 ? ` (${config.experimental_fps_limit} FPS)` : ' (Off)'}`}
- description="Base framerate cap for DirectX games, before frame multiplier (requires game re-launch)"
- value={config.experimental_fps_limit}
- min={0}
- max={60}
- step={1}
- onChange={(value) => onConfigChange('experimental_fps_limit', value)}
- />
- </PanelSectionRow>
-
- <PanelSectionRow>
<div
style={{
fontSize: "14px",
@@ -136,14 +122,26 @@ export function ConfigurationSection({
color: "white"
}}
>
- Environment Variables (Requires Re-launch)
+ Environment Variables (Requires re-launch)
</div>
</PanelSectionRow>
<PanelSectionRow>
+ <SliderField
+ label={`Base FPS Cap${config.dxvk_frame_rate > 0 ? ` (${config.dxvk_frame_rate} FPS)` : ' (Off)'}`}
+ description="Base framerate cap for DirectX games, before frame multiplier"
+ value={config.dxvk_frame_rate}
+ min={0}
+ max={60}
+ step={1}
+ onChange={(value) => onConfigChange('dxvk_frame_rate', value)}
+ />
+ </PanelSectionRow>
+
+ <PanelSectionRow>
<ToggleField
label="Enable WOW64 for 32-bit games"
- description="Enables PROTON_USE_WOW64=1 for 32-bit games (use with ProtonGE to fix crashing)"
+ description="Enables PROTON_USE_WOW64=1 for 32-bit games (Use with ProtonGE to fix crashing)"
checked={config.enable_wow64}
onChange={(value) => onConfigChange('enable_wow64', value)}
/>
@@ -152,7 +150,7 @@ export function ConfigurationSection({
<PanelSectionRow>
<ToggleField
label="Disable Steam Deck Mode"
- description="Disables Steam Deck mode (unlocks hidden settings in some games)"
+ description="Disables Steam Deck mode (Unlocks hidden settings in some games)"
checked={config.disable_steamdeck_mode}
onChange={(value) => onConfigChange('disable_steamdeck_mode', value)}
/>
diff --git a/src/components/UsageInstructions.tsx b/src/components/UsageInstructions.tsx
index 5de1fcf..6025241 100644
--- a/src/components/UsageInstructions.tsx
+++ b/src/components/UsageInstructions.tsx
@@ -71,8 +71,8 @@ export function UsageInstructions({ config }: UsageInstructionsProps) {
• Flow Scale: ${Math.round(config.flow_scale * 100)}%
• Performance Mode: ${config.performance_mode ? "Yes" : "No"}
• HDR Mode: ${config.hdr_mode ? "Yes" : "No"}
-• Present Mode: ${config.experimental_present_mode || "Default (FIFO)"}
-• FPS Limit: ${config.experimental_fps_limit > 0 ? `${config.experimental_fps_limit} FPS` : "Off"}`}
+• Present Mode: ${config.experimental_present_mode || "FIFO (VSync)"}
+• DXVK Frame Rate: ${config.dxvk_frame_rate > 0 ? `${config.dxvk_frame_rate} FPS` : "Off"}`}
</div>
</PanelSectionRow> */}
diff --git a/src/config/configSchema.ts b/src/config/configSchema.ts
index fa54336..03b1510 100644
--- a/src/config/configSchema.ts
+++ b/src/config/configSchema.ts
@@ -61,15 +61,15 @@ export const CONFIG_SCHEMA: Record<string, ConfigField> = {
experimental_present_mode: {
name: "experimental_present_mode",
fieldType: ConfigFieldType.STRING,
- default: "",
- description: "experimental: override vulkan present mode (empty/fifo/vsync/mailbox/immediate)"
+ default: "fifo",
+ description: "experimental: override vulkan present mode (fifo/mailbox/immediate)"
},
- experimental_fps_limit: {
- name: "experimental_fps_limit",
+ dxvk_frame_rate: {
+ name: "dxvk_frame_rate",
fieldType: ConfigFieldType.INTEGER,
default: 0,
- description: "experimental: base framerate cap for dxvk games, before frame multiplier (0 = disabled)"
+ description: "Base framerate cap for DirectX games, before frame multiplier (0 = disabled, requires game re-launch)"
},
enable_wow64: {
@@ -95,7 +95,7 @@ export interface ConfigurationData {
performance_mode: boolean;
hdr_mode: boolean;
experimental_present_mode: string;
- experimental_fps_limit: number;
+ dxvk_frame_rate: number;
enable_wow64: boolean;
disable_steamdeck_mode: boolean;
}
diff --git a/tests/test_configuration.py b/tests/test_configuration.py
index 1b10413..9b306e5 100644
--- a/tests/test_configuration.py
+++ b/tests/test_configuration.py
@@ -134,7 +134,7 @@ def test_config_roundtrip():
performance_mode=False,
hdr_mode=True,
experimental_present_mode="immediate",
- experimental_fps_limit=30,
+ dxvk_frame_rate=30,
enable_wow64=True,
disable_steamdeck_mode=False
)
@@ -152,7 +152,7 @@ def test_config_roundtrip():
assert config["performance_mode"] is False
assert config["hdr_mode"] is True
assert config["experimental_present_mode"] == "immediate"
- assert config["experimental_fps_limit"] == 30
+ assert config["dxvk_frame_rate"] == 30
assert config["enable_wow64"] is True
assert config["disable_steamdeck_mode"] is False