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:
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/eevee_shadow_page_init_comp.glsl')
-rw-r--r--source/blender/draw/engines/eevee/shaders/eevee_shadow_page_init_comp.glsl41
1 files changed, 26 insertions, 15 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/eevee_shadow_page_init_comp.glsl b/source/blender/draw/engines/eevee/shaders/eevee_shadow_page_init_comp.glsl
index 0075bd2be92..adc00a18948 100644
--- a/source/blender/draw/engines/eevee/shaders/eevee_shadow_page_init_comp.glsl
+++ b/source/blender/draw/engines/eevee/shaders/eevee_shadow_page_init_comp.glsl
@@ -2,21 +2,18 @@
/**
* Virtual shadowmapping: Init page buffer.
*
+ * All pages are always owned by tiles. This step init all owners.
* This avoid mapping the buffer to host memory.
*/
#pragma BLENDER_REQUIRE(eevee_shadow_page_lib.glsl)
+#pragma BLENDER_REQUIRE(eevee_shadow_tilemap_lib.glsl)
layout(local_size_x = SHADOW_PAGE_PER_ROW) in;
layout(std430, binding = 1) restrict writeonly buffer pages_free_buf
{
- int pages_free[];
-};
-
-layout(std430, binding = 2) restrict writeonly buffer pages_buf
-{
- ShadowPagePacked pages[];
+ uint free_page_owners[];
};
layout(std430, binding = 3) restrict writeonly buffer pages_infos_buf
@@ -24,15 +21,29 @@ layout(std430, binding = 3) restrict writeonly buffer pages_infos_buf
ShadowPagesInfoData infos;
};
+layout(r32ui) restrict uniform uimage2D tilemaps_img;
+
void main()
{
- infos.page_free_next = SHADOW_MAX_PAGE - 1;
- infos.page_free_next_prev = 0;
- infos.page_updated_count = 0;
-
- pages_free[gl_GlobalInvocationID.x] = ShadowPagePacked(gl_GlobalInvocationID.x);
-
-#ifdef SHADOW_DEBUG_PAGE_ALLOCATION_ENABLED
- pages[gl_GlobalInvocationID.x] = SHADOW_PAGE_NO_DATA;
-#endif
+ if (gl_GlobalInvocationID == uvec3(0)) {
+ infos.page_free_next = SHADOW_MAX_PAGE - 1;
+ infos.page_free_next_prev = 0;
+ infos.page_updated_count = 0;
+ }
+
+ uint page_index = gl_GlobalInvocationID.x;
+
+ ivec2 texel = ivec2(page_index % (SHADOW_TILEMAP_PER_ROW * SHADOW_TILEMAP_RES),
+ page_index / (SHADOW_TILEMAP_PER_ROW * SHADOW_TILEMAP_RES));
+ free_page_owners[page_index] = packUvec2x16(uvec2(texel));
+
+ /* Start with a blank tile. */
+ ShadowTileData tile = shadow_tile_data_unpack(0u);
+ tile.page = uvec2(page_index % uint(SHADOW_PAGE_PER_ROW),
+ page_index / uint(SHADOW_PAGE_PER_ROW));
+ tile.free_page_owner_index = page_index;
+ tile.is_allocated = true;
+ tile.is_cached = true;
+ tile.do_update = true;
+ imageStore(tilemaps_img, texel, uvec4(shadow_tile_data_pack(tile)));
} \ No newline at end of file