diff options
| author | Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com> | 2025-07-16 16:35:34 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-16 16:35:34 -0400 |
| commit | 44393f6e126c3dff196283a2079162e3eb9245a2 (patch) | |
| tree | 46fdc7e70e272ac6a33259d1228233496b54371b /src/components | |
| parent | 80247f76332d2704e21361192b774f31b1520e57 (diff) | |
| parent | 7c8f336196c215d90588f1994fa1556c7790dba8 (diff) | |
| download | decky-lsfg-vk-44393f6e126c3dff196283a2079162e3eb9245a2.tar.gz decky-lsfg-vk-44393f6e126c3dff196283a2079162e3eb9245a2.zip | |
Merge pull request #30 from xXJSONDeruloXx/fps-limit
Fps limit
Diffstat (limited to 'src/components')
| -rw-r--r-- | src/components/ConfigurationSection.tsx | 67 | ||||
| -rw-r--r-- | src/components/Content.tsx | 49 | ||||
| -rw-r--r-- | src/components/UsageInstructions.tsx | 29 |
3 files changed, 47 insertions, 98 deletions
diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx index 34955f8..2545217 100644 --- a/src/components/ConfigurationSection.tsx +++ b/src/components/ConfigurationSection.tsx @@ -1,35 +1,14 @@ import { PanelSectionRow, ToggleField, SliderField } from "@decky/ui"; - -interface LsfgConfig { - enableLsfg: boolean; - multiplier: number; - flowScale: number; - hdr: boolean; - perfMode: boolean; - immediateMode: boolean; - disableVkbasalt: boolean; -} +import { ConfigurationData } from "../config/configSchema"; interface ConfigurationSectionProps { - config: LsfgConfig; - onEnableLsfgChange: (value: boolean) => Promise<void>; - onMultiplierChange: (value: number) => Promise<void>; - onFlowScaleChange: (value: number) => Promise<void>; - onHdrChange: (value: boolean) => Promise<void>; - onPerfModeChange: (value: boolean) => Promise<void>; - onImmediateModeChange: (value: boolean) => Promise<void>; - onDisableVkbasaltChange: (value: boolean) => Promise<void>; + config: ConfigurationData; + onConfigChange: (fieldName: keyof ConfigurationData, value: boolean | number) => Promise<void>; } export function ConfigurationSection({ config, - onEnableLsfgChange, - onMultiplierChange, - onFlowScaleChange, - onHdrChange, - onPerfModeChange, - onImmediateModeChange, - onDisableVkbasaltChange + onConfigChange }: ConfigurationSectionProps) { return ( <> @@ -52,8 +31,8 @@ export function ConfigurationSection({ <ToggleField label="Enable LSFG" description="Enables the frame generation layer" - checked={config.enableLsfg} - onChange={onEnableLsfgChange} + checked={config.enable_lsfg} + onChange={(value) => onConfigChange('enable_lsfg', value)} /> </PanelSectionRow> @@ -71,19 +50,19 @@ export function ConfigurationSection({ { notchIndex: 1, label: "3X" }, { notchIndex: 2, label: "4X" } ]} - onChange={onMultiplierChange} + onChange={(value) => onConfigChange('multiplier', value)} /> </PanelSectionRow> <PanelSectionRow> <SliderField - label={`Flow Scale ${Math.round(config.flowScale * 100)}%`} + label={`Flow Scale ${Math.round(config.flow_scale * 100)}%`} description="Lowers the internal motion estimation resolution" - value={config.flowScale} + value={config.flow_scale} min={0.25} max={1.0} step={0.01} - onChange={onFlowScaleChange} + onChange={(value) => onConfigChange('flow_scale', value)} /> </PanelSectionRow> @@ -92,7 +71,7 @@ export function ConfigurationSection({ label="HDR Mode" description="Enable HDR mode (only if Game supports HDR)" checked={config.hdr} - onChange={onHdrChange} + onChange={(value) => onConfigChange('hdr', value)} /> </PanelSectionRow> @@ -100,8 +79,8 @@ export function ConfigurationSection({ <ToggleField label="Performance Mode" description="Use lighter model for FG" - checked={config.perfMode} - onChange={onPerfModeChange} + checked={config.perf_mode} + onChange={(value) => onConfigChange('perf_mode', value)} /> </PanelSectionRow> @@ -109,8 +88,20 @@ export function ConfigurationSection({ <ToggleField label="Immediate Mode" description="Reduce input lag (Experimental, will cause issues in many games)" - checked={config.immediateMode} - onChange={onImmediateModeChange} + checked={config.immediate_mode} + onChange={(value) => onConfigChange('immediate_mode', value)} + /> + </PanelSectionRow> + + <PanelSectionRow> + <SliderField + label={`Game Frame Cap ${config.frame_cap === 0 ? "(Disabled)" : `(${config.frame_cap} FPS)`}`} + description="Limit base game FPS (0 = disabled)" + value={config.frame_cap} + min={0} + max={60} + step={1} + onChange={(value) => onConfigChange('frame_cap', value)} /> </PanelSectionRow> @@ -118,8 +109,8 @@ export function ConfigurationSection({ <ToggleField label="Disable vkbasalt" description="Some plugins add vkbasalt layer, which can break lsfg. Toggling on fixes this" - checked={config.disableVkbasalt} - onChange={onDisableVkbasaltChange} + checked={config.disable_vkbasalt} + onChange={(value) => onConfigChange('disable_vkbasalt', value)} /> </PanelSectionRow> */} </> diff --git a/src/components/Content.tsx b/src/components/Content.tsx index 39de01b..ba651d4 100644 --- a/src/components/Content.tsx +++ b/src/components/Content.tsx @@ -8,6 +8,7 @@ import { ConfigurationSection } from "./ConfigurationSection"; import { UsageInstructions } from "./UsageInstructions"; import { WikiButton } from "./WikiButton"; import { ClipboardButton } from "./ClipboardButton"; +import { ConfigurationData } from "../config/configSchema"; export function Content() { const { @@ -21,9 +22,8 @@ export function Content() { const { config, - setters, loadLsfgConfig, - updateConfig + updateField } = useLsfgConfig(); const { isInstalling, isUninstalling, handleInstall, handleUninstall } = useInstallationActions(); @@ -35,40 +35,9 @@ export function Content() { } }, [isInstalled, loadLsfgConfig]); - // Configuration change handlers - const handleEnableLsfgChange = async (value: boolean) => { - setters.setEnableLsfg(value); - await updateConfig(value, config.multiplier, config.flowScale, config.hdr, config.perfMode, config.immediateMode, config.disableVkbasalt); - }; - - const handleMultiplierChange = async (value: number) => { - setters.setMultiplier(value); - await updateConfig(config.enableLsfg, value, config.flowScale, config.hdr, config.perfMode, config.immediateMode, config.disableVkbasalt); - }; - - const handleFlowScaleChange = async (value: number) => { - setters.setFlowScale(value); - await updateConfig(config.enableLsfg, config.multiplier, value, config.hdr, config.perfMode, config.immediateMode, config.disableVkbasalt); - }; - - const handleHdrChange = async (value: boolean) => { - setters.setHdr(value); - await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, value, config.perfMode, config.immediateMode, config.disableVkbasalt); - }; - - const handlePerfModeChange = async (value: boolean) => { - setters.setPerfMode(value); - await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, config.hdr, value, config.immediateMode, config.disableVkbasalt); - }; - - const handleImmediateModeChange = async (value: boolean) => { - setters.setImmediateMode(value); - await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, config.hdr, config.perfMode, value, config.disableVkbasalt); - }; - - const handleDisableVkbasaltChange = async (value: boolean) => { - setters.setDisableVkbasalt(value); - await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, config.hdr, config.perfMode, config.immediateMode, value); + // Generic configuration change handler + const handleConfigChange = async (fieldName: keyof ConfigurationData, value: boolean | number) => { + await updateField(fieldName, value); }; const onInstall = () => { @@ -100,13 +69,7 @@ export function Content() { {isInstalled && ( <ConfigurationSection config={config} - onEnableLsfgChange={handleEnableLsfgChange} - onMultiplierChange={handleMultiplierChange} - onFlowScaleChange={handleFlowScaleChange} - onHdrChange={handleHdrChange} - onPerfModeChange={handlePerfModeChange} - onImmediateModeChange={handleImmediateModeChange} - onDisableVkbasaltChange={handleDisableVkbasaltChange} + onConfigChange={handleConfigChange} /> )} diff --git a/src/components/UsageInstructions.tsx b/src/components/UsageInstructions.tsx index bf80630..727a0ab 100644 --- a/src/components/UsageInstructions.tsx +++ b/src/components/UsageInstructions.tsx @@ -1,17 +1,8 @@ import { PanelSectionRow } from "@decky/ui"; - -interface ConfigType { - enableLsfg: boolean; - multiplier: number; - flowScale: number; - hdr: boolean; - perfMode: boolean; - immediateMode: boolean; - disableVkbasalt: boolean; -} +import { ConfigurationData } from "../config/configSchema"; interface UsageInstructionsProps { - config: ConfigType; + config: ConfigurationData; } export function UsageInstructions({ config }: UsageInstructionsProps) { @@ -19,32 +10,36 @@ export function UsageInstructions({ config }: UsageInstructionsProps) { const buildManualEnvVars = (): string => { const envVars: string[] = []; - if (config.enableLsfg) { + if (config.enable_lsfg) { envVars.push("ENABLE_LSFG=1"); } // Always include multiplier and flow_scale if LSFG is enabled, as they have defaults - if (config.enableLsfg) { + if (config.enable_lsfg) { envVars.push(`LSFG_MULTIPLIER=${config.multiplier}`); - envVars.push(`LSFG_FLOW_SCALE=${config.flowScale}`); + envVars.push(`LSFG_FLOW_SCALE=${config.flow_scale}`); } if (config.hdr) { envVars.push("LSFG_HDR=1"); } - if (config.perfMode) { + if (config.perf_mode) { envVars.push("LSFG_PERF_MODE=1"); } - if (config.immediateMode) { + if (config.immediate_mode) { envVars.push("MESA_VK_WSI_PRESENT_MODE=immediate"); } - if (config.disableVkbasalt) { + if (config.disable_vkbasalt) { envVars.push("DISABLE_VKBASALT=1"); } + if (config.frame_cap > 0) { + envVars.push(`DXVK_FRAME_RATE=${config.frame_cap}`); + } + return envVars.length > 0 ? `${envVars.join(" ")} %command%` : "%command%"; }; |
