| #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 |
|
|