mirror of
https://github.com/DarthAffe/StableDiffusion.NET.git
synced 2025-12-12 13:28:35 +00:00
updated sd.cpp
This commit is contained in:
parent
b147a7a63e
commit
1fbe0de7c6
@ -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);
|
||||
|
||||
@ -3,5 +3,6 @@
|
||||
public enum RngType
|
||||
{
|
||||
Standard,
|
||||
Cuda
|
||||
Cuda,
|
||||
Cpu
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -91,6 +91,8 @@ public sealed class DiffusionModelParameter
|
||||
/// </summary>
|
||||
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
|
||||
/// </summary>
|
||||
public string StackedIdEmbeddingsDirectory { get; set; } = string.Empty;
|
||||
|
||||
public string TensorTypeRules { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// path to full model
|
||||
/// </summary>
|
||||
|
||||
11
StableDiffusion.NET/Models/Parameter/EasyCache.cs
Normal file
11
StableDiffusion.NET/Models/Parameter/EasyCache.cs
Normal file
@ -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() { }
|
||||
}
|
||||
@ -59,6 +59,8 @@ public sealed class ImageGenerationParameter
|
||||
|
||||
public TilingParameter VaeTiling { get; } = new();
|
||||
|
||||
public EasyCache EasyCache { get; } = new();
|
||||
|
||||
#endregion
|
||||
|
||||
public static ImageGenerationParameter Create() => new();
|
||||
|
||||
@ -38,6 +38,8 @@ public sealed class VideoGenerationParameter
|
||||
|
||||
public float VaceStrength { get; set; }
|
||||
|
||||
public EasyCache EasyCache { get; } = new();
|
||||
|
||||
#endregion
|
||||
|
||||
public static VideoGenerationParameter Create() => new();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
@ -69,6 +76,14 @@ internal static class VideoGenerationParameterMarshaller
|
||||
_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
|
||||
{
|
||||
prompt = AnsiStringMarshaller.ConvertToUnmanaged(managed.Prompt),
|
||||
@ -87,6 +102,7 @@ internal static class VideoGenerationParameterMarshaller
|
||||
seed = managed.Seed,
|
||||
video_frames = managed.FrameCount,
|
||||
vace_strength = managed.VaceStrength,
|
||||
easycache = easyCache,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user