This reduces the time needed to get to the first pixel on screen by multithreading the builtin shader compilation. We avoid doing this if subprocess compilation is on as the overhead of potentially partially starting all subprocess is far greater than the benefit of paralllel compilation. For some reasons, the compilation is much slower when done async for these shaders (on Metal ~200ms > ~1.2ms), so the saving might not be substantial. Mac M1: First frame 6s > 5s. Pull Request: https://projects.blender.org/blender/blender/pulls/139627
66 lines
1.2 KiB
C++
66 lines
1.2 KiB
C++
/* SPDX-FileCopyrightText: 2013 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#include "BKE_material.hh"
|
|
|
|
#include "GPU_batch.hh"
|
|
#include "GPU_init_exit.hh" /* interface */
|
|
#include "GPU_pass.hh"
|
|
|
|
#include "intern/gpu_private.hh"
|
|
#include "intern/gpu_shader_create_info_private.hh"
|
|
#include "intern/gpu_shader_dependency_private.hh"
|
|
|
|
/**
|
|
* although the order of initialization and shutdown should not matter
|
|
* (except for the extensions), I chose alphabetical and reverse alphabetical order
|
|
*/
|
|
static bool initialized = false;
|
|
|
|
void GPU_init()
|
|
{
|
|
/* can't avoid calling this multiple times, see wm_window_ghostwindow_add */
|
|
if (initialized) {
|
|
return;
|
|
}
|
|
|
|
initialized = true;
|
|
|
|
gpu_backend_init_resources();
|
|
|
|
gpu_shader_dependency_init();
|
|
gpu_shader_create_info_init();
|
|
|
|
GPU_shader_builtin_warm_up();
|
|
GPU_pass_cache_init();
|
|
|
|
gpu_batch_init();
|
|
}
|
|
|
|
void GPU_exit()
|
|
{
|
|
gpu_batch_exit();
|
|
|
|
GPU_pass_cache_free();
|
|
|
|
BKE_material_defaults_free_gpu();
|
|
GPU_shader_free_builtin_shaders();
|
|
|
|
gpu_backend_delete_resources();
|
|
|
|
gpu_shader_dependency_exit();
|
|
gpu_shader_create_info_exit();
|
|
|
|
initialized = false;
|
|
}
|
|
|
|
bool GPU_is_init()
|
|
{
|
|
return initialized;
|
|
}
|