diff options
| author | xXJSONDeruloXx <danielhimebauch@gmail.com> | 2025-07-19 09:02:50 -0400 |
|---|---|---|
| committer | xXJSONDeruloXx <danielhimebauch@gmail.com> | 2025-07-19 09:02:50 -0400 |
| commit | 8448c823c000d494480bde677f76c60969805723 (patch) | |
| tree | 0a011fe8fa67fcc4989d8a2b657c3bfe0392a38c | |
| parent | f010473bfdf6b9a58960a5dac71fa48837ae6a1c (diff) | |
| download | decky-lsfg-vk-8448c823c000d494480bde677f76c60969805723.tar.gz decky-lsfg-vk-8448c823c000d494480bde677f76c60969805723.zip | |
move env vars into lsfg script, getting sunset in lsfg-vk config soon
| -rw-r--r-- | package.json | 4 | ||||
| -rw-r--r-- | plugin.json | 2 | ||||
| -rw-r--r-- | py_modules/lsfg_vk/config_schema.py | 34 | ||||
| -rw-r--r-- | py_modules/lsfg_vk/configuration.py | 15 | ||||
| -rw-r--r-- | py_modules/lsfg_vk/plugin.py | 8 | ||||
| -rw-r--r-- | src/components/ConfigurationSection.tsx | 30 | ||||
| -rw-r--r-- | src/components/UsageInstructions.tsx | 4 | ||||
| -rw-r--r-- | src/config/configSchema.ts | 12 | ||||
| -rw-r--r-- | tests/test_configuration.py | 4 |
9 files changed, 61 insertions, 52 deletions
diff --git a/package.json b/package.json index dc41930..79d1661 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.4", "description": "Use Lossless Scaling on the Steam Deck using the lsfg-vk vulkan layer", "type": "module", "scripts": { diff --git a/plugin.json b/plugin.json index d8870c6..25cbb8c 100644 --- a/plugin.json +++ b/plugin.json @@ -1,5 +1,5 @@ { - "name": "Lossless Scaling", + "name": "Decky Lossless", "author": "Kurt Himebauch", "flags": ["debug", "_root"], "api_version": 1, 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..85ca463 100644 --- a/src/components/ConfigurationSection.tsx +++ b/src/components/ConfigurationSection.tsx @@ -100,12 +100,10 @@ export function ConfigurationSection({ label="Override Vulkan present mode" 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)" }, { 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", @@ -141,6 +127,18 @@ export function ConfigurationSection({ </PanelSectionRow> <PanelSectionRow> + <SliderField + label={`DXVK Frame Rate${config.dxvk_frame_rate > 0 ? ` (${config.dxvk_frame_rate} FPS)` : ' (Off)'}`} + description="Base framerate cap for DirectX games, before frame multiplier (requires game re-launch)" + 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)" 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 |
