Implement async shader compilation plus caching for GL ES 3

Async. compilation via ubershader is currently available in the scene and particles shaders only.

Bonus:
- Use `#if defined()` syntax for not true conditionals, so they don't unnecessarily take a bit in the version flagset.
- Remove unused `ENABLE_CLIP_ALPHA` from scene shader.
- Remove unused `PARTICLES_COPY` from the particles shader.
- Remove unused uniform related code.
- Shader language/compiler: use ordered hash maps for deterministic code generation (needed for caching).
This commit is contained in:
Pedro J. Estébanez
2021-09-26 21:31:17 +02:00
parent b6f04dfd21
commit 4c710780d4
43 changed files with 2169 additions and 669 deletions

View File

@ -207,6 +207,7 @@ void RasterizerGLES3::begin_frame(double frame_step) {
storage->frame.time[2] = Math::fmod(time_total, 900);
storage->frame.time[3] = Math::fmod(time_total, 60);
storage->frame.count++;
storage->frame.shader_compiles_started = 0;
storage->frame.delta = frame_step;
storage->update_dirty_resources();
@ -214,6 +215,8 @@ void RasterizerGLES3::begin_frame(double frame_step) {
storage->info.render_final = storage->info.render;
storage->info.render.reset();
ShaderGLES3::current_frame = storage->frame.count;
scene->iteration();
}
@ -410,6 +413,8 @@ void RasterizerGLES3::end_frame(bool p_swap_buffers) {
}
}
ShaderGLES3::advance_async_shaders_compilation();
if (p_swap_buffers) {
OS::get_singleton()->swap_buffers();
} else {
@ -487,6 +492,8 @@ RasterizerGLES3::RasterizerGLES3() {
time_total = 0;
time_scale = 1;
ShaderGLES3::compiles_started_this_frame = &storage->frame.shader_compiles_started;
}
RasterizerGLES3::~RasterizerGLES3() {