41 std::atomic<blender::gpu::Shader *>
shader =
nullptr;
60 bool deferred_compilation,
74 GPUShaderCreateInfo *base_info =
reinterpret_cast<GPUShaderCreateInfo *
>(
create_info);
76 if (deferred_compilation) {
114 fprintf(stderr,
"blender::gpu::Shader: error: too many samplers in shader.\n");
140 GPUShaderCreateInfo *base_info =
reinterpret_cast<GPUShaderCreateInfo *
>(
create_info);
182 int previous_refcount = pass->
refcount++;
189 int previous_refcount = pass->
refcount--;
217 static constexpr float gc_collect_rate_ = 60.0f;
218 static constexpr float optimization_gc_collect_rate_ = 1.0f;
226 bool deferred_compilation,
227 bool is_optimization_pass)
229 std::lock_guard
lock(mutex_);
231 passes_[engine][is_optimization_pass].add(
234 deferred_compilation,
235 is_optimization_pass,
242 bool is_optimization_pass)
244 std::lock_guard
lock(mutex_);
245 std::unique_ptr<GPUPass> *pass = passes_[engine][is_optimization_pass].lookup_ptr(
hash);
246 if (!allow_deferred && pass && pass->get()->status ==
GPU_PASS_QUEUED) {
247 pass->get()->finalize_compilation();
249 return pass ? pass->get() :
nullptr;
254 std::lock_guard
lock(mutex_);
259 for (
auto &engine_passes : passes_) {
260 for (std::unique_ptr<GPUPass> &pass : engine_passes[
false].values()) {
261 pass->update(timestamp);
264 engine_passes[
false].remove_if(
265 [&](
auto item) {
return item.value->should_gc(gc_collect_rate_, timestamp); });
269 for (
auto &engine_passes : passes_) {
270 for (std::unique_ptr<GPUPass> &pass : engine_passes[
true].values()) {
271 pass->update(timestamp);
274 engine_passes[
true].remove_if([&](
auto item) {
275 return item.value->should_gc(optimization_gc_collect_rate_, timestamp);
300 g_cache = MEM_new<GPUPassCache>(__func__);
327 int samplers_len = 0;
344 const char *debug_name,
346 bool deferred_compilation,
355 if (optimize_graph) {
363 GPUCodegen codegen(material, graph, debug_name);
369 if (!optimize_graph) {
376 pass =
g_cache->get(engine, codegen.
hash_get(), deferred_compilation, optimize_graph);
388 finalize_source_cb(thunk, material, &codegen.
output);
391 g_cache->add(engine, codegen, deferred_compilation, optimize_graph);
394 return g_cache->get(engine, codegen.
hash_get(), deferred_compilation, optimize_graph);
#define BLI_assert_msg(a, msg)
Platform independent time functions.
double BLI_time_now_seconds(void)
#define UNUSED_VARS_NDEBUG(...)
int GPU_max_textures_frag()
int GPU_max_textures_vert()
GPUBackendType GPU_backend_get_type()
void(*)(void *thunk, GPUMaterial *mat, struct GPUCodegenOutput *codegen) GPUCodegenCallbackFn
#define GPU_SHADER_FREE_SAFE(shader)
blender::gpu::Shader * GPU_shader_create_from_info(const GPUShaderCreateInfo *_info)
void GPU_shader_batch_wait_for_all()
blender::Vector< blender::gpu::Shader * > GPU_shader_batch_finalize(BatchHandle &handle)
bool GPU_shader_batch_is_ready(BatchHandle handle)
void GPU_shader_batch_cancel(BatchHandle &handle)
BatchHandle GPU_shader_batch_create_from_infos(blender::Span< const GPUShaderCreateInfo * > infos, CompilationPriority priority=CompilationPriority::High)
Read Guarded memory(de)allocation.
unsigned long long int uint64_t
GPUPass * get(eGPUMaterialEngine engine, size_t hash, bool allow_deferred, bool is_optimization_pass)
void add(eGPUMaterialEngine engine, GPUCodegen &codegen, bool deferred_compilation, bool is_optimization_pass)
bool should_optimize_heuristic() const
GPUCodegenCreateInfo * create_info
void generate_cryptomatte()
void generate_resources()
uint32_t hash_get() const
void generate_uniform_buffer()
void gpu_node_graph_finalize_uniform_attrs(GPUNodeGraph *graph)
void gpu_node_graph_optimize(GPUNodeGraph *graph)
void gpu_node_graph_prune_unused(GPUNodeGraph *graph)
blender::gpu::Shader * GPU_pass_shader_get(GPUPass *pass)
uint64_t GPU_pass_global_compilation_count()
static bool gpu_pass_validate(GPUCodegenCreateInfo *create_info)
void GPU_pass_ensure_its_ready(GPUPass *pass)
static GPUPassCache * g_cache
void GPU_pass_cache_wait_for_all()
GPUPassStatus GPU_pass_status(GPUPass *pass)
void GPU_pass_cache_init()
void GPU_pass_release(GPUPass *pass)
void GPU_pass_acquire(GPUPass *pass)
void GPU_pass_cache_update()
GPUPass * GPU_generate_pass(GPUMaterial *material, GPUNodeGraph *graph, const char *debug_name, eGPUMaterialEngine engine, bool deferred_compilation, GPUCodegenCallbackFn finalize_source_cb, void *thunk, bool optimize_graph)
uint64_t GPU_pass_compilation_timestamp(GPUPass *pass)
bool GPU_pass_should_optimize(GPUPass *pass)
void GPU_pass_cache_free()
GPUPass(GPUCodegenCreateInfo *info, bool deferred_compilation, bool is_optimization_pass, bool should_optimize)
void finalize_compilation()
bool is_optimization_pass
std::atomic< GPUPassStatus > status
static constexpr float optimization_delay
void update_gc_timestamp(double timestamp)
static std::atomic< uint64_t > compilation_counts
std::atomic< blender::gpu::Shader * > shader
BatchHandle compilation_handle
double creation_timestamp
void update(double timestamp)
bool should_gc(int gc_collect_rate, double timestamp)
std::atomic< int > refcount
void update_compilation(double timestamp)
GPUCodegenCreateInfo * create_info
uint64_t compilation_timestamp
CompilationPriority compilation_priority()
void finalize(const bool recursive=false)
Vector< Resource > resources_get_all_() const