From 2eb447b00fdcf2b5953c4b2c22e18eb2bb7864dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Fri, 25 Aug 2023 10:49:40 +0200 Subject: [PATCH] EEVEE-Next: Shadow: Fix shader compilation Some platforms do not support `bool` type as shared variables, and no component reference for atomics. --- .../eevee_shadow_tilemap_finalize_comp.glsl | 23 ++++++++++++------- .../eevee_shadow_tilemap_init_comp.glsl | 8 +++---- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_finalize_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_finalize_comp.glsl index 9bfdfebe738..b711589970f 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_finalize_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_finalize_comp.glsl @@ -15,8 +15,10 @@ #pragma BLENDER_REQUIRE(common_math_lib.glsl) #pragma BLENDER_REQUIRE(eevee_shadow_tilemap_lib.glsl) -shared ivec2 rect_min; -shared ivec2 rect_max; +shared int rect_min_x; +shared int rect_min_y; +shared int rect_max_x; +shared int rect_max_y; shared int view_index; /** @@ -68,8 +70,10 @@ void main() /* Compute update area. */ if (all(equal(gl_LocalInvocationID, uvec3(0)))) { - rect_min = ivec2(SHADOW_TILEMAP_RES); - rect_max = ivec2(0); + rect_min_x = SHADOW_TILEMAP_RES; + rect_min_y = SHADOW_TILEMAP_RES; + rect_max_x = 0; + rect_max_y = 0; view_index = -1; } @@ -78,14 +82,17 @@ void main() bool lod_valid_thread = all(equal(tile_co, tile_co_lod << lod)); bool do_page_render = tile.is_used && tile.do_update && lod_valid_thread; if (do_page_render) { - atomicMin(rect_min.x, tile_co_lod.x); - atomicMin(rect_min.y, tile_co_lod.y); - atomicMax(rect_max.x, tile_co_lod.x + 1); - atomicMax(rect_max.y, tile_co_lod.y + 1); + atomicMin(rect_min_x, tile_co_lod.x); + atomicMin(rect_min_y, tile_co_lod.y); + atomicMax(rect_max_x, tile_co_lod.x + 1); + atomicMax(rect_max_y, tile_co_lod.y + 1); } barrier(); + ivec2 rect_min = ivec2(rect_min_x, rect_min_y); + ivec2 rect_max = ivec2(rect_max_x, rect_max_y); + int viewport_index = viewport_select(rect_max - rect_min); ivec2 viewport_size = viewport_size_get(viewport_index); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_init_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_init_comp.glsl index bbd69b7d4e2..bef0931b651 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_init_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tilemap_init_comp.glsl @@ -14,7 +14,7 @@ #pragma BLENDER_REQUIRE(common_math_lib.glsl) #pragma BLENDER_REQUIRE(eevee_shadow_tilemap_lib.glsl) -shared bool directional_range_changed; +shared int directional_range_changed; ShadowTileDataPacked init_tile_data(ShadowTileDataPacked tile, bool do_update) { @@ -39,7 +39,7 @@ void main() /* Reset shift to not tag for update more than once per sync cycle. */ tilemaps_buf[tilemap_index].grid_shift = ivec2(0); - directional_range_changed = false; + directional_range_changed = 0; int clip_index = tilemap.clip_data_index; if (clip_index == -1) { @@ -51,7 +51,7 @@ void main() float clip_far_new = orderedIntBitsToFloat(clip_data.clip_far); bool near_changed = clip_near_new != clip_data.clip_near_stored; bool far_changed = clip_far_new != clip_data.clip_far_stored; - directional_range_changed = near_changed || far_changed; + directional_range_changed = int(near_changed || far_changed); /* NOTE(fclem): This assumes clip near/far are computed each time the initial phase runs. */ tilemaps_clip_buf[clip_index].clip_near_stored = clip_near_new; tilemaps_clip_buf[clip_index].clip_far_stored = clip_far_new; @@ -78,7 +78,7 @@ void main() bool do_update = !in_range_inclusive(tile_shifted, ivec2(0), ivec2(SHADOW_TILEMAP_RES - 1)); /* TODO(fclem): Might be better to resize the depth stored instead of a full render update. */ - if (directional_range_changed) { + if (directional_range_changed != 0) { do_update = true; }