diff --git a/Header/stable-diffusion.h b/Header/stable-diffusion.h index 671026b..8e9104d 100644 --- a/Header/stable-diffusion.h +++ b/Header/stable-diffusion.h @@ -31,37 +31,39 @@ extern "C" { enum rng_type_t { STD_DEFAULT_RNG, CUDA_RNG, + CPU_RNG, RNG_TYPE_COUNT }; enum sample_method_t { - SAMPLE_METHOD_DEFAULT, - EULER, - HEUN, - DPM2, - DPMPP2S_A, - DPMPP2M, - DPMPP2Mv2, - IPNDM, - IPNDM_V, - LCM, - DDIM_TRAILING, - TCD, - EULER_A, + EULER_SAMPLE_METHOD, + EULER_A_SAMPLE_METHOD, + HEUN_SAMPLE_METHOD, + DPM2_SAMPLE_METHOD, + DPMPP2S_A_SAMPLE_METHOD, + DPMPP2M_SAMPLE_METHOD, + DPMPP2Mv2_SAMPLE_METHOD, + IPNDM_SAMPLE_METHOD, + IPNDM_V_SAMPLE_METHOD, + LCM_SAMPLE_METHOD, + DDIM_TRAILING_SAMPLE_METHOD, + TCD_SAMPLE_METHOD, + SAMPLE_METHOD_COUNT }; enum scheduler_t { - DEFAULT, - DISCRETE, - KARRAS, - EXPONENTIAL, - AYS, - GITS, - SGM_UNIFORM, - SIMPLE, - SMOOTHSTEP, - SCHEDULE_COUNT + + DISCRETE_SCHEDULER, + KARRAS_SCHEDULER, + EXPONENTIAL_SCHEDULER, + AYS_SCHEDULER, + GITS_SCHEDULER, + SGM_UNIFORM_SCHEDULER, + SIMPLE_SCHEDULER, + SMOOTHSTEP_SCHEDULER, + LCM_SCHEDULER, + SCHEDULER_COUNT }; enum prediction_t { @@ -166,11 +168,13 @@ typedef struct { const char* lora_model_dir; const char* embedding_dir; const char* photo_maker_path; + const char* tensor_type_rules; bool vae_decode_only; bool free_params_immediately; int n_threads; enum sd_type_t wtype; enum rng_type_t rng_type; + enum rng_type_t sampler_rng_type; enum prediction_t prediction; enum lora_apply_mode_t lora_apply_mode; bool offload_params_to_cpu; @@ -226,6 +230,13 @@ typedef struct { float style_strength; } sd_pm_params_t; // photo maker +typedef struct { + bool enabled; + float reuse_threshold; + float start_percent; + float end_percent; +} sd_easycache_params_t; + typedef struct { const char* prompt; const char* negative_prompt; @@ -246,6 +257,7 @@ typedef struct { float control_strength; sd_pm_params_t pm_params; sd_tiling_params_t vae_tiling_params; + sd_easycache_params_t easycache; } sd_img_gen_params_t; typedef struct { @@ -265,6 +277,7 @@ typedef struct { int64_t seed; int video_frames; float vace_strength; + sd_easycache_params_t easycache; } sd_vid_gen_params_t; typedef struct sd_ctx_t sd_ctx_t; @@ -285,8 +298,8 @@ SD_API const char* sd_rng_type_name(enum rng_type_t rng_type); SD_API enum rng_type_t str_to_rng_type(const char* str); SD_API const char* sd_sample_method_name(enum sample_method_t sample_method); SD_API enum sample_method_t str_to_sample_method(const char* str); -SD_API const char* sd_schedule_name(enum scheduler_t scheduler); -SD_API enum scheduler_t str_to_schedule(const char* str); +SD_API const char* sd_scheduler_name(enum scheduler_t scheduler); +SD_API enum scheduler_t str_to_scheduler(const char* str); SD_API const char* sd_prediction_name(enum prediction_t prediction); SD_API enum prediction_t str_to_prediction(const char* str); SD_API const char* sd_preview_name(enum preview_t preview); @@ -294,16 +307,21 @@ SD_API enum preview_t str_to_preview(const char* str); SD_API const char* sd_lora_apply_mode_name(enum lora_apply_mode_t mode); SD_API enum lora_apply_mode_t str_to_lora_apply_mode(const char* str); +SD_API void sd_easycache_params_init(sd_easycache_params_t* easycache_params); + SD_API void sd_ctx_params_init(sd_ctx_params_t* sd_ctx_params); SD_API char* sd_ctx_params_to_str(const sd_ctx_params_t* sd_ctx_params); SD_API sd_ctx_t* new_sd_ctx(const sd_ctx_params_t* sd_ctx_params); SD_API void free_sd_ctx(sd_ctx_t* sd_ctx); -SD_API enum sample_method_t sd_get_default_sample_method(const sd_ctx_t* sd_ctx); + SD_API void sd_sample_params_init(sd_sample_params_t* sample_params); SD_API char* sd_sample_params_to_str(const sd_sample_params_t* sample_params); +SD_API enum sample_method_t sd_get_default_sample_method(const sd_ctx_t* sd_ctx); +SD_API enum scheduler_t sd_get_default_scheduler(const sd_ctx_t* sd_ctx); + SD_API void sd_img_gen_params_init(sd_img_gen_params_t* sd_img_gen_params); SD_API char* sd_img_gen_params_to_str(const sd_img_gen_params_t* sd_img_gen_params); SD_API sd_image_t* generate_image(sd_ctx_t* sd_ctx, const sd_img_gen_params_t* sd_img_gen_params); @@ -342,4 +360,4 @@ SD_API bool preprocess_canny(sd_image_t image, } #endif -#endif // __STABLE_DIFFUSION_H__ \ No newline at end of file +#endif // __STABLE_DIFFUSION_H__ diff --git a/StableDiffusion.NET/Enums/RngType.cs b/StableDiffusion.NET/Enums/RngType.cs index a00d866..f668485 100644 --- a/StableDiffusion.NET/Enums/RngType.cs +++ b/StableDiffusion.NET/Enums/RngType.cs @@ -3,5 +3,6 @@ public enum RngType { Standard, - Cuda + Cuda, + Cpu } \ No newline at end of file diff --git a/StableDiffusion.NET/Enums/Sampler.cs b/StableDiffusion.NET/Enums/Sampler.cs index 4bac7f7..3861bcd 100644 --- a/StableDiffusion.NET/Enums/Sampler.cs +++ b/StableDiffusion.NET/Enums/Sampler.cs @@ -2,8 +2,8 @@ public enum Sampler { - Default, Euler, + Euler_A, Heun, DPM2, DPMPP2SA, @@ -14,5 +14,5 @@ public enum Sampler LCM, DDIM_Trailing, TCD, - Euler_A, + Default } \ No newline at end of file diff --git a/StableDiffusion.NET/Enums/Schedule.cs b/StableDiffusion.NET/Enums/Schedule.cs index 768967b..32a470b 100644 --- a/StableDiffusion.NET/Enums/Schedule.cs +++ b/StableDiffusion.NET/Enums/Schedule.cs @@ -2,7 +2,6 @@ public enum Scheduler { - Default, Discrete, Karras, Exponential, @@ -10,5 +9,7 @@ public enum Scheduler GITS, SGM_Uniform, Simple, - Smoothstep + Smoothstep, + LCM, + Default } \ No newline at end of file diff --git a/StableDiffusion.NET/Models/Parameter/DiffusionModelParameter.cs b/StableDiffusion.NET/Models/Parameter/DiffusionModelParameter.cs index e1b2d7b..114513f 100644 --- a/StableDiffusion.NET/Models/Parameter/DiffusionModelParameter.cs +++ b/StableDiffusion.NET/Models/Parameter/DiffusionModelParameter.cs @@ -91,6 +91,8 @@ public sealed class DiffusionModelParameter /// public RngType RngType { get; set; } = RngType.Standard; + public RngType SamplerRngType { get; set; } = RngType.Standard; + public Prediction Prediction { get; set; } = Prediction.Default; public LoraApplyMode LoraApplyMode { get; set; } = LoraApplyMode.Auto; @@ -110,6 +112,8 @@ public sealed class DiffusionModelParameter /// public string StackedIdEmbeddingsDirectory { get; set; } = string.Empty; + public string TensorTypeRules { get; set; } = string.Empty; + /// /// path to full model /// diff --git a/StableDiffusion.NET/Models/Parameter/EasyCache.cs b/StableDiffusion.NET/Models/Parameter/EasyCache.cs new file mode 100644 index 0000000..ad0455d --- /dev/null +++ b/StableDiffusion.NET/Models/Parameter/EasyCache.cs @@ -0,0 +1,11 @@ +namespace StableDiffusion.NET; + +public sealed class EasyCache +{ + public bool IsEnabled { get; set; } + public float ReuseThreshold { get; set; } + public float StartPercent { get; set; } + public float EndPercent { get; set; } + + internal EasyCache() { } +} \ No newline at end of file diff --git a/StableDiffusion.NET/Models/Parameter/ImageGenerationParameter.cs b/StableDiffusion.NET/Models/Parameter/ImageGenerationParameter.cs index c65d8df..8cfcd41 100644 --- a/StableDiffusion.NET/Models/Parameter/ImageGenerationParameter.cs +++ b/StableDiffusion.NET/Models/Parameter/ImageGenerationParameter.cs @@ -59,6 +59,8 @@ public sealed class ImageGenerationParameter public TilingParameter VaeTiling { get; } = new(); + public EasyCache EasyCache { get; } = new(); + #endregion public static ImageGenerationParameter Create() => new(); diff --git a/StableDiffusion.NET/Models/Parameter/VideoGenerationParameter.cs b/StableDiffusion.NET/Models/Parameter/VideoGenerationParameter.cs index 22f6224..b6de6af 100644 --- a/StableDiffusion.NET/Models/Parameter/VideoGenerationParameter.cs +++ b/StableDiffusion.NET/Models/Parameter/VideoGenerationParameter.cs @@ -38,6 +38,8 @@ public sealed class VideoGenerationParameter public float VaceStrength { get; set; } + public EasyCache EasyCache { get; } = new(); + #endregion public static VideoGenerationParameter Create() => new(); diff --git a/StableDiffusion.NET/Native/Marshaller/DiffusionModelParameterMarshaller.cs b/StableDiffusion.NET/Native/Marshaller/DiffusionModelParameterMarshaller.cs index e892316..f6fabc7 100644 --- a/StableDiffusion.NET/Native/Marshaller/DiffusionModelParameterMarshaller.cs +++ b/StableDiffusion.NET/Native/Marshaller/DiffusionModelParameterMarshaller.cs @@ -24,11 +24,13 @@ internal static unsafe class DiffusionModelParameterMarshaller lora_model_dir = AnsiStringMarshaller.ConvertToUnmanaged(managed.LoraModelDirectory), embedding_dir = AnsiStringMarshaller.ConvertToUnmanaged(managed.EmbeddingsDirectory), photo_maker_path = AnsiStringMarshaller.ConvertToUnmanaged(managed.StackedIdEmbeddingsDirectory), + tensor_type_rules = AnsiStringMarshaller.ConvertToUnmanaged(managed.TensorTypeRules), vae_decode_only = (sbyte)(managed.VaeDecodeOnly ? 1 : 0), free_params_immediately = (sbyte)(managed.FreeParamsImmediately ? 1 : 0), n_threads = managed.ThreadCount, wtype = managed.Quantization, rng_type = managed.RngType, + sampler_rng_type = managed.SamplerRngType, prediction = managed.Prediction, lora_apply_mode = managed.LoraApplyMode, offload_params_to_cpu = (sbyte)(managed.OffloadParamsToCPU ? 1 : 0), @@ -64,11 +66,13 @@ internal static unsafe class DiffusionModelParameterMarshaller LoraModelDirectory = AnsiStringMarshaller.ConvertToManaged(unmanaged.lora_model_dir) ?? string.Empty, EmbeddingsDirectory = AnsiStringMarshaller.ConvertToManaged(unmanaged.embedding_dir) ?? string.Empty, StackedIdEmbeddingsDirectory = AnsiStringMarshaller.ConvertToManaged(unmanaged.photo_maker_path) ?? string.Empty, + TensorTypeRules = AnsiStringMarshaller.ConvertToManaged(unmanaged.tensor_type_rules) ?? string.Empty, VaeDecodeOnly = unmanaged.vae_decode_only == 1, FreeParamsImmediately = unmanaged.free_params_immediately == 1, ThreadCount = unmanaged.n_threads, Quantization = unmanaged.wtype, RngType = unmanaged.rng_type, + SamplerRngType = unmanaged.sampler_rng_type, Prediction = unmanaged.prediction, LoraApplyMode = unmanaged.lora_apply_mode, OffloadParamsToCPU = unmanaged.offload_params_to_cpu == 1, @@ -101,5 +105,6 @@ internal static unsafe class DiffusionModelParameterMarshaller AnsiStringMarshaller.Free(unmanaged.lora_model_dir); AnsiStringMarshaller.Free(unmanaged.embedding_dir); AnsiStringMarshaller.Free(unmanaged.photo_maker_path); + AnsiStringMarshaller.Free(unmanaged.tensor_type_rules); } } \ No newline at end of file diff --git a/StableDiffusion.NET/Native/Marshaller/ImageGenerationParameterMarshaller.cs b/StableDiffusion.NET/Native/Marshaller/ImageGenerationParameterMarshaller.cs index 2dd1ee9..4fbe0d4 100644 --- a/StableDiffusion.NET/Native/Marshaller/ImageGenerationParameterMarshaller.cs +++ b/StableDiffusion.NET/Native/Marshaller/ImageGenerationParameterMarshaller.cs @@ -46,6 +46,13 @@ internal static class ImageGenerationParameterMarshaller TargetOverlap = unmanaged.vae_tiling_params.target_overlap, RelSizeX = unmanaged.vae_tiling_params.rel_size_x, RelSizeY = unmanaged.vae_tiling_params.rel_size_y + }, + EasyCache = + { + IsEnabled = unmanaged.easycache.enabled == 1, + ReuseThreshold = unmanaged.easycache.reuse_threshold, + StartPercent = unmanaged.easycache.start_percent, + EndPercent = unmanaged.easycache.end_percent } }; @@ -126,6 +133,14 @@ internal static class ImageGenerationParameterMarshaller rel_size_y = managed.VaeTiling.RelSizeY }; + Native.Types.sd_easycache_params_t easyCache = new() + { + enabled = (sbyte)(managed.EasyCache.IsEnabled ? 1 : 0), + reuse_threshold = managed.EasyCache.ReuseThreshold, + start_percent = managed.EasyCache.StartPercent, + end_percent = managed.EasyCache.EndPercent, + }; + _imgGenParams = new Native.Types.sd_img_gen_params_t { prompt = AnsiStringMarshaller.ConvertToUnmanaged(managed.Prompt), @@ -145,7 +160,8 @@ internal static class ImageGenerationParameterMarshaller control_image = _controlNetImage, control_strength = managed.ControlNet.Strength, pm_params = photoMakerParams, - vae_tiling_params = tilingParams + vae_tiling_params = tilingParams, + easycache = easyCache }; } diff --git a/StableDiffusion.NET/Native/Marshaller/VideoGenerationParameterMarshaller.cs b/StableDiffusion.NET/Native/Marshaller/VideoGenerationParameterMarshaller.cs index 9af8e8f..c6f77f4 100644 --- a/StableDiffusion.NET/Native/Marshaller/VideoGenerationParameterMarshaller.cs +++ b/StableDiffusion.NET/Native/Marshaller/VideoGenerationParameterMarshaller.cs @@ -27,7 +27,14 @@ internal static class VideoGenerationParameterMarshaller Strength = unmanaged.strength, Seed = unmanaged.seed, FrameCount = unmanaged.video_frames, - VaceStrength = unmanaged.vace_strength + VaceStrength = unmanaged.vace_strength, + EasyCache = + { + IsEnabled = unmanaged.easycache.enabled == 1, + ReuseThreshold = unmanaged.easycache.reuse_threshold, + StartPercent = unmanaged.easycache.start_percent, + EndPercent = unmanaged.easycache.end_percent + } }; return parameter; @@ -68,6 +75,14 @@ internal static class VideoGenerationParameterMarshaller _initImage = managed.InitImage?.ToSdImage() ?? new Native.Types.sd_image_t(); _endImage = managed.EndImage?.ToSdImage() ?? new Native.Types.sd_image_t(); _controlFrames = managed.ControlFrames == null ? null : managed.ControlFrames.ToSdImage(); + + Native.Types.sd_easycache_params_t easyCache = new() + { + enabled = (sbyte)(managed.EasyCache.IsEnabled ? 1 : 0), + reuse_threshold = managed.EasyCache.ReuseThreshold, + start_percent = managed.EasyCache.StartPercent, + end_percent = managed.EasyCache.EndPercent, + }; _vidGenParams = new Native.Types.sd_vid_gen_params_t { @@ -87,6 +102,7 @@ internal static class VideoGenerationParameterMarshaller seed = managed.Seed, video_frames = managed.FrameCount, vace_strength = managed.VaceStrength, + easycache = easyCache, }; } diff --git a/StableDiffusion.NET/Native/Native.cs b/StableDiffusion.NET/Native/Native.cs index 32c6620..6e3ec63 100644 --- a/StableDiffusion.NET/Native/Native.cs +++ b/StableDiffusion.NET/Native/Native.cs @@ -25,6 +25,7 @@ using sd_type_t = Quantization; using sd_vid_gen_params_t = VideoGenerationParameter; using lora_apply_mode_t = LoraApplyMode; using preview_t = Preview; +using sd_easycache_params_t = Native.Types.sd_easycache_params_t; using size_t = nuint; using uint32_t = uint; using uint8_t = byte; @@ -69,11 +70,13 @@ internal unsafe partial class Native public byte* lora_model_dir; public byte* embedding_dir; public byte* photo_maker_path; + public byte* tensor_type_rules; public sbyte vae_decode_only; public sbyte free_params_immediately; public int n_threads; public sd_type_t wtype; public rng_type_t rng_type; + public rng_type_t sampler_rng_type; public prediction_t prediction; public lora_apply_mode_t lora_apply_mode; public sbyte offload_params_to_cpu; @@ -131,6 +134,7 @@ internal unsafe partial class Native public int shifted_timestep; } + [StructLayout(LayoutKind.Sequential)] internal struct sd_pm_params_t { public sd_image_t* id_images; @@ -139,6 +143,15 @@ internal unsafe partial class Native public float style_strength; } + [StructLayout(LayoutKind.Sequential)] + internal struct sd_easycache_params_t + { + public sbyte enabled; + public float reuse_threshold; + public float start_percent; + public float end_percent; + } + [StructLayout(LayoutKind.Sequential)] internal struct sd_img_gen_params_t { @@ -161,6 +174,7 @@ internal unsafe partial class Native public float control_strength; public sd_pm_params_t pm_params; public sd_tiling_params_t vae_tiling_params; + public sd_easycache_params_t easycache; } [StructLayout(LayoutKind.Sequential)] @@ -182,6 +196,7 @@ internal unsafe partial class Native public int64_t seed; public int video_frames; public float vace_strength; + public sd_easycache_params_t easycache; } internal struct sd_ctx_t; @@ -237,12 +252,12 @@ internal unsafe partial class Native [LibraryImport(LIB_NAME, EntryPoint = "str_to_sample_method")] internal static partial sample_method_t str_to_sample_method([MarshalAs(UnmanagedType.LPStr)] string str); - [LibraryImport(LIB_NAME, EntryPoint = "sd_schedule_name")] + [LibraryImport(LIB_NAME, EntryPoint = "sd_scheduler_name")] [return: MarshalAs(UnmanagedType.LPStr)] - internal static partial string sd_schedule_name(scheduler_t schedule); + internal static partial string sd_scheduler_name(scheduler_t schedule); - [LibraryImport(LIB_NAME, EntryPoint = "str_to_schedule")] - internal static partial scheduler_t str_to_schedule([MarshalAs(UnmanagedType.LPStr)] string str); + [LibraryImport(LIB_NAME, EntryPoint = "str_to_scheduler")] + internal static partial scheduler_t str_to_scheduler([MarshalAs(UnmanagedType.LPStr)] string str); [LibraryImport(LIB_NAME, EntryPoint = "sd_prediction_name")] [return: MarshalAs(UnmanagedType.LPStr)] @@ -265,6 +280,9 @@ internal unsafe partial class Native [LibraryImport(LIB_NAME, EntryPoint = "str_to_lora_apply_mode")] internal static partial lora_apply_mode_t str_to_lora_apply_mode([MarshalAs(UnmanagedType.LPStr)] string str); + [LibraryImport(LIB_NAME, EntryPoint = "sd_easycache_params_init")] + internal static partial void sd_easycache_params_init(ref sd_easycache_params_t easycache_params); + // [LibraryImport(LIB_NAME, EntryPoint = "sd_ctx_params_init")] @@ -282,9 +300,6 @@ internal unsafe partial class Native [LibraryImport(LIB_NAME, EntryPoint = "free_sd_ctx")] internal static partial void free_sd_ctx(sd_ctx_t* sd_ctx); - [LibraryImport(LIB_NAME, EntryPoint = "sd_get_default_sample_method")] - internal static partial sample_method_t sd_get_default_sample_method(sd_ctx_t* sd_ctx); - // [LibraryImport(LIB_NAME, EntryPoint = "sd_sample_params_init")] @@ -301,6 +316,12 @@ internal unsafe partial class Native [return: MarshalAs(UnmanagedType.LPStr)] internal static partial string sd_img_gen_params_to_str([MarshalUsing(typeof(ImageGenerationParameterMarshaller))] in sd_img_gen_params_t sd_img_gen_params); + [LibraryImport(LIB_NAME, EntryPoint = "sd_get_default_sample_method")] + internal static partial sample_method_t sd_get_default_sample_method(sd_ctx_t* sd_ctx); + + [LibraryImport(LIB_NAME, EntryPoint = "sd_get_default_scheduler")] + internal static partial scheduler_t sd_get_default_scheduler(sd_ctx_t* sd_ctx); + [LibraryImport(LIB_NAME, EntryPoint = "generate_image")] internal static partial sd_image_t* generate_image(sd_ctx_t* sd_ctx, [MarshalUsing(typeof(ImageGenerationParameterMarshaller))] in sd_img_gen_params_t sd_img_gen_params);