diff options
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.glsl | 41 |
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 |