Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2021-12-10 20:19:47 +0300
committerClément Foucault <foucault.clem@gmail.com>2021-12-10 20:19:47 +0300
commit55a6a8900aec81e94f4d82401d6051e3b5507c0e (patch)
treee3f1b065ebc6ca3dfe9d7cfe995bc400ce7d16be /source/blender
parent36bec765e2edbe07d8137fc019f7db7d3292875d (diff)
EEVEE: Shadow: Avoid double rendering
The update flag was not being cleared after the opaque pass, making the updates of the forward pass re-render the same tiles.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/draw/engines/eevee/eevee_shadow.cc8
-rw-r--r--source/blender/draw/engines/eevee/eevee_shadow.hh2
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_shadow_tilemap_setup_comp.glsl10
3 files changed, 13 insertions, 7 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_shadow.cc b/source/blender/draw/engines/eevee/eevee_shadow.cc
index ae026db0efb..70eb49ec487 100644
--- a/source/blender/draw/engines/eevee/eevee_shadow.cc
+++ b/source/blender/draw/engines/eevee/eevee_shadow.cc
@@ -711,6 +711,7 @@ void ShadowModule::end_sync(void)
DRW_shgroup_vertex_buffer(grp, "pages_free_buf", pages_free_data_);
DRW_shgroup_vertex_buffer(grp, "tilemaps_buf", tilemap_allocator.tilemaps_data);
DRW_shgroup_uniform_image(grp, "tilemaps_img", tilemap_allocator.tilemap_tx);
+ DRW_shgroup_uniform_bool(grp, "do_tilemap_setup", &do_tilemap_setup_, 1);
int64_t tilemaps_updated_len = tilemaps_len + tilemap_allocator.deleted_maps_len;
if (tilemaps_updated_len > 0) {
DRW_shgroup_call_compute(grp, 1, 1, tilemaps_updated_len);
@@ -1074,9 +1075,12 @@ void ShadowModule::set_view(const DRWView *view, GPUTexture *depth_tx)
tilemap_allocator.tilemap_tx.clear((uint)0);
DRW_draw_pass(page_init_ps_);
}
- do_tilemap_setup_ = false;
- DRW_draw_pass(tilemap_setup_ps_);
+ }
+ /* Run every every time but only process tilemap update once. */
+ DRW_draw_pass(tilemap_setup_ps_);
+ if (do_tilemap_setup_) {
DRW_draw_pass(tilemap_update_tag_ps_);
+ do_tilemap_setup_ = false;
}
if (do_process_view) {
DRW_draw_pass(tilemap_visibility_ps_);
diff --git a/source/blender/draw/engines/eevee/eevee_shadow.hh b/source/blender/draw/engines/eevee/eevee_shadow.hh
index 2bc252d4f8e..65456f11326 100644
--- a/source/blender/draw/engines/eevee/eevee_shadow.hh
+++ b/source/blender/draw/engines/eevee/eevee_shadow.hh
@@ -474,7 +474,7 @@ class ShadowModule {
DRWCallBuffer *casters_updated_;
DRWCallBuffer *receivers_non_opaque_;
- bool do_tilemap_setup_ = true;
+ int do_tilemap_setup_ = true;
const DRWView *last_processed_view = nullptr;
float tilemap_pixel_radius_;
float screen_pixel_radius_inv_;
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_shadow_tilemap_setup_comp.glsl b/source/blender/draw/engines/eevee/shaders/eevee_shadow_tilemap_setup_comp.glsl
index 92a0c3d6d14..d6f01f6326e 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_shadow_tilemap_setup_comp.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_shadow_tilemap_setup_comp.glsl
@@ -29,12 +29,14 @@ layout(std430, binding = 3) restrict buffer pages_infos_buf
layout(r32ui) restrict uniform uimage2D tilemaps_img;
+uniform bool do_tilemap_setup;
+
void main()
{
ShadowTileMapData tilemap = tilemaps[gl_GlobalInvocationID.z];
-
+ ivec2 grid_shift = (do_tilemap_setup) ? tilemap.grid_shift : ivec2(0);
ivec2 tile_co = ivec2(gl_GlobalInvocationID.xy);
- ivec2 tile_shifted = tile_co + tilemap.grid_shift;
+ ivec2 tile_shifted = tile_co + grid_shift;
/* Still load a valid tile after the shifting in order to not loose any page reference.
* This way the tile can even be reused if it is needed. Also avoid negative modulo. */
ivec2 tile_wrapped = (tile_shifted + SHADOW_TILEMAP_RES) % SHADOW_TILEMAP_RES;
@@ -52,7 +54,7 @@ void main()
tile_data.do_update = true;
}
- if (tilemap.grid_shift != ivec2(0) && tile_data.is_cached) {
+ if (grid_shift != ivec2(0) && tile_data.is_cached) {
/* Update page location after shift. */
free_page_owners[tile_data.free_page_owner_index] = packUvec2x16(uvec2(texel_out));
}
@@ -61,7 +63,7 @@ void main()
if (tilemap.is_cubeface) {
/* Cubemap shift update is always all or nothing. */
- bool do_update = (tilemap.grid_shift.x != 0);
+ bool do_update = (grid_shift.x != 0);
/* Number of lod0 tiles covered by the current lod level (in one dimension). */
uint lod_stride = 1u << 1u;