Skip to content

Commit 76618fe

Browse files
Mary Hippmaryhipp
authored andcommitted
feat(ui): separate upscaling settings so that tab does not inherit from main generation settings
1 parent b51312f commit 76618fe

File tree

5 files changed

+121
-3
lines changed

5 files changed

+121
-3
lines changed

invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ export type ParamsState = {
4949
optimizedDenoisingEnabled: boolean;
5050
iterations: number;
5151
scheduler: ParameterScheduler;
52+
upscaleScheduler: ParameterScheduler;
53+
upscaleCfgScale: ParameterCFGScale;
5254
seed: ParameterSeed;
5355
shouldRandomizeSeed: boolean;
5456
steps: ParameterSteps;
@@ -96,6 +98,8 @@ const initialState: ParamsState = {
9698
optimizedDenoisingEnabled: true,
9799
iterations: 1,
98100
scheduler: 'dpmpp_3m_k',
101+
upscaleScheduler: 'dpmpp_3m_k',
102+
upscaleCfgScale: 7.5,
99103
seed: 0,
100104
shouldRandomizeSeed: true,
101105
steps: 30,
@@ -139,6 +143,9 @@ export const paramsSlice = createSlice({
139143
setCfgScale: (state, action: PayloadAction<ParameterCFGScale>) => {
140144
state.cfgScale = action.payload;
141145
},
146+
setUpscaleCfgScale: (state, action: PayloadAction<ParameterCFGScale>) => {
147+
state.upscaleCfgScale = action.payload;
148+
},
142149
setGuidance: (state, action: PayloadAction<ParameterGuidance>) => {
143150
state.guidance = action.payload;
144151
},
@@ -148,6 +155,10 @@ export const paramsSlice = createSlice({
148155
setScheduler: (state, action: PayloadAction<ParameterScheduler>) => {
149156
state.scheduler = action.payload;
150157
},
158+
setUpscaleScheduler: (state, action: PayloadAction<ParameterScheduler>) => {
159+
state.upscaleScheduler = action.payload;
160+
},
161+
151162
setSeed: (state, action: PayloadAction<number>) => {
152163
state.seed = action.payload;
153164
state.shouldRandomizeSeed = false;
@@ -315,6 +326,8 @@ export const {
315326
setCfgRescaleMultiplier,
316327
setGuidance,
317328
setScheduler,
329+
setUpscaleScheduler,
330+
setUpscaleCfgScale,
318331
setSeed,
319332
setImg2imgStrength,
320333
setOptimizedDenoisingEnabled,
@@ -409,6 +422,9 @@ export const selectVAEPrecision = createParamsSelector((params) => params.vaePre
409422
export const selectIterations = createParamsSelector((params) => params.iterations);
410423
export const selectShouldUseCPUNoise = createParamsSelector((params) => params.shouldUseCpuNoise);
411424

425+
export const selectUpscaleScheduler = createParamsSelector((params) => params.upscaleScheduler);
426+
export const selectUpscaleCfgScale = createParamsSelector((params) => params.upscaleCfgScale);
427+
412428
export const selectRefinerCFGScale = createParamsSelector((params) => params.refinerCFGScale);
413429
export const selectRefinerModel = createParamsSelector((params) => params.refinerModel);
414430
export const selectIsRefinerModelSelected = createParamsSelector((params) => Boolean(params.refinerModel));

invokeai/frontend/web/src/features/nodes/util/graph/buildMultidiffusionUpscaleGraph.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,15 @@ import { getBoardField, getPresetModifiedPrompts } from './graphBuilderUtils';
1313
export const buildMultidiffusionUpscaleGraph = async (
1414
state: RootState
1515
): Promise<{ g: Graph; noise: Invocation<'noise'>; posCond: Invocation<'compel' | 'sdxl_compel_prompt'> }> => {
16-
const { model, cfgScale: cfg_scale, scheduler, steps, vaePrecision, seed, vae } = state.params;
16+
const {
17+
model,
18+
upscaleCfgScale: cfg_scale,
19+
upscaleScheduler: scheduler,
20+
steps,
21+
vaePrecision,
22+
seed,
23+
vae,
24+
} = state.params;
1725
const { upscaleModel, upscaleInitialImage, structure, creativity, tileControlnetModel, scale } = state.upscale;
1826

1927
assert(model, 'No model found in state');
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { CompositeNumberInput, CompositeSlider, FormControl, FormLabel } from '@invoke-ai/ui-library';
2+
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
3+
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
4+
import { selectUpscaleCfgScale, setUpscaleCfgScale } from 'features/controlLayers/store/paramsSlice';
5+
import { selectCFGScaleConfig } from 'features/system/store/configSlice';
6+
import { memo, useCallback, useMemo } from 'react';
7+
import { useTranslation } from 'react-i18next';
8+
9+
const ParamUpscaleCFGScale = () => {
10+
const cfgScale = useAppSelector(selectUpscaleCfgScale);
11+
const config = useAppSelector(selectCFGScaleConfig);
12+
const dispatch = useAppDispatch();
13+
const { t } = useTranslation();
14+
const marks = useMemo(
15+
() => [config.sliderMin, Math.floor(config.sliderMax / 2), config.sliderMax],
16+
[config.sliderMax, config.sliderMin]
17+
);
18+
const onChange = useCallback((v: number) => dispatch(setUpscaleCfgScale(v)), [dispatch]);
19+
20+
return (
21+
<FormControl>
22+
<InformationalPopover feature="paramCFGScale">
23+
<FormLabel>{t('parameters.cfgScale')}</FormLabel>
24+
</InformationalPopover>
25+
<CompositeSlider
26+
value={cfgScale}
27+
defaultValue={config.initial}
28+
min={config.sliderMin}
29+
max={config.sliderMax}
30+
step={config.coarseStep}
31+
fineStep={config.fineStep}
32+
onChange={onChange}
33+
marks={marks}
34+
/>
35+
<CompositeNumberInput
36+
value={cfgScale}
37+
defaultValue={config.initial}
38+
min={config.numberInputMin}
39+
max={config.numberInputMax}
40+
step={config.coarseStep}
41+
fineStep={config.fineStep}
42+
onChange={onChange}
43+
/>
44+
</FormControl>
45+
);
46+
};
47+
48+
export default memo(ParamUpscaleCFGScale);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import type { ComboboxOnChange } from '@invoke-ai/ui-library';
2+
import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library';
3+
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
4+
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
5+
import { selectUpscaleScheduler, setUpscaleScheduler } from 'features/controlLayers/store/paramsSlice';
6+
import { SCHEDULER_OPTIONS } from 'features/parameters/types/constants';
7+
import { isParameterScheduler } from 'features/parameters/types/parameterSchemas';
8+
import { memo, useCallback, useMemo } from 'react';
9+
import { useTranslation } from 'react-i18next';
10+
11+
const ParamUpscaleScheduler = () => {
12+
const dispatch = useAppDispatch();
13+
const { t } = useTranslation();
14+
const scheduler = useAppSelector(selectUpscaleScheduler);
15+
16+
const onChange = useCallback<ComboboxOnChange>(
17+
(v) => {
18+
if (!isParameterScheduler(v?.value)) {
19+
return;
20+
}
21+
dispatch(setUpscaleScheduler(v.value));
22+
},
23+
[dispatch]
24+
);
25+
26+
const value = useMemo(() => SCHEDULER_OPTIONS.find((o) => o.value === scheduler), [scheduler]);
27+
28+
return (
29+
<FormControl>
30+
<InformationalPopover feature="paramScheduler">
31+
<FormLabel>{t('parameters.scheduler')}</FormLabel>
32+
</InformationalPopover>
33+
<Combobox value={value} options={SCHEDULER_OPTIONS} onChange={onChange} />
34+
</FormControl>
35+
);
36+
};
37+
38+
export default memo(ParamUpscaleScheduler);

invokeai/frontend/web/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import ParamSteps from 'features/parameters/components/Core/ParamSteps';
1414
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
1515
import ParamMainModelSelect from 'features/parameters/components/MainModel/ParamMainModelSelect';
1616
import { UseDefaultSettingsButton } from 'features/parameters/components/MainModel/UseDefaultSettingsButton';
17+
import ParamUpscaleCFGScale from 'features/parameters/components/Upscale/ParamUpscaleCFGScale';
18+
import ParamUpscaleScheduler from 'features/parameters/components/Upscale/ParamUpscaleScheduler';
1719
import { useExpanderToggle } from 'features/settingsAccordions/hooks/useExpanderToggle';
1820
import { useStandaloneAccordionToggle } from 'features/settingsAccordions/hooks/useStandaloneAccordionToggle';
1921
import { selectActiveTab } from 'features/ui/store/uiSelectors';
@@ -31,6 +33,9 @@ export const GenerationSettingsAccordion = memo(() => {
3133
const activeTabName = useAppSelector(selectActiveTab);
3234
const isFLUX = useAppSelector(selectIsFLUX);
3335
const isSD3 = useAppSelector(selectIsSD3);
36+
const isUpscaling = useMemo(() => {
37+
return activeTabName === 'upscaling';
38+
}, [activeTabName]);
3439
const selectBadges = useMemo(
3540
() =>
3641
createMemoizedSelector(selectLoRAsSlice, (loras) => {
@@ -75,9 +80,12 @@ export const GenerationSettingsAccordion = memo(() => {
7580
<Expander label={t('accordions.advanced.options')} isOpen={isOpenExpander} onToggle={onToggleExpander}>
7681
<Flex gap={4} flexDir="column" pb={4}>
7782
<FormControlGroup formLabelProps={formLabelProps}>
78-
{!isFLUX && !isSD3 && <ParamScheduler />}
83+
{!isFLUX && !isSD3 && !isUpscaling && <ParamScheduler />}
84+
{isUpscaling && <ParamUpscaleScheduler />}
7985
<ParamSteps />
80-
{isFLUX ? <ParamGuidance /> : <ParamCFGScale />}
86+
{isFLUX && <ParamGuidance />}
87+
{isUpscaling && <ParamUpscaleCFGScale />}
88+
{!isFLUX && !isUpscaling && <ParamCFGScale />}
8189
</FormControlGroup>
8290
</Flex>
8391
</Expander>

0 commit comments

Comments
 (0)