diff options
| author | Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com> | 2025-07-19 13:18:45 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-19 13:18:45 -0400 |
| commit | d1d5223e04a037c4ad08f5d4588ec86204ddda52 (patch) | |
| tree | 615ecedc9b35b051df71e5c57ba4e0bced1630f9 | |
| parent | f010473bfdf6b9a58960a5dac71fa48837ae6a1c (diff) | |
| parent | 259ed8601541852606966648e3b2cf25795cf21d (diff) | |
| download | decky-lsfg-vk-d1d5223e04a037c4ad08f5d4588ec86204ddda52.tar.gz decky-lsfg-vk-d1d5223e04a037c4ad08f5d4588ec86204ddda52.zip | |
Merge pull request #42 from xXJSONDeruloXx/relocate-envsv0.6.6
Relocate envs
| -rw-r--r-- | package.json | 8 | ||||
| -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 | 38 | ||||
| -rw-r--r-- | src/components/UsageInstructions.tsx | 4 | ||||
| -rw-r--r-- | src/config/configSchema.ts | 12 | ||||
| -rw-r--r-- | tests/test_configuration.py | 4 |
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 |
