mirror of
https://github.com/DarthAffe/StableDiffusion.NET.git
synced 2026-02-04 02:43:34 +00:00
Merge pull request #70 from DarthAffe/v5
Updated sd.cpp to b87fe13; removed deprecated APIs; changed defaults to be closer to sd.cpp
This commit is contained in:
commit
9fd65e14ae
@ -60,6 +60,7 @@ enum scheduler_t {
|
||||
SGM_UNIFORM_SCHEDULER,
|
||||
SIMPLE_SCHEDULER,
|
||||
SMOOTHSTEP_SCHEDULER,
|
||||
KL_OPTIMAL_SCHEDULER,
|
||||
LCM_SCHEDULER,
|
||||
SCHEDULER_COUNT
|
||||
};
|
||||
@ -168,7 +169,6 @@ typedef struct {
|
||||
const char* vae_path;
|
||||
const char* taesd_path;
|
||||
const char* control_net_path;
|
||||
const char* lora_model_dir;
|
||||
const sd_embedding_t* embeddings;
|
||||
uint32_t embedding_count;
|
||||
const char* photo_maker_path;
|
||||
@ -182,6 +182,7 @@ typedef struct {
|
||||
enum prediction_t prediction;
|
||||
enum lora_apply_mode_t lora_apply_mode;
|
||||
bool offload_params_to_cpu;
|
||||
bool enable_mmap;
|
||||
bool keep_clip_on_cpu;
|
||||
bool keep_control_net_on_cpu;
|
||||
bool keep_vae_on_cpu;
|
||||
@ -189,10 +190,13 @@ typedef struct {
|
||||
bool tae_preview_only;
|
||||
bool diffusion_conv_direct;
|
||||
bool vae_conv_direct;
|
||||
bool circular_x;
|
||||
bool circular_y;
|
||||
bool force_sdxl_vae_conv_scale;
|
||||
bool chroma_use_dit_mask;
|
||||
bool chroma_use_t5_mask;
|
||||
int chroma_t5_mask_pad;
|
||||
bool qwen_image_zero_cond_t;
|
||||
float flow_shift;
|
||||
} sd_ctx_params_t;
|
||||
|
||||
@ -236,12 +240,34 @@ typedef struct {
|
||||
float style_strength;
|
||||
} sd_pm_params_t; // photo maker
|
||||
|
||||
enum sd_cache_mode_t {
|
||||
SD_CACHE_DISABLED = 0,
|
||||
SD_CACHE_EASYCACHE,
|
||||
SD_CACHE_UCACHE,
|
||||
SD_CACHE_DBCACHE,
|
||||
SD_CACHE_TAYLORSEER,
|
||||
SD_CACHE_CACHE_DIT,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
bool enabled;
|
||||
enum sd_cache_mode_t mode;
|
||||
float reuse_threshold;
|
||||
float start_percent;
|
||||
float end_percent;
|
||||
} sd_easycache_params_t;
|
||||
float error_decay_rate;
|
||||
bool use_relative_threshold;
|
||||
bool reset_error_on_compute;
|
||||
int Fn_compute_blocks;
|
||||
int Bn_compute_blocks;
|
||||
float residual_diff_threshold;
|
||||
int max_warmup_steps;
|
||||
int max_cached_steps;
|
||||
int max_continuous_cached_steps;
|
||||
int taylorseer_n_derivatives;
|
||||
int taylorseer_skip_interval;
|
||||
const char* scm_mask;
|
||||
bool scm_policy_dynamic;
|
||||
} sd_cache_params_t;
|
||||
|
||||
typedef struct {
|
||||
bool is_high_noise;
|
||||
@ -271,7 +297,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_cache_params_t cache;
|
||||
} sd_img_gen_params_t;
|
||||
|
||||
typedef struct {
|
||||
@ -293,7 +319,8 @@ typedef struct {
|
||||
int64_t seed;
|
||||
int video_frames;
|
||||
float vace_strength;
|
||||
sd_easycache_params_t easycache;
|
||||
sd_tiling_params_t vae_tiling_params;
|
||||
sd_cache_params_t cache;
|
||||
} sd_vid_gen_params_t;
|
||||
|
||||
typedef struct sd_ctx_t sd_ctx_t;
|
||||
@ -323,7 +350,7 @@ 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_cache_params_init(sd_cache_params_t* cache_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);
|
||||
@ -335,7 +362,7 @@ 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 enum scheduler_t sd_get_default_scheduler(const sd_ctx_t* sd_ctx, enum sample_method_t sample_method);
|
||||
|
||||
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);
|
||||
@ -363,7 +390,8 @@ SD_API bool convert(const char* input_path,
|
||||
const char* vae_path,
|
||||
const char* output_path,
|
||||
enum sd_type_t output_type,
|
||||
const char* tensor_type_rules);
|
||||
const char* tensor_type_rules,
|
||||
bool convert_name);
|
||||
|
||||
SD_API bool preprocess_canny(sd_image_t image,
|
||||
float high_threshold,
|
||||
@ -379,4 +407,4 @@ SD_API const char* sd_version(void);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __STABLE_DIFFUSION_H__
|
||||
#endif // __STABLE_DIFFUSION_H__
|
||||
|
||||
11
StableDiffusion.NET/Enums/CacheMode.cs
Normal file
11
StableDiffusion.NET/Enums/CacheMode.cs
Normal file
@ -0,0 +1,11 @@
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
public enum CacheMode
|
||||
{
|
||||
Disabled = 0,
|
||||
EasyCache,
|
||||
UCache,
|
||||
DBCache,
|
||||
Taylorseer,
|
||||
CacheDit,
|
||||
}
|
||||
@ -10,6 +10,7 @@ public enum Scheduler
|
||||
SGM_Uniform,
|
||||
Simple,
|
||||
Smoothstep,
|
||||
KlOptimal,
|
||||
LCM,
|
||||
Default
|
||||
}
|
||||
@ -20,9 +20,7 @@ public static class ParameterExtension
|
||||
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(parameter.ThreadCount, nameof(DiffusionModelParameter.ThreadCount));
|
||||
ArgumentNullException.ThrowIfNull(parameter.VaePath, nameof(DiffusionModelParameter.VaePath));
|
||||
ArgumentNullException.ThrowIfNull(parameter.TaesdPath, nameof(DiffusionModelParameter.TaesdPath));
|
||||
ArgumentNullException.ThrowIfNull(parameter.LoraModelDirectory, nameof(DiffusionModelParameter.LoraModelDirectory));
|
||||
ArgumentNullException.ThrowIfNull(parameter.ControlNetPath, nameof(DiffusionModelParameter.ControlNetPath));
|
||||
ArgumentNullException.ThrowIfNull(parameter.EmbeddingsDirectory, nameof(DiffusionModelParameter.EmbeddingsDirectory));
|
||||
ArgumentNullException.ThrowIfNull(parameter.StackedIdEmbeddingsDirectory, nameof(DiffusionModelParameter.StackedIdEmbeddingsDirectory));
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(parameter.VaePath) && !string.IsNullOrWhiteSpace(parameter.TaesdPath)) throw new ArgumentException("VAE and TAESD are mutually exclusive.");
|
||||
@ -93,7 +91,6 @@ public static class ParameterExtension
|
||||
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(parameter.ImgCfg);
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(parameter.DistilledGuidance);
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(parameter.MinCfg);
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(parameter.TxtCfg);
|
||||
|
||||
parameter.Slg.Validate();
|
||||
|
||||
27
StableDiffusion.NET/Models/Parameter/CacheParameter.cs
Normal file
27
StableDiffusion.NET/Models/Parameter/CacheParameter.cs
Normal file
@ -0,0 +1,27 @@
|
||||
using JetBrains.Annotations;
|
||||
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
[PublicAPI]
|
||||
public sealed class CacheParameter
|
||||
{
|
||||
public CacheMode Mode { get; set; } = CacheMode.Disabled;
|
||||
public float ReuseThreshold { get; set; } = 1.0f;
|
||||
public float StartPercent { get; set; } = 0.15f;
|
||||
public float EndPercent { get; set; } = 0.95f;
|
||||
public float ErrorDecayRate { get; set; } = 1.0f;
|
||||
public bool UseRelativeThreshold { get; set; } = true;
|
||||
public bool ResetErrorOnCompute { get; set; } = true;
|
||||
public int FnComputeBlocks { get; set; } = 8;
|
||||
public int BnComputeBlocks { get; set; } = 0;
|
||||
public float ResidualDiffThreshold { get; set; } = 0.08f;
|
||||
public int MaxWarmupSteps { get; set; } = 8;
|
||||
public int MaxCachedSteps { get; set; } = -1;
|
||||
public int MaxContinuousCachedSteps { get; set; } = -1;
|
||||
public int TaylorseerNDerivatives { get; set; } = 1;
|
||||
public int TaylorseerSkipInterval { get; set; } = 1;
|
||||
public string? ScmMask { get; set; } = null;
|
||||
public bool ScmPolicyDynamic { get; set; } = true;
|
||||
|
||||
internal CacheParameter() { }
|
||||
}
|
||||
@ -35,6 +35,6 @@ public sealed class CannyParameter
|
||||
///
|
||||
/// </summary>
|
||||
public bool Inverse { get; set; } = false;
|
||||
|
||||
|
||||
public static CannyParameter Create() => new();
|
||||
}
|
||||
@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using JetBrains.Annotations;
|
||||
|
||||
namespace StableDiffusion.NET;
|
||||
@ -17,17 +16,6 @@ public sealed class DiffusionModelParameter
|
||||
/// </summary>
|
||||
public string TaesdPath { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// lora model directory
|
||||
/// </summary>
|
||||
public string LoraModelDirectory { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// path to embeddings
|
||||
/// </summary>
|
||||
[Obsolete("Use Embeddings instead")]
|
||||
public string EmbeddingsDirectory { get; set; } = string.Empty;
|
||||
|
||||
public List<Embedding> Embeddings { get; } = [];
|
||||
|
||||
/// <summary>
|
||||
@ -39,7 +27,7 @@ public sealed class DiffusionModelParameter
|
||||
/// number of threads to use during computation (default: -1)
|
||||
/// If threads = -1, then threads will be set to the number of CPU physical cores
|
||||
/// </summary>
|
||||
public int ThreadCount { get; set; } = 1;
|
||||
public int ThreadCount { get; set; } = -1;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
@ -55,6 +43,8 @@ public sealed class DiffusionModelParameter
|
||||
|
||||
public bool OffloadParamsToCPU { get; set; } = false;
|
||||
|
||||
public bool EnableMmap { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// keep clip in cpu (for low vram)
|
||||
/// </summary>
|
||||
@ -91,6 +81,9 @@ public sealed class DiffusionModelParameter
|
||||
/// </summary>
|
||||
public bool VaeConvDirect { get; set; } = false;
|
||||
|
||||
public bool CircularX { get; set; } = false;
|
||||
public bool CircularY { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// RNG (default: Standard)
|
||||
/// </summary>
|
||||
@ -108,7 +101,7 @@ public sealed class DiffusionModelParameter
|
||||
/// </summary>
|
||||
public Quantization Quantization { get; set; } = Quantization.Unspecified;
|
||||
|
||||
public float FlowShift { get; set; } = 0;
|
||||
public float FlowShift { get; set; } = float.PositiveInfinity;
|
||||
|
||||
public bool ForceSdxlVaeConvScale { get; set; } = false;
|
||||
|
||||
@ -144,12 +137,8 @@ public sealed class DiffusionModelParameter
|
||||
/// </summary>
|
||||
public string T5xxlPath { get; set; } = string.Empty;
|
||||
|
||||
[Obsolete("Use LLMPath instead")]
|
||||
public string Qwen2VLPath { get => LLMPath; set => LLMPath = value; }
|
||||
public string LLMPath { get; set; } = string.Empty;
|
||||
|
||||
[Obsolete("Use LLMVisionPath instead")]
|
||||
public string Qwen2VLVisionPath { get => LLMVisionPath; set => LLMVisionPath = value; }
|
||||
public string LLMVisionPath { get; set; } = string.Empty;
|
||||
|
||||
public string ClipVisionPath { get; set; } = string.Empty;
|
||||
@ -159,5 +148,7 @@ public sealed class DiffusionModelParameter
|
||||
public bool ChromaEnableT5Map { get; set; } = false;
|
||||
public int ChromaT5MaskPad { get; set; } = 1;
|
||||
|
||||
public bool QwenImageZeroCondT { get; set; } = false;
|
||||
|
||||
public static DiffusionModelParameter Create() => new();
|
||||
}
|
||||
@ -1,11 +0,0 @@
|
||||
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() { }
|
||||
}
|
||||
@ -28,25 +28,6 @@ public static class DiffusionModelBuilderExtension
|
||||
return parameter;
|
||||
}
|
||||
|
||||
public static DiffusionModelParameter WithLoraSupport(this DiffusionModelParameter parameter, string loraModelDirectory)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(loraModelDirectory);
|
||||
|
||||
parameter.LoraModelDirectory = loraModelDirectory;
|
||||
|
||||
return parameter;
|
||||
}
|
||||
|
||||
[Obsolete("Use WithEmbedding instead")]
|
||||
public static DiffusionModelParameter WithEmbeddingSupport(this DiffusionModelParameter parameter, string embeddingsDirectory)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(embeddingsDirectory);
|
||||
|
||||
parameter.EmbeddingsDirectory = embeddingsDirectory;
|
||||
|
||||
return parameter;
|
||||
}
|
||||
|
||||
public static DiffusionModelParameter WithEmbedding(this DiffusionModelParameter parameter, Embedding embedding)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(embedding);
|
||||
@ -246,8 +227,6 @@ public static class DiffusionModelBuilderExtension
|
||||
return parameter;
|
||||
}
|
||||
|
||||
[Obsolete("Use WithLLMPath instead")]
|
||||
public static DiffusionModelParameter WithQwen2VLPath(this DiffusionModelParameter parameter, string qwen2VLPath) => parameter.WithLLMPath(qwen2VLPath);
|
||||
public static DiffusionModelParameter WithLLMPath(this DiffusionModelParameter parameter, string llmPath)
|
||||
{
|
||||
parameter.LLMPath = llmPath;
|
||||
@ -255,8 +234,6 @@ public static class DiffusionModelBuilderExtension
|
||||
return parameter;
|
||||
}
|
||||
|
||||
[Obsolete("Use WithLLMVisionPath instead")]
|
||||
public static DiffusionModelParameter WithQwen2VLVisionPath(this DiffusionModelParameter parameter, string qwen2VLVisionPath) => parameter.WithLLMVisionPath(qwen2VLVisionPath);
|
||||
public static DiffusionModelParameter WithLLMVisionPath(this DiffusionModelParameter parameter, string llmVisionPath)
|
||||
{
|
||||
parameter.LLMVisionPath = llmVisionPath;
|
||||
|
||||
@ -99,13 +99,6 @@ public static class ImageGenerationParameterExtension
|
||||
return parameter;
|
||||
}
|
||||
|
||||
public static ImageGenerationParameter WithMinCfg(this ImageGenerationParameter parameter, float minCfg)
|
||||
{
|
||||
parameter.SampleParameter.Guidance.MinCfg = minCfg;
|
||||
|
||||
return parameter;
|
||||
}
|
||||
|
||||
public static ImageGenerationParameter WithGuidance(this ImageGenerationParameter parameter, float guidance)
|
||||
{
|
||||
parameter.SampleParameter.Guidance.DistilledGuidance = guidance;
|
||||
|
||||
@ -85,13 +85,6 @@ public static class VideoGenerationParameterExtension
|
||||
return parameter;
|
||||
}
|
||||
|
||||
public static VideoGenerationParameter WithMinCfg(this VideoGenerationParameter parameter, float minCfg)
|
||||
{
|
||||
parameter.SampleParameter.Guidance.MinCfg = minCfg;
|
||||
|
||||
return parameter;
|
||||
}
|
||||
|
||||
public static VideoGenerationParameter WithGuidance(this VideoGenerationParameter parameter, float guidance)
|
||||
{
|
||||
parameter.SampleParameter.Guidance.DistilledGuidance = guidance;
|
||||
@ -196,13 +189,6 @@ public static class VideoGenerationParameterExtension
|
||||
return parameter;
|
||||
}
|
||||
|
||||
public static VideoGenerationParameter WithHighNoiseMinCfg(this VideoGenerationParameter parameter, float minCfg)
|
||||
{
|
||||
parameter.HighNoiseSampleParameter.Guidance.MinCfg = minCfg;
|
||||
|
||||
return parameter;
|
||||
}
|
||||
|
||||
public static VideoGenerationParameter WithHighNoiseGuidance(this VideoGenerationParameter parameter, float guidance)
|
||||
{
|
||||
parameter.HighNoiseSampleParameter.Guidance.DistilledGuidance = guidance;
|
||||
|
||||
@ -3,8 +3,7 @@
|
||||
public sealed class GuidanceParameter
|
||||
{
|
||||
public float TxtCfg { get; set; } = 7.0f;
|
||||
public float ImgCfg { get; set; } = 7.0f;
|
||||
public float MinCfg { get; set; } = 1.0f;
|
||||
public float ImgCfg { get; set; } = float.PositiveInfinity;
|
||||
public float DistilledGuidance { get; set; } = 3.5f;
|
||||
|
||||
public SlgParameter Slg { get; } = new();
|
||||
|
||||
@ -45,9 +45,9 @@ public sealed class ImageGenerationParameter
|
||||
public SampleParameter SampleParameter { get; internal init; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// strength for noising/unnoising (default: 0.7)
|
||||
/// strength for noising/unnoising (default: 0.75)
|
||||
/// </summary>
|
||||
public float Strength { get; set; } = 0.7f;
|
||||
public float Strength { get; set; } = 0.75f;
|
||||
|
||||
/// <summary>
|
||||
/// RNG seed. use -1 for a random seed (default: -1)
|
||||
@ -58,9 +58,9 @@ public sealed class ImageGenerationParameter
|
||||
|
||||
public PhotoMakerParameter PhotoMaker { get; } = new();
|
||||
|
||||
public TilingParameter VaeTiling { get; } = new();
|
||||
public TilingParameter VaeTiling { get; internal init; } = new();
|
||||
|
||||
public EasyCache EasyCache { get; } = new();
|
||||
public CacheParameter Cache { get; internal init; } = new();
|
||||
|
||||
public List<Lora> Loras { get; } = [];
|
||||
|
||||
|
||||
@ -10,14 +10,14 @@ public sealed class SampleParameter
|
||||
public Scheduler Scheduler { get; set; } = Scheduler.Default;
|
||||
|
||||
/// <summary>
|
||||
/// sampling method (default: Euler_A)
|
||||
/// sampling method (default: Default)
|
||||
/// </summary>
|
||||
public Sampler SampleMethod { get; set; } = Sampler.Euler_A;
|
||||
public Sampler SampleMethod { get; set; } = Sampler.Default;
|
||||
|
||||
/// <summary>
|
||||
/// number of sample steps (default: 25)
|
||||
/// number of sample steps (default: 20)
|
||||
/// </summary>
|
||||
public int SampleSteps { get; set; } = 25;
|
||||
public int SampleSteps { get; set; } = 20;
|
||||
|
||||
/// <summary>
|
||||
/// eta in DDIM, only for DDIM and TCD (default: 0)
|
||||
|
||||
@ -3,9 +3,9 @@
|
||||
public sealed class SlgParameter
|
||||
{
|
||||
/// <summary>
|
||||
/// Layers to skip for SLG steps: (default: [7,8,9])
|
||||
/// Layers to skip for SLG steps
|
||||
/// </summary>
|
||||
public int[] Layers { get; set; } = [7, 8, 9];
|
||||
public int[] Layers { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// SLG enabling point: (default: 0.01)
|
||||
|
||||
@ -2,13 +2,13 @@
|
||||
|
||||
public sealed class TilingParameter
|
||||
{
|
||||
public bool IsEnabled { get; set; }
|
||||
public bool IsEnabled { get; set; } = false;
|
||||
|
||||
public int TileSizeX { get; set; }
|
||||
public int TileSizeY { get; set; }
|
||||
public float TargetOverlap { get; set; }
|
||||
public float RelSizeX { get; set; }
|
||||
public float RelSizeY { get; set; }
|
||||
public int TileSizeX { get; set; } = 0;
|
||||
public int TileSizeY { get; set; } = 0;
|
||||
public float TargetOverlap { get; set; } = 0.5f;
|
||||
public float RelSizeX { get; set; } = 0;
|
||||
public float RelSizeY { get; set; } = 0;
|
||||
|
||||
internal TilingParameter() { }
|
||||
}
|
||||
@ -21,25 +21,27 @@ public sealed class VideoGenerationParameter
|
||||
|
||||
public IImage[]? ControlFrames { get; set; }
|
||||
|
||||
public int Width { get; set; }
|
||||
public int Width { get; set; } = 512;
|
||||
|
||||
public int Height { get; set; }
|
||||
public int Height { get; set; } = 512;
|
||||
|
||||
public SampleParameter SampleParameter { get; internal init; } = new();
|
||||
|
||||
public SampleParameter HighNoiseSampleParameter { get; internal init; } = new();
|
||||
public SampleParameter HighNoiseSampleParameter { get; internal init; } = new() { SampleSteps = -1 };
|
||||
|
||||
public float MoeBoundry { get; set; }
|
||||
public float MoeBoundry { get; set; } = 0.875f;
|
||||
|
||||
public float Strength { get; set; }
|
||||
public float Strength { get; set; } = 0.75f;
|
||||
|
||||
public long Seed { get; set; }
|
||||
public long Seed { get; set; } = -1;
|
||||
|
||||
public int FrameCount { get; set; }
|
||||
public int FrameCount { get; set; } = 6;
|
||||
|
||||
public float VaceStrength { get; set; }
|
||||
public float VaceStrength { get; set; } = 1.0f;
|
||||
|
||||
public EasyCache EasyCache { get; } = new();
|
||||
public TilingParameter VaeTiling { get; internal init; } = new();
|
||||
|
||||
public CacheParameter Cache { get; internal init; } = new();
|
||||
|
||||
public List<Lora> Loras { get; } = [];
|
||||
|
||||
|
||||
@ -0,0 +1,89 @@
|
||||
// ReSharper disable MemberCanBeMadeStatic.Global
|
||||
|
||||
using System;
|
||||
using System.Runtime.InteropServices.Marshalling;
|
||||
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
[CustomMarshaller(typeof(CacheParameter), MarshalMode.ManagedToUnmanagedIn, typeof(CacheParameterMarshallerIn))]
|
||||
[CustomMarshaller(typeof(CacheParameter), MarshalMode.ManagedToUnmanagedOut, typeof(CacheParameterMarshaller))]
|
||||
[CustomMarshaller(typeof(CacheParameter), MarshalMode.ManagedToUnmanagedRef, typeof(CacheParameterMarshallerRef))]
|
||||
internal static unsafe class CacheParameterMarshaller
|
||||
{
|
||||
public static CacheParameter ConvertToManaged(Native.Types.sd_cache_params_t unmanaged)
|
||||
{
|
||||
CacheParameter parameter = new()
|
||||
{
|
||||
Mode = unmanaged.mode,
|
||||
ReuseThreshold = unmanaged.reuse_threshold,
|
||||
StartPercent = unmanaged.start_percent,
|
||||
EndPercent = unmanaged.end_percent,
|
||||
ErrorDecayRate = unmanaged.error_decay_rate,
|
||||
UseRelativeThreshold = unmanaged.use_relative_threshold == 1,
|
||||
ResetErrorOnCompute = unmanaged.reset_error_on_compute == 1,
|
||||
FnComputeBlocks = unmanaged.Fn_compute_blocks,
|
||||
BnComputeBlocks = unmanaged.Bn_compute_blocks,
|
||||
ResidualDiffThreshold = unmanaged.residual_diff_threshold,
|
||||
MaxWarmupSteps = unmanaged.max_warmup_steps,
|
||||
MaxCachedSteps = unmanaged.max_cached_steps,
|
||||
MaxContinuousCachedSteps = unmanaged.max_continuous_cached_steps,
|
||||
TaylorseerNDerivatives = unmanaged.taylorseer_n_derivatives,
|
||||
TaylorseerSkipInterval = unmanaged.taylorseer_skip_interval,
|
||||
ScmMask = AnsiStringMarshaller.ConvertToManaged(unmanaged.scm_mask),
|
||||
ScmPolicyDynamic = unmanaged.scm_policy_dynamic == 1
|
||||
};
|
||||
|
||||
return parameter;
|
||||
}
|
||||
|
||||
internal ref struct CacheParameterMarshallerIn
|
||||
{
|
||||
private Native.Types.sd_cache_params_t _cacheParams;
|
||||
|
||||
public void FromManaged(CacheParameter managed)
|
||||
{
|
||||
|
||||
_cacheParams = new Native.Types.sd_cache_params_t
|
||||
{
|
||||
mode = managed.Mode,
|
||||
reuse_threshold = managed.ReuseThreshold,
|
||||
start_percent = managed.StartPercent,
|
||||
end_percent = managed.EndPercent,
|
||||
error_decay_rate = managed.ErrorDecayRate,
|
||||
use_relative_threshold = (sbyte)(managed.UseRelativeThreshold ? 1 : 0),
|
||||
reset_error_on_compute = (sbyte)(managed.ResetErrorOnCompute ? 1 : 0),
|
||||
Fn_compute_blocks = managed.FnComputeBlocks,
|
||||
Bn_compute_blocks = managed.BnComputeBlocks,
|
||||
residual_diff_threshold = managed.ResidualDiffThreshold,
|
||||
max_warmup_steps = managed.MaxWarmupSteps,
|
||||
max_cached_steps = managed.MaxCachedSteps,
|
||||
max_continuous_cached_steps = managed.MaxContinuousCachedSteps,
|
||||
taylorseer_n_derivatives = managed.TaylorseerNDerivatives,
|
||||
taylorseer_skip_interval = managed.TaylorseerSkipInterval,
|
||||
scm_mask = AnsiStringMarshaller.ConvertToUnmanaged(managed.ScmMask),
|
||||
scm_policy_dynamic = (sbyte)(managed.ScmPolicyDynamic ? 1 : 0)
|
||||
};
|
||||
}
|
||||
|
||||
public Native.Types.sd_cache_params_t ToUnmanaged() => _cacheParams;
|
||||
|
||||
public void Free()
|
||||
{
|
||||
AnsiStringMarshaller.Free(_cacheParams.scm_mask);
|
||||
}
|
||||
}
|
||||
|
||||
internal ref struct CacheParameterMarshallerRef()
|
||||
{
|
||||
private CacheParameterMarshallerIn _inMarshaller = new();
|
||||
private CacheParameter? _parameter;
|
||||
|
||||
public void FromManaged(CacheParameter managed) => _inMarshaller.FromManaged(managed);
|
||||
public Native.Types.sd_cache_params_t ToUnmanaged() => _inMarshaller.ToUnmanaged();
|
||||
|
||||
public void FromUnmanaged(Native.Types.sd_cache_params_t unmanaged) => _parameter = ConvertToManaged(unmanaged);
|
||||
public CacheParameter ToManaged() => _parameter ?? throw new NullReferenceException($"{nameof(FromUnmanaged)} needs to be called before ToManaged.");
|
||||
|
||||
public void Free() => _inMarshaller.Free();
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Runtime.InteropServices.Marshalling;
|
||||
|
||||
namespace StableDiffusion.NET;
|
||||
@ -26,7 +24,6 @@ internal static unsafe class DiffusionModelParameterMarshaller
|
||||
VaePath = AnsiStringMarshaller.ConvertToManaged(unmanaged.vae_path) ?? string.Empty,
|
||||
TaesdPath = AnsiStringMarshaller.ConvertToManaged(unmanaged.taesd_path) ?? string.Empty,
|
||||
ControlNetPath = AnsiStringMarshaller.ConvertToManaged(unmanaged.control_net_path) ?? string.Empty,
|
||||
LoraModelDirectory = AnsiStringMarshaller.ConvertToManaged(unmanaged.lora_model_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,
|
||||
@ -38,6 +35,7 @@ internal static unsafe class DiffusionModelParameterMarshaller
|
||||
Prediction = unmanaged.prediction,
|
||||
LoraApplyMode = unmanaged.lora_apply_mode,
|
||||
OffloadParamsToCPU = unmanaged.offload_params_to_cpu == 1,
|
||||
EnableMmap = unmanaged.enable_mmap == 1,
|
||||
KeepClipOnCPU = unmanaged.keep_clip_on_cpu == 1,
|
||||
KeepControlNetOnCPU = unmanaged.keep_control_net_on_cpu == 1,
|
||||
KeepVaeOnCPU = unmanaged.keep_vae_on_cpu == 1,
|
||||
@ -45,10 +43,13 @@ internal static unsafe class DiffusionModelParameterMarshaller
|
||||
TaePreviewOnly = unmanaged.tae_preview_only == 1,
|
||||
DiffusionConvDirect = unmanaged.diffusion_conv_direct == 1,
|
||||
VaeConvDirect = unmanaged.vae_conv_direct == 1,
|
||||
CircularX = unmanaged.circular_x == 1,
|
||||
CircularY = unmanaged.circular_y == 1,
|
||||
ForceSdxlVaeConvScale = unmanaged.force_sdxl_vae_conv_scale == 1,
|
||||
ChromaUseDitMap = unmanaged.chroma_use_dit_mask == 1,
|
||||
ChromaEnableT5Map = unmanaged.chroma_use_t5_mask == 1,
|
||||
ChromaT5MaskPad = unmanaged.chroma_t5_mask_pad,
|
||||
QwenImageZeroCondT = unmanaged.qwen_image_zero_cond_t == 1,
|
||||
FlowShift = unmanaged.flow_shift
|
||||
};
|
||||
|
||||
@ -75,46 +76,17 @@ internal static unsafe class DiffusionModelParameterMarshaller
|
||||
|
||||
public void FromManaged(DiffusionModelParameter managed)
|
||||
{
|
||||
//_embeddings = (Native.Types.sd_embedding_t*)NativeMemory.Alloc((nuint)managed.Embeddings.Count, (nuint)Marshal.SizeOf<Native.Types.sd_embedding_t>());
|
||||
_embeddings = (Native.Types.sd_embedding_t*)NativeMemory.Alloc((nuint)managed.Embeddings.Count, (nuint)Marshal.SizeOf<Native.Types.sd_embedding_t>());
|
||||
|
||||
//for (int i = 0; i < managed.Embeddings.Count; i++)
|
||||
//{
|
||||
// Embedding embedding = managed.Embeddings[i];
|
||||
|
||||
// _embeddings[i] = new Native.Types.sd_embedding_t
|
||||
// {
|
||||
// name = AnsiStringMarshaller.ConvertToUnmanaged(embedding.Name),
|
||||
// path = AnsiStringMarshaller.ConvertToUnmanaged(embedding.Path),
|
||||
// };
|
||||
//}
|
||||
|
||||
//HACK DarthAffe 25.12.2025 Workaround to support EmbeddingsDir till the next major release
|
||||
List<Embedding> embeddings = [];
|
||||
for (int i = 0; i < managed.Embeddings.Count; i++)
|
||||
{
|
||||
embeddings.AddRange(managed.Embeddings);
|
||||
Embedding embedding = managed.Embeddings[i];
|
||||
|
||||
try
|
||||
_embeddings[i] = new Native.Types.sd_embedding_t
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(managed.EmbeddingsDirectory) && Directory.Exists(managed.EmbeddingsDirectory))
|
||||
{
|
||||
foreach (string file in Directory.GetFiles(managed.EmbeddingsDirectory))
|
||||
embeddings.Add(new Embedding(Path.GetFileNameWithoutExtension(file), file));
|
||||
}
|
||||
}
|
||||
catch { /**/ }
|
||||
|
||||
_embeddings = (Native.Types.sd_embedding_t*)NativeMemory.Alloc((nuint)embeddings.Count, (nuint)Marshal.SizeOf<Native.Types.sd_embedding_t>());
|
||||
|
||||
for (int i = 0; i < embeddings.Count; i++)
|
||||
{
|
||||
Embedding embedding = embeddings[i];
|
||||
|
||||
_embeddings[i] = new Native.Types.sd_embedding_t
|
||||
{
|
||||
name = AnsiStringMarshaller.ConvertToUnmanaged(embedding.Name),
|
||||
path = AnsiStringMarshaller.ConvertToUnmanaged(embedding.Path),
|
||||
};
|
||||
}
|
||||
name = AnsiStringMarshaller.ConvertToUnmanaged(embedding.Name),
|
||||
path = AnsiStringMarshaller.ConvertToUnmanaged(embedding.Path),
|
||||
};
|
||||
}
|
||||
|
||||
_ctxParams = new Native.Types.sd_ctx_params_t
|
||||
@ -131,9 +103,8 @@ internal static unsafe class DiffusionModelParameterMarshaller
|
||||
vae_path = AnsiStringMarshaller.ConvertToUnmanaged(managed.VaePath),
|
||||
taesd_path = AnsiStringMarshaller.ConvertToUnmanaged(managed.TaesdPath),
|
||||
control_net_path = AnsiStringMarshaller.ConvertToUnmanaged(managed.ControlNetPath),
|
||||
lora_model_dir = AnsiStringMarshaller.ConvertToUnmanaged(managed.LoraModelDirectory),
|
||||
embeddings = _embeddings,
|
||||
embedding_count = (uint)embeddings.Count,
|
||||
embedding_count = (uint)managed.Embeddings.Count,
|
||||
photo_maker_path = AnsiStringMarshaller.ConvertToUnmanaged(managed.StackedIdEmbeddingsDirectory),
|
||||
tensor_type_rules = AnsiStringMarshaller.ConvertToUnmanaged(managed.TensorTypeRules),
|
||||
vae_decode_only = (sbyte)(managed.VaeDecodeOnly ? 1 : 0),
|
||||
@ -145,6 +116,7 @@ internal static unsafe class DiffusionModelParameterMarshaller
|
||||
prediction = managed.Prediction,
|
||||
lora_apply_mode = managed.LoraApplyMode,
|
||||
offload_params_to_cpu = (sbyte)(managed.OffloadParamsToCPU ? 1 : 0),
|
||||
enable_mmap = (sbyte)(managed.EnableMmap ? 1 : 0),
|
||||
keep_clip_on_cpu = (sbyte)(managed.KeepClipOnCPU ? 1 : 0),
|
||||
keep_control_net_on_cpu = (sbyte)(managed.KeepControlNetOnCPU ? 1 : 0),
|
||||
keep_vae_on_cpu = (sbyte)(managed.KeepVaeOnCPU ? 1 : 0),
|
||||
@ -152,10 +124,13 @@ internal static unsafe class DiffusionModelParameterMarshaller
|
||||
tae_preview_only = (sbyte)(managed.TaePreviewOnly ? 1 : 0),
|
||||
diffusion_conv_direct = (sbyte)(managed.DiffusionConvDirect ? 1 : 0),
|
||||
vae_conv_direct = (sbyte)(managed.VaeConvDirect ? 1 : 0),
|
||||
circular_x = (sbyte)(managed.CircularX ? 1 : 0),
|
||||
circular_y = (sbyte)(managed.CircularY ? 1 : 0),
|
||||
force_sdxl_vae_conv_scale = (sbyte)(managed.ForceSdxlVaeConvScale ? 1 : 0),
|
||||
chroma_use_dit_mask = (sbyte)(managed.ChromaUseDitMap ? 1 : 0),
|
||||
chroma_use_t5_mask = (sbyte)(managed.ChromaEnableT5Map ? 1 : 0),
|
||||
chroma_t5_mask_pad = managed.ChromaT5MaskPad,
|
||||
qwen_image_zero_cond_t = (sbyte)(managed.QwenImageZeroCondT ? 1 : 0),
|
||||
flow_shift = managed.FlowShift
|
||||
};
|
||||
}
|
||||
@ -164,7 +139,6 @@ internal static unsafe class DiffusionModelParameterMarshaller
|
||||
|
||||
public void Free()
|
||||
{
|
||||
|
||||
AnsiStringMarshaller.Free(_ctxParams.model_path);
|
||||
AnsiStringMarshaller.Free(_ctxParams.clip_l_path);
|
||||
AnsiStringMarshaller.Free(_ctxParams.clip_g_path);
|
||||
@ -175,7 +149,6 @@ internal static unsafe class DiffusionModelParameterMarshaller
|
||||
AnsiStringMarshaller.Free(_ctxParams.vae_path);
|
||||
AnsiStringMarshaller.Free(_ctxParams.taesd_path);
|
||||
AnsiStringMarshaller.Free(_ctxParams.control_net_path);
|
||||
AnsiStringMarshaller.Free(_ctxParams.lora_model_dir);
|
||||
AnsiStringMarshaller.Free(_ctxParams.photo_maker_path);
|
||||
AnsiStringMarshaller.Free(_ctxParams.tensor_type_rules);
|
||||
|
||||
|
||||
@ -38,22 +38,8 @@ internal static unsafe class ImageGenerationParameterMarshaller
|
||||
IdEmbedPath = AnsiStringMarshaller.ConvertToManaged(unmanaged.pm_params.id_embed_path) ?? string.Empty,
|
||||
StyleStrength = unmanaged.pm_params.style_strength,
|
||||
},
|
||||
VaeTiling =
|
||||
{
|
||||
IsEnabled = unmanaged.vae_tiling_params.enabled == 1,
|
||||
TileSizeX = unmanaged.vae_tiling_params.tile_size_x,
|
||||
TileSizeY = unmanaged.vae_tiling_params.tile_size_y,
|
||||
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
|
||||
}
|
||||
VaeTiling = TilingParameterMarshaller.ConvertToManaged(unmanaged.vae_tiling_params),
|
||||
Cache = CacheParameterMarshaller.ConvertToManaged(unmanaged.cache)
|
||||
};
|
||||
|
||||
for (int i = 0; i < unmanaged.lora_count; i++)
|
||||
@ -73,6 +59,8 @@ internal static unsafe class ImageGenerationParameterMarshaller
|
||||
internal ref struct ImageGenerationParameterMarshallerIn
|
||||
{
|
||||
private SampleParameterMarshaller.SampleParameterMarshallerIn _sampleParameterMarshaller = new();
|
||||
private TilingParameterMarshaller.TilingParameterMarshallerIn _tilingParameterMarshaller = new();
|
||||
private CacheParameterMarshaller.CacheParameterMarshallerIn _cacheParameterMarshaller = new();
|
||||
private Native.Types.sd_img_gen_params_t _imgGenParams;
|
||||
|
||||
private Native.Types.sd_image_t _initImage;
|
||||
@ -87,6 +75,8 @@ internal static unsafe class ImageGenerationParameterMarshaller
|
||||
public void FromManaged(ImageGenerationParameter managed)
|
||||
{
|
||||
_sampleParameterMarshaller.FromManaged(managed.SampleParameter);
|
||||
_tilingParameterMarshaller.FromManaged(managed.VaeTiling);
|
||||
_cacheParameterMarshaller.FromManaged(managed.Cache);
|
||||
|
||||
_initImage = managed.InitImage?.ToSdImage() ?? new Native.Types.sd_image_t();
|
||||
_controlNetImage = managed.ControlNet.Image?.ToSdImage() ?? new Native.Types.sd_image_t();
|
||||
@ -129,24 +119,6 @@ internal static unsafe class ImageGenerationParameterMarshaller
|
||||
style_strength = managed.PhotoMaker.StyleStrength
|
||||
};
|
||||
|
||||
Native.Types.sd_tiling_params_t tilingParams = new()
|
||||
{
|
||||
enabled = (sbyte)(managed.VaeTiling.IsEnabled ? 1 : 0),
|
||||
tile_size_x = managed.VaeTiling.TileSizeX,
|
||||
tile_size_y = managed.VaeTiling.TileSizeY,
|
||||
target_overlap = managed.VaeTiling.TargetOverlap,
|
||||
rel_size_x = managed.VaeTiling.RelSizeX,
|
||||
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),
|
||||
@ -166,10 +138,10 @@ internal static unsafe class ImageGenerationParameterMarshaller
|
||||
control_image = _controlNetImage,
|
||||
control_strength = managed.ControlNet.Strength,
|
||||
pm_params = photoMakerParams,
|
||||
vae_tiling_params = tilingParams,
|
||||
easycache = easyCache,
|
||||
vae_tiling_params = _tilingParameterMarshaller.ToUnmanaged(),
|
||||
cache = _cacheParameterMarshaller.ToUnmanaged(),
|
||||
loras = _loras,
|
||||
lora_count = (uint)managed.Loras.Count
|
||||
lora_count = (uint)managed.Loras.Count,
|
||||
};
|
||||
}
|
||||
|
||||
@ -192,6 +164,8 @@ internal static unsafe class ImageGenerationParameterMarshaller
|
||||
ImageHelper.Free(_pmIdImages, _imgGenParams.pm_params.id_images_count);
|
||||
|
||||
_sampleParameterMarshaller.Free();
|
||||
_tilingParameterMarshaller.Free();
|
||||
_cacheParameterMarshaller.Free();
|
||||
|
||||
for (int i = 0; i < _imgGenParams.lora_count; i++)
|
||||
AnsiStringMarshaller.Free(_imgGenParams.loras[i].path);
|
||||
|
||||
@ -19,7 +19,6 @@ internal static unsafe class SampleParameterMarshaller
|
||||
{
|
||||
TxtCfg = unmanaged.guidance.txt_cfg,
|
||||
ImgCfg = unmanaged.guidance.img_cfg,
|
||||
MinCfg = unmanaged.guidance.min_cfg,
|
||||
DistilledGuidance = unmanaged.guidance.distilled_guidance,
|
||||
Slg =
|
||||
{
|
||||
@ -74,7 +73,6 @@ internal static unsafe class SampleParameterMarshaller
|
||||
{
|
||||
txt_cfg = managed.Guidance.TxtCfg,
|
||||
img_cfg = managed.Guidance.ImgCfg,
|
||||
min_cfg = managed.Guidance.MinCfg,
|
||||
distilled_guidance = managed.Guidance.DistilledGuidance,
|
||||
slg = slg
|
||||
};
|
||||
|
||||
@ -0,0 +1,63 @@
|
||||
// ReSharper disable MemberCanBeMadeStatic.Global
|
||||
|
||||
using System;
|
||||
using System.Runtime.InteropServices.Marshalling;
|
||||
|
||||
namespace StableDiffusion.NET;
|
||||
|
||||
[CustomMarshaller(typeof(TilingParameter), MarshalMode.ManagedToUnmanagedIn, typeof(TilingParameterMarshallerIn))]
|
||||
[CustomMarshaller(typeof(TilingParameter), MarshalMode.ManagedToUnmanagedOut, typeof(TilingParameterMarshaller))]
|
||||
[CustomMarshaller(typeof(TilingParameter), MarshalMode.ManagedToUnmanagedRef, typeof(TilingParameterMarshallerRef))]
|
||||
internal static unsafe class TilingParameterMarshaller
|
||||
{
|
||||
public static TilingParameter ConvertToManaged(Native.Types.sd_tiling_params_t unmanaged)
|
||||
{
|
||||
TilingParameter parameter = new()
|
||||
{
|
||||
IsEnabled = unmanaged.enabled == 1,
|
||||
TileSizeX = unmanaged.tile_size_x,
|
||||
TileSizeY = unmanaged.tile_size_y,
|
||||
TargetOverlap = unmanaged.target_overlap,
|
||||
RelSizeX = unmanaged.rel_size_x,
|
||||
RelSizeY = unmanaged.rel_size_y
|
||||
};
|
||||
|
||||
return parameter;
|
||||
}
|
||||
|
||||
internal ref struct TilingParameterMarshallerIn
|
||||
{
|
||||
private Native.Types.sd_tiling_params_t _tilingParams;
|
||||
|
||||
public void FromManaged(TilingParameter managed)
|
||||
{
|
||||
_tilingParams = new Native.Types.sd_tiling_params_t
|
||||
{
|
||||
enabled = (sbyte)(managed.IsEnabled ? 1 : 0),
|
||||
tile_size_x = managed.TileSizeX,
|
||||
tile_size_y = managed.TileSizeY,
|
||||
target_overlap = managed.TargetOverlap,
|
||||
rel_size_x = managed.RelSizeX,
|
||||
rel_size_y = managed.RelSizeY
|
||||
};
|
||||
}
|
||||
|
||||
public Native.Types.sd_tiling_params_t ToUnmanaged() => _tilingParams;
|
||||
|
||||
public void Free() { }
|
||||
}
|
||||
|
||||
internal ref struct TilingParameterMarshallerRef()
|
||||
{
|
||||
private TilingParameterMarshallerIn _inMarshaller = new();
|
||||
private TilingParameter? _parameter;
|
||||
|
||||
public void FromManaged(TilingParameter managed) => _inMarshaller.FromManaged(managed);
|
||||
public Native.Types.sd_tiling_params_t ToUnmanaged() => _inMarshaller.ToUnmanaged();
|
||||
|
||||
public void FromUnmanaged(Native.Types.sd_tiling_params_t unmanaged) => _parameter = ConvertToManaged(unmanaged);
|
||||
public TilingParameter ToManaged() => _parameter ?? throw new NullReferenceException($"{nameof(FromUnmanaged)} needs to be called before ToManaged.");
|
||||
|
||||
public void Free() => _inMarshaller.Free();
|
||||
}
|
||||
}
|
||||
@ -29,13 +29,8 @@ internal static unsafe class VideoGenerationParameterMarshaller
|
||||
Seed = unmanaged.seed,
|
||||
FrameCount = unmanaged.video_frames,
|
||||
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
|
||||
}
|
||||
VaeTiling = TilingParameterMarshaller.ConvertToManaged(unmanaged.vae_tiling_params),
|
||||
Cache = CacheParameterMarshaller.ConvertToManaged(unmanaged.cache),
|
||||
};
|
||||
|
||||
for (int i = 0; i < unmanaged.lora_count; i++)
|
||||
@ -55,7 +50,9 @@ internal static unsafe class VideoGenerationParameterMarshaller
|
||||
internal ref struct VideoGenerationParameterMarshallerIn
|
||||
{
|
||||
private SampleParameterMarshaller.SampleParameterMarshallerIn _sampleParameterMarshaller = new();
|
||||
private TilingParameterMarshaller.TilingParameterMarshallerIn _tilingParameterMarshaller = new();
|
||||
private SampleParameterMarshaller.SampleParameterMarshallerIn _highNoiseSampleParameterMarshaller = new();
|
||||
private CacheParameterMarshaller.CacheParameterMarshallerIn _cacheParameterMarshaller = new();
|
||||
private Native.Types.sd_vid_gen_params_t _vidGenParams;
|
||||
|
||||
private Native.Types.sd_image_t _initImage;
|
||||
@ -68,7 +65,9 @@ internal static unsafe class VideoGenerationParameterMarshaller
|
||||
public void FromManaged(VideoGenerationParameter managed)
|
||||
{
|
||||
_sampleParameterMarshaller.FromManaged(managed.SampleParameter);
|
||||
_tilingParameterMarshaller.FromManaged(managed.VaeTiling);
|
||||
_highNoiseSampleParameterMarshaller.FromManaged(managed.HighNoiseSampleParameter);
|
||||
_cacheParameterMarshaller.FromManaged(managed.Cache);
|
||||
|
||||
_initImage = managed.InitImage?.ToSdImage() ?? new Native.Types.sd_image_t();
|
||||
_endImage = managed.EndImage?.ToSdImage() ?? new Native.Types.sd_image_t();
|
||||
@ -86,14 +85,6 @@ internal static unsafe class VideoGenerationParameterMarshaller
|
||||
};
|
||||
}
|
||||
|
||||
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),
|
||||
@ -112,7 +103,8 @@ internal static unsafe class VideoGenerationParameterMarshaller
|
||||
seed = managed.Seed,
|
||||
video_frames = managed.FrameCount,
|
||||
vace_strength = managed.VaceStrength,
|
||||
easycache = easyCache,
|
||||
vae_tiling_params = _tilingParameterMarshaller.ToUnmanaged(),
|
||||
cache = _cacheParameterMarshaller.ToUnmanaged(),
|
||||
loras = _loras,
|
||||
lora_count = (uint)managed.Loras.Count
|
||||
};
|
||||
@ -132,7 +124,9 @@ internal static unsafe class VideoGenerationParameterMarshaller
|
||||
ImageHelper.Free(_controlFrames, _vidGenParams.control_frames_size);
|
||||
|
||||
_sampleParameterMarshaller.Free();
|
||||
_tilingParameterMarshaller.Free();
|
||||
_highNoiseSampleParameterMarshaller.Free();
|
||||
_cacheParameterMarshaller.Free();
|
||||
|
||||
for (int i = 0; i < _vidGenParams.lora_count; i++)
|
||||
AnsiStringMarshaller.Free(_vidGenParams.loras[i].path);
|
||||
|
||||
@ -15,6 +15,8 @@ using rng_type_t = RngType;
|
||||
using sample_method_t = Sampler;
|
||||
using scheduler_t = Scheduler;
|
||||
using prediction_t = Prediction;
|
||||
using sd_cache_mode_t = CacheMode;
|
||||
using sd_cache_params_t = CacheParameter;
|
||||
using sd_ctx_params_t = DiffusionModelParameter;
|
||||
using sd_ctx_t = Native.Types.sd_ctx_t;
|
||||
using sd_image_t = Native.Types.sd_image_t;
|
||||
@ -25,7 +27,6 @@ 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;
|
||||
@ -74,7 +75,6 @@ internal unsafe partial class Native
|
||||
public byte* vae_path;
|
||||
public byte* taesd_path;
|
||||
public byte* control_net_path;
|
||||
public byte* lora_model_dir;
|
||||
public sd_embedding_t* embeddings;
|
||||
public uint32_t embedding_count;
|
||||
public byte* photo_maker_path;
|
||||
@ -88,6 +88,7 @@ internal unsafe partial class Native
|
||||
public prediction_t prediction;
|
||||
public lora_apply_mode_t lora_apply_mode;
|
||||
public sbyte offload_params_to_cpu;
|
||||
public sbyte enable_mmap;
|
||||
public sbyte keep_clip_on_cpu;
|
||||
public sbyte keep_control_net_on_cpu;
|
||||
public sbyte keep_vae_on_cpu;
|
||||
@ -95,10 +96,13 @@ internal unsafe partial class Native
|
||||
public sbyte tae_preview_only;
|
||||
public sbyte diffusion_conv_direct;
|
||||
public sbyte vae_conv_direct;
|
||||
public sbyte circular_x;
|
||||
public sbyte circular_y;
|
||||
public sbyte force_sdxl_vae_conv_scale;
|
||||
public sbyte chroma_use_dit_mask;
|
||||
public sbyte chroma_use_t5_mask;
|
||||
public int chroma_t5_mask_pad;
|
||||
public sbyte qwen_image_zero_cond_t;
|
||||
public float flow_shift;
|
||||
}
|
||||
|
||||
@ -126,7 +130,6 @@ internal unsafe partial class Native
|
||||
{
|
||||
public float txt_cfg;
|
||||
public float img_cfg;
|
||||
public float min_cfg;
|
||||
public float distilled_guidance;
|
||||
public sd_slg_params_t slg;
|
||||
}
|
||||
@ -154,12 +157,25 @@ internal unsafe partial class Native
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct sd_easycache_params_t
|
||||
internal struct sd_cache_params_t
|
||||
{
|
||||
public sbyte enabled;
|
||||
public sd_cache_mode_t mode;
|
||||
public float reuse_threshold;
|
||||
public float start_percent;
|
||||
public float end_percent;
|
||||
public float error_decay_rate;
|
||||
public sbyte use_relative_threshold;
|
||||
public sbyte reset_error_on_compute;
|
||||
public int Fn_compute_blocks;
|
||||
public int Bn_compute_blocks;
|
||||
public float residual_diff_threshold;
|
||||
public int max_warmup_steps;
|
||||
public int max_cached_steps;
|
||||
public int max_continuous_cached_steps;
|
||||
public int taylorseer_n_derivatives;
|
||||
public int taylorseer_skip_interval;
|
||||
public byte* scm_mask;
|
||||
public sbyte scm_policy_dynamic;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
@ -194,7 +210,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;
|
||||
public sd_cache_params_t cache;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
@ -218,7 +234,8 @@ internal unsafe partial class Native
|
||||
public int64_t seed;
|
||||
public int video_frames;
|
||||
public float vace_strength;
|
||||
public sd_easycache_params_t easycache;
|
||||
public sd_tiling_params_t vae_tiling_params;
|
||||
public sd_cache_params_t cache;
|
||||
}
|
||||
|
||||
internal struct sd_ctx_t;
|
||||
@ -302,8 +319,8 @@ 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_cache_params_init")]
|
||||
internal static partial void sd_cache_params_init([MarshalUsing(typeof(CacheParameterMarshaller))] ref sd_cache_params_t cache_params);
|
||||
|
||||
//
|
||||
|
||||
@ -343,7 +360,7 @@ internal unsafe partial class Native
|
||||
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);
|
||||
internal static partial scheduler_t sd_get_default_scheduler(sd_ctx_t* sd_ctx, sample_method_t sample_method);
|
||||
|
||||
[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);
|
||||
@ -385,7 +402,8 @@ internal unsafe partial class Native
|
||||
[MarshalAs(UnmanagedType.LPStr)] string vae_path,
|
||||
[MarshalAs(UnmanagedType.LPStr)] string output_path,
|
||||
sd_type_t output_type,
|
||||
[MarshalAs(UnmanagedType.LPStr)] string tensor_type_rules);
|
||||
[MarshalAs(UnmanagedType.LPStr)] string tensor_type_rules,
|
||||
[MarshalAs(UnmanagedType.I1)] bool convert_name);
|
||||
|
||||
//
|
||||
|
||||
|
||||
@ -16,7 +16,7 @@ public static unsafe class StableDiffusionCpp
|
||||
private static Native.sd_preview_cb_t? _previewCallback;
|
||||
// ReSharper restore NotAccessedField.Local
|
||||
|
||||
public static string ExpectedSDCommit => "43a70e8";
|
||||
public static string ExpectedSDCommit => "b87fe13";
|
||||
|
||||
#endregion
|
||||
|
||||
@ -51,14 +51,14 @@ public static unsafe class StableDiffusionCpp
|
||||
Native.sd_set_preview_callback(_previewCallback, mode, interval, denoised, noisy, null);
|
||||
}
|
||||
|
||||
public static void Convert(string modelPath, string vaePath, Quantization quantization, string outputPath, string tensorTypeRules = "")
|
||||
public static void Convert(string modelPath, string vaePath, Quantization quantization, string outputPath, bool convertName = false, string tensorTypeRules = "")
|
||||
{
|
||||
ArgumentException.ThrowIfNullOrWhiteSpace(nameof(modelPath));
|
||||
ArgumentException.ThrowIfNullOrWhiteSpace(nameof(outputPath));
|
||||
ArgumentNullException.ThrowIfNull(vaePath);
|
||||
if (!Enum.IsDefined(quantization)) throw new ArgumentOutOfRangeException(nameof(quantization));
|
||||
|
||||
Native.convert(modelPath, vaePath, outputPath, quantization, tensorTypeRules);
|
||||
Native.convert(modelPath, vaePath, outputPath, quantization, tensorTypeRules, convertName);
|
||||
}
|
||||
|
||||
public static string GetSystemInfo() => Native.sd_get_system_info();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user