54 #define USE_DEFERRED_COMPILATION 1
115 if (use_main_context_workaround) {
170 if (use_main_context_workaround) {
221 const bool job_own_context = !use_main_context;
262 if (use_main_context) {
333 const char *vert,
const char *geom,
const char *frag,
const char *defines,
const char *name)
346 char *vert_with_lib =
NULL;
347 char *frag_with_lib =
NULL;
348 char *geom_with_lib =
NULL;
392 const char **varying_names,
393 const int varying_count)
429 const void *engine_type,
445 const void *engine_type,
463 const void *engine_type,
465 const bool is_volume_shader,
468 const char *frag_lib,
505 const void *engine_type,
507 const bool is_volume_shader,
510 const char *frag_lib,
565 #define MAX_LIB_NAME 64
566 #define MAX_LIB_DEPS 8
586 for (
int i = 0; i <
MAX_LIB; i++) {
604 const char *haystack = lib_code;
605 while ((haystack = strstr(haystack,
"BLENDER_REQUIRE("))) {
611 while ((*haystack !=
')') && (i < (
sizeof(dbg_name) - 2))) {
612 dbg_name[i] = *haystack;
616 dbg_name[i + 1] =
'\0';
619 "Error: Dependency not found: %s\n"
620 "This might be due to bad lib ordering.\n",
634 for (
int i = 0; i <
MAX_LIB; i++) {
647 printf(
"Error: Too many libraries. Cannot add %s.\n", lib_name);
660 for (
int i =
MAX_LIB - 1; i > -1; i--) {
666 for (
int i = 0; i <
MAX_LIB; i++) {
typedef float(TangentPoint)[2]
struct wmWindowManager * CTX_wm_manager(const bContext *C)
struct wmWindow * CTX_wm_window(const bContext *C)
A dynamically sized string ADT.
DynStr * BLI_dynstr_new(void) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_dynstr_free(DynStr *ds) ATTR_NONNULL()
char * BLI_dynstr_get_cstring(DynStr *ds) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_dynstr_append(DynStr *__restrict ds, const char *cstr) ATTR_NONNULL()
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void void void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) ATTR_NONNULL(1
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_poptail(ListBase *listbase) ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
#define BLI_string_joinN(...)
pthread_spinlock_t SpinLock
void BLI_mutex_end(ThreadMutex *mutex)
void BLI_mutex_init(ThreadMutex *mutex)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
void BLI_spin_init(SpinLock *spin)
void BLI_spin_unlock(SpinLock *spin)
void BLI_spin_lock(SpinLock *spin)
pthread_mutex_t ThreadMutex
void BLI_spin_end(SpinLock *spin)
struct ID * DEG_get_original_id(struct ID *id)
Object is a sort of wrapper for general info.
void DRW_opengl_context_disable_ex(bool restore)
void DRW_opengl_context_enable_ex(bool restore)
void(* GPUMaterialEvalCallbackFn)(struct GPUMaterial *mat, int options, const char **vert_code, const char **geom_code, const char **frag_lib, const char **defines)
bool GPU_use_main_context_workaround(void)
struct GPUContext GPUContext
void GPU_context_main_lock(void)
void GPU_context_discard(GPUContext *)
GPUContext * GPU_context_create(void *ghost_window)
void GPU_context_active_set(GPUContext *)
void GPU_context_main_unlock(void)
void GPU_material_compile(GPUMaterial *mat)
GPUMaterial * GPU_material_from_nodetree(struct Scene *scene, struct Material *ma, struct bNodeTree *ntree, struct ListBase *gpumaterials, const void *engine_type, const int options, const bool is_volume_shader, const char *vert_code, const char *geom_code, const char *frag_lib, const char *defines, const char *name, GPUMaterialEvalCallbackFn callback)
struct Scene * GPU_material_scene(GPUMaterial *material)
eGPUMaterialStatus GPU_material_status(GPUMaterial *mat)
GPUMaterial * GPU_material_from_nodetree_find(struct ListBase *gpumaterials, const void *engine_type, int options)
GPUShader * GPU_shader_create(const char *vertcode, const char *fragcode, const char *geomcode, const char *libcode, const char *defines, const char *shname)
struct GPUShader GPUShader
GPUShader * GPU_shader_create_ex(const char *vertcode, const char *fragcode, const char *geomcode, const char *libcode, const char *defines, const eGPUShaderTFBType tf_type, const char **tf_names, const int tf_count, const char *shname)
void GPU_shader_free(GPUShader *shader)
@ WM_JOB_TYPE_SHADER_COMPILATION
CCL_NAMESPACE_BEGIN struct Options options
DEGForeachIDComponentCallback callback
bool DRW_state_is_image_render(void)
GPUShader * DRW_shader_create_with_lib_ex(const char *vert, const char *geom, const char *frag, const char *lib, const char *defines, const char *name)
GPUShader * DRW_shader_create_with_transform_feedback(const char *vert, const char *geom, const char *defines, const eGPUShaderTFBType prim_type, const char **varying_names, const int varying_count)
char datatoc_gpu_shader_depth_only_frag_glsl[]
GPUShader * DRW_shader_create_ex(const char *vert, const char *geom, const char *frag, const char *defines, const char *name)
GPUMaterial * DRW_shader_find_from_material(Material *ma, const void *engine_type, const int options, bool deferred)
static void drw_deferred_shader_compilation_exec(void *custom_data, short *stop, short *do_update, float *progress)
void DRW_shader_free(GPUShader *shader)
struct DRWShaderCompiler DRWShaderCompiler
struct DRWDeferredShader DRWDeferredShader
GPUMaterial * DRW_shader_create_from_world(struct Scene *scene, World *wo, struct bNodeTree *ntree, const void *engine_type, const int options, const bool is_volume_shader, const char *vert, const char *geom, const char *frag_lib, const char *defines, bool deferred, GPUMaterialEvalCallbackFn callback)
void DRW_shader_library_add_file(DRWShaderLibrary *lib, char *lib_code, const char *lib_name)
char datatoc_common_fullscreen_vert_glsl[]
static int drw_shader_library_search(const DRWShaderLibrary *lib, const char *name)
void DRW_shader_library_free(DRWShaderLibrary *lib)
static uint32_t drw_shader_dependencies_get(const DRWShaderLibrary *lib, const char *lib_code)
static void drw_deferred_shader_queue_free(ListBase *queue)
GPUShader * DRW_shader_create_fullscreen_ex(const char *frag, const char *defines, const char *name)
GPUShader * DRW_shader_create_with_shaderlib_ex(const char *vert, const char *geom, const char *frag, const DRWShaderLibrary *lib, const char *defines, const char *name)
DRWShaderLibrary * DRW_shader_library_create(void)
GPUShader * DRW_shader_create_fullscreen_with_shaderlib_ex(const char *frag, const DRWShaderLibrary *lib, const char *defines, const char *name)
GPUMaterial * DRW_shader_create_from_material(struct Scene *scene, Material *ma, struct bNodeTree *ntree, const void *engine_type, const int options, const bool is_volume_shader, const char *vert, const char *geom, const char *frag_lib, const char *defines, bool deferred, GPUMaterialEvalCallbackFn callback)
#define USE_DEFERRED_COMPILATION
char * DRW_shader_library_create_shader_string(const DRWShaderLibrary *lib, const char *shader_code)
char datatoc_gpu_shader_3D_vert_glsl[]
static void drw_deferred_shader_add(GPUMaterial *mat, bool deferred)
void DRW_deferred_shader_remove(GPUMaterial *mat)
static void drw_deferred_shader_free(DRWDeferredShader *dsh)
static void drw_deferred_shader_compilation_free(void *custom_data)
char datatoc_gpu_shader_2D_vert_glsl[]
GPUMaterial * DRW_shader_find_from_world(World *wo, const void *engine_type, const int options, bool deferred)
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
ThreadQueue * queue
all scheduled work for the cpu
const struct bContext * evil_C
struct DRWDeferredShader * prev
struct DRWDeferredShader * next
DRWDeferredShader * mat_compiling
ThreadMutex compilation_lock
uint32_t libs_deps[MAX_LIB]
char libs_name[MAX_LIB][MAX_LIB_NAME]
void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
wmJob * WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, const char *name, int flag, int job_type)
bool WM_jobs_test(wmWindowManager *wm, void *owner, int job_type)
void WM_jobs_delay_start(wmJob *wm_job, double delay_time)
void WM_jobs_callbacks(wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *))
void * WM_jobs_customdata_get(wmJob *wm_job)
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *))
void WM_jobs_timer(wmJob *wm_job, double timestep, unsigned int note, unsigned int endnote)
void * WM_opengl_context_create(void)
void wm_window_reset_drawable(void)
void WM_opengl_context_activate(void *context)
void WM_opengl_context_release(void *context)
void WM_opengl_context_dispose(void *context)