diff --git a/paint/sources/box_preferences.ts b/paint/sources/box_preferences.ts index b27854f0..ccf9accf 100644 --- a/paint/sources/box_preferences.ts +++ b/paint/sources/box_preferences.ts @@ -780,7 +780,11 @@ function box_preferences_neural_tab() { if (inference_handle.init) { inference_handle.i = config_raw.neural_backend; } + /// if arm_windows let inference_combo: string[] = [ "CPU", "Vulkan", "CUDA" ]; + /// else + let inference_combo: string[] = [ "CPU", "Vulkan" ]; + /// end ui_combo(inference_handle, inference_combo, tr("Inference Backend"), true); if (ui.is_hovered) { ui_tooltip(tr("Backend for neural node processing")); diff --git a/paint/sources/enums.ts b/paint/sources/enums.ts index 50938463..28c4f0bf 100644 --- a/paint/sources/enums.ts +++ b/paint/sources/enums.ts @@ -277,6 +277,7 @@ enum layout_size_t { enum neural_backend_t { CPU = 0, VULKAN = 1, + CUDA = 2, } enum preference_tab_t { diff --git a/paint/sources/neural_nodes/edit_image_node.ts b/paint/sources/neural_nodes/edit_image_node.ts index ed7f0c04..6475ee3d 100644 --- a/paint/sources/neural_nodes/edit_image_node.ts +++ b/paint/sources/neural_nodes/edit_image_node.ts @@ -35,7 +35,7 @@ function edit_image_node_button(node_id: i32) { } let argv: string[] = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "--diffusion-model", dir + "/Qwen-Image-Edit-2509-Q4_K_S.gguf", "--vae", @@ -50,6 +50,8 @@ function edit_image_node_button(node_id: i32) { "30", "-s", "-1", + "--cfg-scale", "2.5", + "--flow-shift", "3", "-W", "512", "-H", diff --git a/paint/sources/neural_nodes/image_to_depth_node.ts b/paint/sources/neural_nodes/image_to_depth_node.ts index f47aaa76..233f9632 100644 --- a/paint/sources/neural_nodes/image_to_depth_node.ts +++ b/paint/sources/neural_nodes/image_to_depth_node.ts @@ -22,7 +22,7 @@ function image_to_depth_node_button(node_id: i32) { iron_write_png(dir + path_sep + "input.png", gpu_get_texture_pixels(input), input.width, input.height, 0); let argv: string[] = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "-m", dir + "/marigold-depth-v1-1.q8_0.gguf", "--sampling-method", diff --git a/paint/sources/neural_nodes/image_to_normal_map_node.ts b/paint/sources/neural_nodes/image_to_normal_map_node.ts index 1f13e1ec..33714167 100644 --- a/paint/sources/neural_nodes/image_to_normal_map_node.ts +++ b/paint/sources/neural_nodes/image_to_normal_map_node.ts @@ -22,7 +22,7 @@ function image_to_normal_map_node_button(node_id: i32) { iron_write_png(dir + path_sep + "input.png", gpu_get_texture_pixels(input), input.width, input.height, 0); let argv: string[] = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "-m", dir + "/marigold-normals-v1-1.q8_0.gguf", "--sampling-method", diff --git a/paint/sources/neural_nodes/image_to_pbr_node.ts b/paint/sources/neural_nodes/image_to_pbr_node.ts index c76566f6..39c4ddf0 100644 --- a/paint/sources/neural_nodes/image_to_pbr_node.ts +++ b/paint/sources/neural_nodes/image_to_pbr_node.ts @@ -62,7 +62,7 @@ function image_to_pbr_node_run_sd(model: string, prompt: string, done: (tex: gpu let dir: string = neural_node_dir(); let argv: string[] = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "-m", dir + "/" + model, "--sampling-method", diff --git a/paint/sources/neural_nodes/inpaint_image_node.ts b/paint/sources/neural_nodes/inpaint_image_node.ts index 4302ced7..80437296 100644 --- a/paint/sources/neural_nodes/inpaint_image_node.ts +++ b/paint/sources/neural_nodes/inpaint_image_node.ts @@ -61,7 +61,7 @@ function inpaint_image_node_button(node_id: i32) { let argv: string[]; if (model == 0) { argv = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "-m", dir + "/v1-5-pruned-emaonly.safetensors", "--steps", @@ -89,7 +89,7 @@ function inpaint_image_node_button(node_id: i32) { } else { argv = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "--diffusion-model", dir + "/Qwen-Image-Edit-2509-Q4_K_S.gguf", "--vae", diff --git a/paint/sources/neural_nodes/neural_node.ts b/paint/sources/neural_nodes/neural_node.ts index 32d6001f..3ab95774 100644 --- a/paint/sources/neural_nodes/neural_node.ts +++ b/paint/sources/neural_nodes/neural_node.ts @@ -77,6 +77,24 @@ function neural_node_check_result(node: ui_node_t) { } } +function neural_node_sd_bin_ext(): string { + /// if arm_windows + return ".exe"; + /// else + return ""; + /// end +} + +function neural_node_sd_bin(): string { + if (config_raw.neural_backend == neural_backend_t.VULKAN) { + return "sd_vulkan" + neural_node_sd_bin_ext(); + } + if (config_raw.neural_backend == neural_backend_t.CUDA) { + return "sd_cuda" + neural_node_sd_bin_ext(); + } + return "sd_cpu" + neural_node_sd_bin_ext(); +} + function neural_node_dir(): string { let dir: string; if (path_is_protected()) { diff --git a/paint/sources/neural_nodes/outpaint_image_node.ts b/paint/sources/neural_nodes/outpaint_image_node.ts index 063b6278..36fdab11 100644 --- a/paint/sources/neural_nodes/outpaint_image_node.ts +++ b/paint/sources/neural_nodes/outpaint_image_node.ts @@ -57,7 +57,7 @@ function outpaint_image_node_button(node_id: i32) { let argv: string[]; if (model == 0) { argv = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "-m", dir + "/v1-5-pruned-emaonly.safetensors", "--offload-to-cpu", @@ -86,7 +86,7 @@ function outpaint_image_node_button(node_id: i32) { } else { argv = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "--diffusion-model", dir + "/Qwen-Image-Edit-2509-Q4_K_S.gguf", "--vae", diff --git a/paint/sources/neural_nodes/text_to_image_node.ts b/paint/sources/neural_nodes/text_to_image_node.ts index 3a0c940d..4081aed8 100644 --- a/paint/sources/neural_nodes/text_to_image_node.ts +++ b/paint/sources/neural_nodes/text_to_image_node.ts @@ -7,7 +7,7 @@ function text_to_image_node_init() { function text_to_image_node_sd_args(dir: string, prompt: string): string[] { let argv: string[] = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "-m", dir + "/v1-5-pruned-emaonly.safetensors", "--offload-to-cpu", @@ -30,7 +30,7 @@ function text_to_image_node_sd_args(dir: string, prompt: string): string[] { function text_to_image_node_qwen_args(dir: string, prompt: string): string[] { let argv: string[] = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "--diffusion-model", dir + "/Qwen_Image-Q4_K_S.gguf", "--vae", @@ -59,7 +59,7 @@ function text_to_image_node_qwen_args(dir: string, prompt: string): string[] { function text_to_image_node_wan_args(dir: string, prompt: string): string[] { let argv: string[] = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "-M", "vid_gen", "--diffusion-model", diff --git a/paint/sources/neural_nodes/tile_image_node.ts b/paint/sources/neural_nodes/tile_image_node.ts index a26c79d1..0ff6e062 100644 --- a/paint/sources/neural_nodes/tile_image_node.ts +++ b/paint/sources/neural_nodes/tile_image_node.ts @@ -64,7 +64,7 @@ function tile_image_node_button(node_id: i32) { let argv: string[]; if (model == 0) { argv = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "-m", dir + "/v1-5-pruned-emaonly.safetensors", "--offload-to-cpu", @@ -89,7 +89,7 @@ function tile_image_node_button(node_id: i32) { } else { argv = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "--diffusion-model", dir + "/Qwen-Image-Edit-2509-Q4_K_S.gguf", "--vae", diff --git a/paint/sources/neural_nodes/upscale_image_node.ts b/paint/sources/neural_nodes/upscale_image_node.ts index 732357b7..fecac967 100644 --- a/paint/sources/neural_nodes/upscale_image_node.ts +++ b/paint/sources/neural_nodes/upscale_image_node.ts @@ -8,8 +8,8 @@ function upscale_image_node_init() { function upscale_image_node_button(node_id: i32) { let canvas: ui_node_canvas_t = ui_nodes_get_canvas(true); let node: ui_node_t = ui_get_node(canvas.nodes, node_id); - let node_name: string = parser_material_node_name(node); - let h: ui_handle_t = ui_handle(node_name); + let node_name: string = parser_material_node_name(node); + let h: ui_handle_t = ui_handle(node_name); let models: string[] = [ "Real-ESRGAN" ]; let model: i32 = ui_combo(ui_nest(h, 0), models, tr("Model")); @@ -27,8 +27,10 @@ function upscale_image_node_button(node_id: i32) { let dir: string = neural_node_dir(); iron_write_png(dir + path_sep + "input.png", input_buf, input.width, input.height, 0); - let argv: string[] = - [ dir + "/sd_vulkan", "-M", "upscale", "--upscale-model", dir + "/RealESRGAN_x4plus.pth", "-i", dir + "/input.png", "-o", dir + "/output.png", null ]; + let argv: string[] = [ + dir + "/" + neural_node_sd_bin(), "-M", "upscale", "--upscale-model", dir + "/RealESRGAN_x4plus.pth", "-i", dir + "/input.png", "-o", + dir + "/output.png", null + ]; iron_exec_async(argv[0], argv.buffer); sys_notify_on_update(neural_node_check_result, node); } diff --git a/paint/sources/neural_nodes/vary_image_node.ts b/paint/sources/neural_nodes/vary_image_node.ts index c13af53b..eeabe82c 100644 --- a/paint/sources/neural_nodes/vary_image_node.ts +++ b/paint/sources/neural_nodes/vary_image_node.ts @@ -50,7 +50,7 @@ function vary_image_node_button(node_id: i32) { let argv: string[]; if (model == 0) { argv = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "-m", dir + "/v1-5-pruned-emaonly.safetensors", "--offload-to-cpu", @@ -79,7 +79,7 @@ function vary_image_node_button(node_id: i32) { } else { argv = [ - dir + "/sd_vulkan", + dir + "/" + neural_node_sd_bin(), "--diffusion-model", dir + "/Qwen-Image-Edit-2509-Q4_K_S.gguf", "--vae",