summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxXJSONDeruloXx <danielhimebauch@gmail.com>2025-07-16 10:42:54 -0400
committerxXJSONDeruloXx <danielhimebauch@gmail.com>2025-07-16 10:42:54 -0400
commiteb1c32ee61d4d4098feb1441ea5bf3b73f520780 (patch)
tree4aa33d86c429f10f41051b5db0b7a494ff93c082 /src
parent80247f76332d2704e21361192b774f31b1520e57 (diff)
downloaddecky-lsfg-vk-eb1c32ee61d4d4098feb1441ea5bf3b73f520780.tar.gz
decky-lsfg-vk-eb1c32ee61d4d4098feb1441ea5bf3b73f520780.zip
initial add of fps cap ui toggle
Diffstat (limited to 'src')
-rw-r--r--src/api/lsfgApi.ts3
-rw-r--r--src/components/ConfigurationSection.tsx27
-rw-r--r--src/components/Content.tsx20
-rw-r--r--src/components/UsageInstructions.tsx5
-rw-r--r--src/hooks/useLsfgHooks.ts14
5 files changed, 56 insertions, 13 deletions
diff --git a/src/api/lsfgApi.ts b/src/api/lsfgApi.ts
index 0a0b502..31ecbb5 100644
--- a/src/api/lsfgApi.ts
+++ b/src/api/lsfgApi.ts
@@ -35,6 +35,7 @@ export interface LsfgConfig {
perf_mode: boolean;
immediate_mode: boolean;
disable_vkbasalt: boolean;
+ frame_cap: number;
}
export interface ConfigResult {
@@ -56,6 +57,6 @@ export const checkLsfgVkInstalled = callable<[], InstallationStatus>("check_lsfg
export const checkLosslessScalingDll = callable<[], DllDetectionResult>("check_lossless_scaling_dll");
export const getLsfgConfig = callable<[], ConfigResult>("get_lsfg_config");
export const updateLsfgConfig = callable<
- [boolean, number, number, boolean, boolean, boolean, boolean],
+ [boolean, number, number, boolean, boolean, boolean, boolean, number],
ConfigUpdateResult
>("update_lsfg_config");
diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx
index 34955f8..6c6f50a 100644
--- a/src/components/ConfigurationSection.tsx
+++ b/src/components/ConfigurationSection.tsx
@@ -8,6 +8,7 @@ interface LsfgConfig {
perfMode: boolean;
immediateMode: boolean;
disableVkbasalt: boolean;
+ frameCap: number;
}
interface ConfigurationSectionProps {
@@ -19,6 +20,7 @@ interface ConfigurationSectionProps {
onPerfModeChange: (value: boolean) => Promise<void>;
onImmediateModeChange: (value: boolean) => Promise<void>;
onDisableVkbasaltChange: (value: boolean) => Promise<void>;
+ onFrameCapChange: (value: number) => Promise<void>;
}
export function ConfigurationSection({
@@ -29,7 +31,8 @@ export function ConfigurationSection({
onHdrChange,
onPerfModeChange,
onImmediateModeChange,
- onDisableVkbasaltChange
+ onDisableVkbasaltChange,
+ onFrameCapChange
}: ConfigurationSectionProps) {
return (
<>
@@ -114,6 +117,28 @@ export function ConfigurationSection({
/>
</PanelSectionRow>
+ <PanelSectionRow>
+ <SliderField
+ label={`Game Frame Cap ${config.frameCap === 0 ? "(Disabled)" : `(${config.frameCap} FPS)`}`}
+ description="Limit frame rate using DXVK_FRAME_RATE (0 = disabled)"
+ value={config.frameCap}
+ min={0}
+ max={60}
+ step={5}
+ notchCount={7}
+ notchLabels={[
+ { notchIndex: 0, label: "Off" },
+ { notchIndex: 1, label: "10" },
+ { notchIndex: 2, label: "20" },
+ { notchIndex: 3, label: "30" },
+ { notchIndex: 4, label: "40" },
+ { notchIndex: 5, label: "50" },
+ { notchIndex: 6, label: "60" }
+ ]}
+ onChange={onFrameCapChange}
+ />
+ </PanelSectionRow>
+
{/* <PanelSectionRow>
<ToggleField
label="Disable vkbasalt"
diff --git a/src/components/Content.tsx b/src/components/Content.tsx
index 39de01b..895b2fc 100644
--- a/src/components/Content.tsx
+++ b/src/components/Content.tsx
@@ -38,37 +38,42 @@ export function Content() {
// 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);
+ await updateConfig(value, config.multiplier, config.flowScale, config.hdr, config.perfMode, config.immediateMode, config.disableVkbasalt, config.frameCap);
};
const handleMultiplierChange = async (value: number) => {
setters.setMultiplier(value);
- await updateConfig(config.enableLsfg, value, config.flowScale, config.hdr, config.perfMode, config.immediateMode, config.disableVkbasalt);
+ await updateConfig(config.enableLsfg, value, config.flowScale, config.hdr, config.perfMode, config.immediateMode, config.disableVkbasalt, config.frameCap);
};
const handleFlowScaleChange = async (value: number) => {
setters.setFlowScale(value);
- await updateConfig(config.enableLsfg, config.multiplier, value, config.hdr, config.perfMode, config.immediateMode, config.disableVkbasalt);
+ await updateConfig(config.enableLsfg, config.multiplier, value, config.hdr, config.perfMode, config.immediateMode, config.disableVkbasalt, config.frameCap);
};
const handleHdrChange = async (value: boolean) => {
setters.setHdr(value);
- await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, value, config.perfMode, config.immediateMode, config.disableVkbasalt);
+ await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, value, config.perfMode, config.immediateMode, config.disableVkbasalt, config.frameCap);
};
const handlePerfModeChange = async (value: boolean) => {
setters.setPerfMode(value);
- await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, config.hdr, value, config.immediateMode, config.disableVkbasalt);
+ await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, config.hdr, value, config.immediateMode, config.disableVkbasalt, config.frameCap);
};
const handleImmediateModeChange = async (value: boolean) => {
setters.setImmediateMode(value);
- await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, config.hdr, config.perfMode, value, config.disableVkbasalt);
+ await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, config.hdr, config.perfMode, value, config.disableVkbasalt, config.frameCap);
};
const handleDisableVkbasaltChange = async (value: boolean) => {
setters.setDisableVkbasalt(value);
- await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, config.hdr, config.perfMode, config.immediateMode, value);
+ await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, config.hdr, config.perfMode, config.immediateMode, value, config.frameCap);
+ };
+
+ const handleFrameCapChange = async (value: number) => {
+ setters.setFrameCap(value);
+ await updateConfig(config.enableLsfg, config.multiplier, config.flowScale, config.hdr, config.perfMode, config.immediateMode, config.disableVkbasalt, value);
};
const onInstall = () => {
@@ -107,6 +112,7 @@ export function Content() {
onPerfModeChange={handlePerfModeChange}
onImmediateModeChange={handleImmediateModeChange}
onDisableVkbasaltChange={handleDisableVkbasaltChange}
+ onFrameCapChange={handleFrameCapChange}
/>
)}
diff --git a/src/components/UsageInstructions.tsx b/src/components/UsageInstructions.tsx
index bf80630..3589c04 100644
--- a/src/components/UsageInstructions.tsx
+++ b/src/components/UsageInstructions.tsx
@@ -8,6 +8,7 @@ interface ConfigType {
perfMode: boolean;
immediateMode: boolean;
disableVkbasalt: boolean;
+ frameCap: number;
}
interface UsageInstructionsProps {
@@ -45,6 +46,10 @@ export function UsageInstructions({ config }: UsageInstructionsProps) {
envVars.push("DISABLE_VKBASALT=1");
}
+ if (config.frameCap > 0) {
+ envVars.push(`DXVK_FRAME_RATE=${config.frameCap}`);
+ }
+
return envVars.length > 0 ? `${envVars.join(" ")} %command%` : "%command%";
};
diff --git a/src/hooks/useLsfgHooks.ts b/src/hooks/useLsfgHooks.ts
index ad04305..f765ce6 100644
--- a/src/hooks/useLsfgHooks.ts
+++ b/src/hooks/useLsfgHooks.ts
@@ -77,6 +77,7 @@ export function useLsfgConfig() {
const [perfMode, setPerfMode] = useState<boolean>(true);
const [immediateMode, setImmediateMode] = useState<boolean>(false);
const [disableVkbasalt, setDisableVkbasalt] = useState<boolean>(true);
+ const [frameCap, setFrameCap] = useState<number>(0);
const loadLsfgConfig = async () => {
try {
@@ -89,6 +90,7 @@ export function useLsfgConfig() {
setPerfMode(result.config.perf_mode);
setImmediateMode(result.config.immediate_mode);
setDisableVkbasalt(result.config.disable_vkbasalt);
+ setFrameCap(result.config.frame_cap);
console.log("Loaded lsfg config:", result.config);
} else {
console.log("lsfg config not available, using defaults:", result.error);
@@ -105,7 +107,8 @@ export function useLsfgConfig() {
newHdr: boolean,
newPerfMode: boolean,
newImmediateMode: boolean,
- newDisableVkbasalt: boolean
+ newDisableVkbasalt: boolean,
+ newFrameCap: number
): Promise<ConfigUpdateResult> => {
try {
const result = await updateLsfgConfig(
@@ -115,7 +118,8 @@ export function useLsfgConfig() {
newHdr,
newPerfMode,
newImmediateMode,
- newDisableVkbasalt
+ newDisableVkbasalt,
+ newFrameCap
);
if (!result.success) {
toaster.toast({
@@ -145,7 +149,8 @@ export function useLsfgConfig() {
hdr,
perfMode,
immediateMode,
- disableVkbasalt
+ disableVkbasalt,
+ frameCap
},
setters: {
setEnableLsfg,
@@ -154,7 +159,8 @@ export function useLsfgConfig() {
setHdr,
setPerfMode,
setImmediateMode,
- setDisableVkbasalt
+ setDisableVkbasalt,
+ setFrameCap
},
loadLsfgConfig,
updateConfig