|
|
|
|
@@ -857,7 +857,7 @@ void ShadowModule::begin_sync()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
/** Use depth buffer to tag needed shadow pages for opaque geometry. */
|
|
|
|
|
/* Use depth buffer to tag needed shadow pages for opaque geometry. */
|
|
|
|
|
PassMain::Sub &sub = pass.sub("Opaque");
|
|
|
|
|
sub.shader_set(inst_.shaders.static_shader_get(SHADOW_TILEMAP_TAG_USAGE_OPAQUE));
|
|
|
|
|
sub.bind_ssbo("tilemaps_buf", &tilemap_pool.tilemaps_data);
|
|
|
|
|
@@ -868,7 +868,7 @@ void ShadowModule::begin_sync()
|
|
|
|
|
sub.dispatch(&dispatch_depth_scan_size_);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
/** Use bounding boxes for transparent geometry. */
|
|
|
|
|
/* Use bounding boxes for transparent geometry. */
|
|
|
|
|
PassMain::Sub &sub = pass.sub("Transparent");
|
|
|
|
|
/* WORKAROUND: The DRW_STATE_WRITE_STENCIL is here only to avoid enabling the rasterizer
|
|
|
|
|
* discard inside draw manager. */
|
|
|
|
|
@@ -1012,7 +1012,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
pass.init();
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
/** Clear tile-map clip buffer. */
|
|
|
|
|
/* Clear tile-map clip buffer. */
|
|
|
|
|
PassSimple::Sub &sub = pass.sub("ClearClipmap");
|
|
|
|
|
sub.shader_set(inst_.shaders.static_shader_get(SHADOW_CLIPMAP_CLEAR));
|
|
|
|
|
sub.bind_ssbo("tilemaps_clip_buf", tilemap_pool.tilemaps_clip);
|
|
|
|
|
@@ -1023,7 +1023,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
/** Compute near/far clip distances for directional shadows based on casters bounds. */
|
|
|
|
|
/* Compute near/far clip distances for directional shadows based on casters bounds. */
|
|
|
|
|
PassSimple::Sub &sub = pass.sub("DirectionalBounds");
|
|
|
|
|
sub.shader_set(inst_.shaders.static_shader_get(SHADOW_TILEMAP_BOUNDS));
|
|
|
|
|
sub.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_data);
|
|
|
|
|
@@ -1039,7 +1039,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
sub.barrier(GPU_BARRIER_SHADER_STORAGE);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
/** Clear usage bits. Tag update from the tile-map for sun shadow clip-maps shifting. */
|
|
|
|
|
/* Clear usage bits. Tag update from the tile-map for sun shadow clip-maps shifting. */
|
|
|
|
|
PassSimple::Sub &sub = pass.sub("Init");
|
|
|
|
|
sub.shader_set(inst_.shaders.static_shader_get(SHADOW_TILEMAP_INIT));
|
|
|
|
|
sub.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_data);
|
|
|
|
|
@@ -1047,7 +1047,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
sub.bind_ssbo("tiles_buf", tilemap_pool.tiles_data);
|
|
|
|
|
sub.bind_ssbo("pages_cached_buf", pages_cached_data_);
|
|
|
|
|
sub.dispatch(int3(1, 1, tilemap_pool.tilemaps_data.size()));
|
|
|
|
|
/** Free unused tiles from tile-maps not used by any shadow. */
|
|
|
|
|
/* Free unused tiles from tile-maps not used by any shadow. */
|
|
|
|
|
if (tilemap_pool.tilemaps_unused.size() > 0) {
|
|
|
|
|
sub.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_unused);
|
|
|
|
|
sub.dispatch(int3(1, 1, tilemap_pool.tilemaps_unused.size()));
|
|
|
|
|
@@ -1055,7 +1055,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
sub.barrier(GPU_BARRIER_SHADER_STORAGE);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
/** Mark for update all shadow pages touching an updated shadow caster. */
|
|
|
|
|
/* Mark for update all shadow pages touching an updated shadow caster. */
|
|
|
|
|
PassSimple::Sub &sub = pass.sub("CasterUpdate");
|
|
|
|
|
sub.shader_set(inst_.shaders.static_shader_get(SHADOW_TILEMAP_TAG_UPDATE));
|
|
|
|
|
sub.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_data);
|
|
|
|
|
@@ -1099,7 +1099,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
PassSimple &pass = tilemap_update_ps_;
|
|
|
|
|
pass.init();
|
|
|
|
|
{
|
|
|
|
|
/** Mark tiles that are redundant in the mipmap chain as unused. */
|
|
|
|
|
/* Mark tiles that are redundant in the mipmap chain as unused. */
|
|
|
|
|
PassSimple::Sub &sub = pass.sub("MaskLod");
|
|
|
|
|
sub.shader_set(inst_.shaders.static_shader_get(SHADOW_PAGE_MASK));
|
|
|
|
|
sub.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_data);
|
|
|
|
|
@@ -1108,7 +1108,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
sub.barrier(GPU_BARRIER_SHADER_STORAGE);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
/** Free unused pages & Reclaim cached pages. */
|
|
|
|
|
/* Free unused pages & Reclaim cached pages. */
|
|
|
|
|
PassSimple::Sub &sub = pass.sub("Free");
|
|
|
|
|
sub.shader_set(inst_.shaders.static_shader_get(SHADOW_PAGE_FREE));
|
|
|
|
|
sub.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_data);
|
|
|
|
|
@@ -1117,7 +1117,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
sub.bind_ssbo("pages_free_buf", pages_free_data_);
|
|
|
|
|
sub.bind_ssbo("pages_cached_buf", pages_cached_data_);
|
|
|
|
|
sub.dispatch(int3(1, 1, tilemap_pool.tilemaps_data.size()));
|
|
|
|
|
/** Free unused tiles from tile-maps not used by any shadow. */
|
|
|
|
|
/* Free unused tiles from tile-maps not used by any shadow. */
|
|
|
|
|
if (tilemap_pool.tilemaps_unused.size() > 0) {
|
|
|
|
|
sub.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_unused);
|
|
|
|
|
sub.dispatch(int3(1, 1, tilemap_pool.tilemaps_unused.size()));
|
|
|
|
|
@@ -1125,7 +1125,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
sub.barrier(GPU_BARRIER_SHADER_STORAGE);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
/** De-fragment the free page heap after cache reuse phase which can leave hole. */
|
|
|
|
|
/* De-fragment the free page heap after cache reuse phase which can leave hole. */
|
|
|
|
|
PassSimple::Sub &sub = pass.sub("Defrag");
|
|
|
|
|
sub.shader_set(inst_.shaders.static_shader_get(SHADOW_PAGE_DEFRAG));
|
|
|
|
|
sub.bind_ssbo("pages_infos_buf", pages_infos_data_);
|
|
|
|
|
@@ -1138,7 +1138,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
sub.barrier(GPU_BARRIER_SHADER_STORAGE);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
/** Assign pages to tiles that have been marked as used but possess no page. */
|
|
|
|
|
/* Assign pages to tiles that have been marked as used but possess no page. */
|
|
|
|
|
PassSimple::Sub &sub = pass.sub("AllocatePages");
|
|
|
|
|
sub.shader_set(inst_.shaders.static_shader_get(SHADOW_PAGE_ALLOCATE));
|
|
|
|
|
sub.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_data);
|
|
|
|
|
@@ -1151,7 +1151,7 @@ void ShadowModule::end_sync()
|
|
|
|
|
sub.barrier(GPU_BARRIER_SHADER_STORAGE);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
/** Convert the unordered tiles into a texture used during shading. Creates views. */
|
|
|
|
|
/* Convert the unordered tiles into a texture used during shading. Creates views. */
|
|
|
|
|
PassSimple::Sub &sub = pass.sub("Finalize");
|
|
|
|
|
sub.shader_set(inst_.shaders.static_shader_get(SHADOW_TILEMAP_FINALIZE));
|
|
|
|
|
sub.bind_ssbo("tilemaps_buf", tilemap_pool.tilemaps_data);
|
|
|
|
|
|