|
#ifndef __STABLE_DIFFUSION_H__ |
|
#define __STABLE_DIFFUSION_H__ |
|
|
|
#if defined(_WIN32) || defined(__CYGWIN__) |
|
#ifndef SD_BUILD_SHARED_LIB |
|
#define SD_API |
|
#else |
|
#ifdef SD_BUILD_DLL |
|
#define SD_API __declspec(dllexport) |
|
#else |
|
#define SD_API __declspec(dllimport) |
|
#endif |
|
#endif |
|
#else |
|
#if __GNUC__ >= 4 |
|
#define SD_API __attribute__((visibility("default"))) |
|
#else |
|
#define SD_API |
|
#endif |
|
#endif |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
#include <stdbool.h> |
|
#include <stddef.h> |
|
#include <stdint.h> |
|
#include <string.h> |
|
|
|
enum rng_type_t { |
|
STD_DEFAULT_RNG, |
|
CUDA_RNG |
|
}; |
|
|
|
enum sample_method_t { |
|
EULER_A, |
|
EULER, |
|
HEUN, |
|
DPM2, |
|
DPMPP2S_A, |
|
DPMPP2M, |
|
DPMPP2Mv2, |
|
IPNDM, |
|
IPNDM_V, |
|
LCM, |
|
N_SAMPLE_METHODS |
|
}; |
|
|
|
enum schedule_t { |
|
DEFAULT, |
|
DISCRETE, |
|
KARRAS, |
|
EXPONENTIAL, |
|
AYS, |
|
GITS, |
|
N_SCHEDULES |
|
}; |
|
|
|
|
|
enum sd_type_t { |
|
SD_TYPE_F32 = 0, |
|
SD_TYPE_F16 = 1, |
|
SD_TYPE_Q4_0 = 2, |
|
SD_TYPE_Q4_1 = 3, |
|
|
|
|
|
SD_TYPE_Q5_0 = 6, |
|
SD_TYPE_Q5_1 = 7, |
|
SD_TYPE_Q8_0 = 8, |
|
SD_TYPE_Q8_1 = 9, |
|
SD_TYPE_Q2_K = 10, |
|
SD_TYPE_Q3_K = 11, |
|
SD_TYPE_Q4_K = 12, |
|
SD_TYPE_Q5_K = 13, |
|
SD_TYPE_Q6_K = 14, |
|
SD_TYPE_Q8_K = 15, |
|
SD_TYPE_IQ2_XXS = 16, |
|
SD_TYPE_IQ2_XS = 17, |
|
SD_TYPE_IQ3_XXS = 18, |
|
SD_TYPE_IQ1_S = 19, |
|
SD_TYPE_IQ4_NL = 20, |
|
SD_TYPE_IQ3_S = 21, |
|
SD_TYPE_IQ2_S = 22, |
|
SD_TYPE_IQ4_XS = 23, |
|
SD_TYPE_I8 = 24, |
|
SD_TYPE_I16 = 25, |
|
SD_TYPE_I32 = 26, |
|
SD_TYPE_I64 = 27, |
|
SD_TYPE_F64 = 28, |
|
SD_TYPE_IQ1_M = 29, |
|
SD_TYPE_BF16 = 30, |
|
SD_TYPE_Q4_0_4_4 = 31, |
|
SD_TYPE_Q4_0_4_8 = 32, |
|
SD_TYPE_Q4_0_8_8 = 33, |
|
SD_TYPE_TQ1_0 = 34, |
|
SD_TYPE_TQ2_0 = 35, |
|
SD_TYPE_IQ4_NL_4_4 = 36, |
|
|
|
|
|
SD_TYPE_COUNT = 39, |
|
}; |
|
|
|
SD_API const char* sd_type_name(enum sd_type_t type); |
|
|
|
enum sd_log_level_t { |
|
SD_LOG_DEBUG, |
|
SD_LOG_INFO, |
|
SD_LOG_WARN, |
|
SD_LOG_ERROR |
|
}; |
|
|
|
typedef void (*sd_log_cb_t)(enum sd_log_level_t level, const char* text, void* data); |
|
typedef void (*sd_progress_cb_t)(int step, int steps, float time, void* data); |
|
|
|
SD_API void sd_set_log_callback(sd_log_cb_t sd_log_cb, void* data); |
|
SD_API void sd_set_progress_callback(sd_progress_cb_t cb, void* data); |
|
SD_API int32_t sd_get_num_physical_cores(); |
|
SD_API const char* sd_get_system_info(); |
|
|
|
typedef struct { |
|
uint32_t width; |
|
uint32_t height; |
|
uint32_t channel; |
|
uint8_t* data; |
|
} sd_image_t; |
|
|
|
typedef struct sd_ctx_t sd_ctx_t; |
|
|
|
SD_API void set_sd_vae_tiling(sd_ctx_t* ctx, bool tiling); |
|
SD_API int get_loaded_sd_version(sd_ctx_t* ctx); |
|
|
|
SD_API sd_ctx_t* new_sd_ctx(const char* model_path, |
|
const char* clip_l_path, |
|
const char* clip_g_path, |
|
const char* t5xxl_path, |
|
const char* diffusion_model_path, |
|
const char* vae_path, |
|
const char* taesd_path, |
|
const char* control_net_path_c_str, |
|
const char* lora_model_dir, |
|
const char* embed_dir_c_str, |
|
const char* stacked_id_embed_dir_c_str, |
|
bool vae_decode_only, |
|
bool vae_tiling, |
|
bool free_params_immediately, |
|
int n_threads, |
|
enum sd_type_t wtype, |
|
enum rng_type_t rng_type, |
|
enum schedule_t s, |
|
bool keep_clip_on_cpu, |
|
bool keep_control_net_cpu, |
|
bool keep_vae_on_cpu, |
|
bool diffusion_flash_attn); |
|
|
|
SD_API void free_sd_ctx(sd_ctx_t* sd_ctx); |
|
|
|
SD_API sd_image_t* txt2img(sd_ctx_t* sd_ctx, |
|
const char* prompt, |
|
const char* negative_prompt, |
|
int clip_skip, |
|
float cfg_scale, |
|
float guidance, |
|
int width, |
|
int height, |
|
enum sample_method_t sample_method, |
|
int sample_steps, |
|
int64_t seed, |
|
int batch_count, |
|
const sd_image_t* control_cond, |
|
float control_strength, |
|
float style_strength, |
|
bool normalize_input, |
|
const char* input_id_images_path, |
|
int* skip_layers, |
|
size_t skip_layers_count, |
|
float slg_scale, |
|
float skip_layer_start, |
|
float skip_layer_end); |
|
|
|
SD_API sd_image_t* img2img(sd_ctx_t* sd_ctx, |
|
sd_image_t init_image, |
|
const char* prompt, |
|
const char* negative_prompt, |
|
int clip_skip, |
|
float cfg_scale, |
|
float guidance, |
|
int width, |
|
int height, |
|
enum sample_method_t sample_method, |
|
int sample_steps, |
|
float strength, |
|
int64_t seed, |
|
int batch_count, |
|
const sd_image_t* control_cond, |
|
float control_strength, |
|
float style_strength, |
|
bool normalize_input, |
|
const char* input_id_images_path, |
|
int* skip_layers, |
|
size_t skip_layers_count, |
|
float slg_scale, |
|
float skip_layer_start, |
|
float skip_layer_end); |
|
|
|
SD_API sd_image_t* img2vid(sd_ctx_t* sd_ctx, |
|
sd_image_t init_image, |
|
int width, |
|
int height, |
|
int video_frames, |
|
int motion_bucket_id, |
|
int fps, |
|
float augmentation_level, |
|
float min_cfg, |
|
float cfg_scale, |
|
enum sample_method_t sample_method, |
|
int sample_steps, |
|
float strength, |
|
int64_t seed); |
|
|
|
typedef struct upscaler_ctx_t upscaler_ctx_t; |
|
|
|
SD_API upscaler_ctx_t* new_upscaler_ctx(const char* esrgan_path, |
|
int n_threads); |
|
SD_API void free_upscaler_ctx(upscaler_ctx_t* upscaler_ctx); |
|
|
|
SD_API sd_image_t upscale(upscaler_ctx_t* upscaler_ctx, sd_image_t input_image, uint32_t upscale_factor); |
|
|
|
SD_API bool convert(const char* input_path, const char* vae_path, const char* output_path, enum sd_type_t output_type); |
|
|
|
SD_API uint8_t* preprocess_canny(uint8_t* img, |
|
int width, |
|
int height, |
|
float high_threshold, |
|
float low_threshold, |
|
float weak, |
|
float strong, |
|
bool inverse); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif |
|
|