diff options
| -rw-r--r-- | py_modules/lsfg_vk/config_schema.py | 24 | ||||
| -rw-r--r-- | py_modules/lsfg_vk/configuration.py | 13 | ||||
| -rw-r--r-- | py_modules/lsfg_vk/plugin.py | 9 | ||||
| -rw-r--r-- | src/api/lsfgApi.ts | 4 | ||||
| -rw-r--r-- | src/components/ConfigurationSection.tsx | 46 | ||||
| -rw-r--r-- | src/components/Content.tsx | 4 | ||||
| -rw-r--r-- | src/components/UsageInstructions.tsx | 4 | ||||
| -rw-r--r-- | src/components/index.ts | 2 | ||||
| -rw-r--r-- | src/config/configSchema.ts | 16 |
9 files changed, 108 insertions, 14 deletions
diff --git a/py_modules/lsfg_vk/config_schema.py b/py_modules/lsfg_vk/config_schema.py index 1604f5d..42ac640 100644 --- a/py_modules/lsfg_vk/config_schema.py +++ b/py_modules/lsfg_vk/config_schema.py @@ -78,6 +78,20 @@ CONFIG_SCHEMA: Dict[str, ConfigField] = { field_type=ConfigFieldType.BOOLEAN, default=False, description="enable hdr mode" + ), + + "experimental_present_mode": ConfigField( + name="experimental_present_mode", + field_type=ConfigFieldType.STRING, + default="", + description="experimental: override vulkan present mode (empty/fifo/vsync/mailbox/immediate)" + ), + + "experimental_fps_limit": ConfigField( + name="experimental_fps_limit", + field_type=ConfigFieldType.INTEGER, + default=0, + description="experimental: base framerate cap for dxvk games, before frame multiplier (0 = disabled)" ) } @@ -90,6 +104,8 @@ class ConfigurationData(TypedDict): flow_scale: float performance_mode: bool hdr_mode: bool + experimental_present_mode: str + experimental_fps_limit: int class ConfigurationManager: @@ -250,7 +266,9 @@ class ConfigurationManager: @staticmethod def create_config_from_args(enable: bool, dll: str, multiplier: int, flow_scale: float, - performance_mode: bool, hdr_mode: bool) -> ConfigurationData: + performance_mode: bool, hdr_mode: bool, + experimental_present_mode: str = "", + experimental_fps_limit: int = 0) -> ConfigurationData: """Create configuration from individual arguments""" return cast(ConfigurationData, { "enable": enable, @@ -258,5 +276,7 @@ class ConfigurationManager: "multiplier": multiplier, "flow_scale": flow_scale, "performance_mode": performance_mode, - "hdr_mode": hdr_mode + "hdr_mode": hdr_mode, + "experimental_present_mode": experimental_present_mode, + "experimental_fps_limit": experimental_fps_limit }) diff --git a/py_modules/lsfg_vk/configuration.py b/py_modules/lsfg_vk/configuration.py index a4fcae5..255092a 100644 --- a/py_modules/lsfg_vk/configuration.py +++ b/py_modules/lsfg_vk/configuration.py @@ -66,7 +66,9 @@ class ConfigurationService(BaseService): } def update_config(self, enable: bool, dll: str, multiplier: int, flow_scale: float, - performance_mode: bool, hdr_mode: bool) -> ConfigurationResponse: + performance_mode: bool, hdr_mode: bool, + experimental_present_mode: str = "", + experimental_fps_limit: int = 0) -> ConfigurationResponse: """Update TOML configuration Args: @@ -76,6 +78,8 @@ class ConfigurationService(BaseService): flow_scale: LSFG flow scale value 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 Returns: ConfigurationResponse with success status @@ -83,7 +87,8 @@ class ConfigurationService(BaseService): try: # Create configuration from individual arguments config = ConfigurationManager.create_config_from_args( - enable, dll, multiplier, flow_scale, performance_mode, hdr_mode + enable, dll, multiplier, flow_scale, performance_mode, hdr_mode, + experimental_present_mode, experimental_fps_limit ) # Generate TOML content using centralized manager @@ -97,7 +102,9 @@ class ConfigurationService(BaseService): self.log.info(f"Updated lsfg TOML configuration: enable={enable}, " f"dll='{dll}', multiplier={multiplier}, flow_scale={flow_scale}, " - f"performance_mode={performance_mode}, hdr_mode={hdr_mode}") + f"performance_mode={performance_mode}, hdr_mode={hdr_mode}, " + f"experimental_present_mode='{experimental_present_mode}', " + f"experimental_fps_limit={experimental_fps_limit}") return { "success": True, diff --git a/py_modules/lsfg_vk/plugin.py b/py_modules/lsfg_vk/plugin.py index c56765b..a7b6045 100644 --- a/py_modules/lsfg_vk/plugin.py +++ b/py_modules/lsfg_vk/plugin.py @@ -123,7 +123,9 @@ class Plugin: } async def update_lsfg_config(self, enable: bool, dll: str, multiplier: int, flow_scale: float, - performance_mode: bool, hdr_mode: bool) -> Dict[str, Any]: + performance_mode: bool, hdr_mode: bool, + experimental_present_mode: str = "", + experimental_fps_limit: int = 0) -> Dict[str, Any]: """Update lsfg TOML configuration Args: @@ -133,12 +135,15 @@ class Plugin: flow_scale: LSFG flow scale value 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 Returns: ConfigurationResponse dict with success status """ return self.configuration_service.update_config( - enable, dll, multiplier, flow_scale, performance_mode, hdr_mode + enable, dll, multiplier, flow_scale, performance_mode, hdr_mode, + experimental_present_mode, experimental_fps_limit ) async def update_dll_path(self, dll_path: str) -> Dict[str, Any]: diff --git a/src/api/lsfgApi.ts b/src/api/lsfgApi.ts index 8cdf6f0..7d37f4e 100644 --- a/src/api/lsfgApi.ts +++ b/src/api/lsfgApi.ts @@ -76,14 +76,14 @@ export const getConfigSchema = callable<[], ConfigSchemaResult>("get_config_sche // Updated config function using centralized configuration export const updateLsfgConfig = callable< - [boolean, string, number, number, boolean, boolean], + [boolean, string, number, number, boolean, boolean, string, number], ConfigUpdateResult >("update_lsfg_config"); // Helper function to create config update from configuration object export const updateLsfgConfigFromObject = async (config: ConfigurationData): Promise<ConfigUpdateResult> => { const args = ConfigurationManager.createArgsFromConfig(config); - return updateLsfgConfig(...args as [boolean, string, number, number, boolean, boolean]); + return updateLsfgConfig(...args as [boolean, string, number, number, boolean, boolean, string, number]); }; // Self-updater API functions diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx index deb8fba..76b9bc2 100644 --- a/src/components/ConfigurationSection.tsx +++ b/src/components/ConfigurationSection.tsx @@ -1,4 +1,4 @@ -import { PanelSectionRow, ToggleField, SliderField, TextField } from "@decky/ui"; +import { PanelSectionRow, ToggleField, SliderField, Dropdown } from "@decky/ui"; import { ConfigurationData } from "../config/configSchema"; interface ConfigurationSectionProps { @@ -93,6 +93,50 @@ export function ConfigurationSection({ onChange={(value) => onConfigChange('hdr_mode', value)} /> </PanelSectionRow> + + {/* Experimental Features Section */} + <PanelSectionRow> + <div + style={{ + fontSize: "14px", + fontWeight: "bold", + marginTop: "24px", + marginBottom: "8px", + borderBottom: "1px solid rgba(255, 165, 0, 0.4)", + paddingBottom: "4px", + color: "rgba(255, 165, 0, 0.9)" + }} + > + ⚠️ Experimental Features + </div> + </PanelSectionRow> + + <PanelSectionRow> + <Dropdown + menuLabel="Present Mode" + selectedOption={config.experimental_present_mode} + onChange={(value) => onConfigChange('experimental_present_mode', value.data)} + rgOptions={[ + { data: "", label: "Default (FIFO)" }, + { data: "fifo", label: "FIFO" }, + { data: "vsync", label: "VSync" }, + { data: "mailbox", label: "Mailbox" }, + { data: "immediate", label: "Immediate" } + ]} + /> + </PanelSectionRow> + + <PanelSectionRow> + <SliderField + label={`FPS Limit${config.experimental_fps_limit > 0 ? ` (${config.experimental_fps_limit} FPS)` : ' (Off)'}`} + description="Base framerate cap for DXVK games, before frame multiplier (0 = disabled)" + value={config.experimental_fps_limit} + min={0} + max={60} + step={1} + onChange={(value) => onConfigChange('experimental_fps_limit', value)} + /> + </PanelSectionRow> </> ); } diff --git a/src/components/Content.tsx b/src/components/Content.tsx index 613e722..ae64931 100644 --- a/src/components/Content.tsx +++ b/src/components/Content.tsx @@ -5,7 +5,7 @@ import { useInstallationActions } from "../hooks/useInstallationActions"; import { StatusDisplay } from "./StatusDisplay"; import { InstallationButton } from "./InstallationButton"; import { ConfigurationSection } from "./ConfigurationSection"; -import { UsageInstructions } from "./UsageInstructions"; +// import { UsageInstructions } from "./UsageInstructions"; import { WikiButton } from "./WikiButton"; import { ClipboardButton } from "./ClipboardButton"; import { PluginUpdateChecker } from "./PluginUpdateChecker"; @@ -74,7 +74,7 @@ export function Content() { /> )} - <UsageInstructions config={config} /> + {/* <UsageInstructions config={config} /> */} <WikiButton /> <ClipboardButton /> diff --git a/src/components/UsageInstructions.tsx b/src/components/UsageInstructions.tsx index ac721c7..d156f9d 100644 --- a/src/components/UsageInstructions.tsx +++ b/src/components/UsageInstructions.tsx @@ -54,7 +54,9 @@ export function UsageInstructions({ config }: UsageInstructionsProps) { • Multiplier: ${config.multiplier}x • Flow Scale: ${Math.round(config.flow_scale * 100)}% • Performance Mode: ${config.performance_mode ? "Yes" : "No"} -• HDR Mode: ${config.hdr_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"}`} </div> </PanelSectionRow> diff --git a/src/components/index.ts b/src/components/index.ts index d26159d..ab7a117 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -2,7 +2,7 @@ export { Content } from "./Content"; export { StatusDisplay } from "./StatusDisplay"; export { InstallationButton } from "./InstallationButton"; export { ConfigurationSection } from "./ConfigurationSection"; -export { UsageInstructions } from "./UsageInstructions"; +// export { UsageInstructions } from "./UsageInstructions"; export { WikiButton } from "./WikiButton"; export { ClipboardButton } from "./ClipboardButton"; export { PluginUpdateChecker } from "./PluginUpdateChecker"; diff --git a/src/config/configSchema.ts b/src/config/configSchema.ts index 6dc8687..9b6fc41 100644 --- a/src/config/configSchema.ts +++ b/src/config/configSchema.ts @@ -63,6 +63,20 @@ export const CONFIG_SCHEMA: Record<string, ConfigField> = { fieldType: ConfigFieldType.BOOLEAN, default: false, description: "enable hdr in games that support it" + }, + + experimental_present_mode: { + name: "experimental_present_mode", + fieldType: ConfigFieldType.STRING, + default: "", + description: "experimental: override vulkan present mode (empty/fifo/vsync/mailbox/immediate)" + }, + + experimental_fps_limit: { + name: "experimental_fps_limit", + fieldType: ConfigFieldType.INTEGER, + default: 0, + description: "experimental: base framerate cap for dxvk games, before frame multiplier (0 = disabled)" } }; @@ -74,6 +88,8 @@ export interface ConfigurationData { flow_scale: number; performance_mode: boolean; hdr_mode: boolean; + experimental_present_mode: string; + experimental_fps_limit: number; } // Centralized configuration manager |
