skip rendering the next frame under vulkan, as this fixes the crash on scene load when the scene graph storage buffers need to be resized (even though nothing makes sense)

This commit is contained in:
ecker 2025-08-20 15:22:35 -05:00
parent 81a3125fcd
commit e5de1491f2
9 changed files with 20 additions and 10 deletions

View File

@ -103,7 +103,8 @@
"batch queue submissions": true,
"dedicated thread": false,
"memory budget": false,
"register render modes": true
"register render modes": true,
"skip render on rebuild": true
},
"invariant": {
"default stage buffers": true,
@ -114,7 +115,7 @@
"pipelines": {
"deferred": true,
"gui": true,
"vsync": false,
"vsync": false, // vsync on vulkan side rather than engine-side
"hdr": true,
"vxgi": true,
"culling": true,

View File

@ -78,7 +78,7 @@
"stream": {
"tag": "worldspawn",
"player": "info_player_spawn",
"enabled": true, // "auto",
"enabled": "auto",
"radius": 16,
"every": 1
}

View File

@ -1 +1 @@
opengl
vulkan

View File

@ -35,6 +35,7 @@ namespace ext {
extern UF_API bool rebuildOnTickBegin;
extern UF_API bool batchQueueSubmissions;
extern UF_API bool registerRenderMode;
extern UF_API bool skipRenderOnRebuild;
}
namespace validation {

View File

@ -120,6 +120,7 @@ namespace ext {
extern UF_API bool enableMultiGPU;
extern UF_API bool memoryBudgetBit;
extern UF_API bool registerRenderMode;
extern UF_API bool skipRenderOnRebuild;
}
namespace validation {

View File

@ -501,6 +501,7 @@ void UF_API uf::initialize() {
#endif
uf::renderer::settings::experimental::rebuildOnTickBegin = configRenderExperimentalJson["rebuild on tick begin"].as( uf::renderer::settings::experimental::rebuildOnTickBegin );
uf::renderer::settings::experimental::skipRenderOnRebuild = configRenderExperimentalJson["skip render on rebuild"].as( uf::renderer::settings::experimental::skipRenderOnRebuild );
uf::renderer::settings::invariant::deferredMode = configRenderInvariantJson["deferred mode"].as( uf::renderer::settings::invariant::deferredMode );

View File

@ -17,18 +17,17 @@
#define UF_DEBUG_TIMER_MULTITRACE_START(...) UF_TIMER_MULTITRACE_START(__VA_ARGS__)
#define UF_DEBUG_TIMER_MULTITRACE(...) UF_TIMER_MULTITRACE(__VA_ARGS__)
#define UF_DEBUG_TIMER_MULTITRACE_END(...) UF_TIMER_MULTITRACE_END(__VA_ARGS__)
#define UF_GRAPH_SPARSE_READ_MESH 1
#else
#define UF_DEBUG_TIMER_MULTITRACE_START(...)
#define UF_DEBUG_TIMER_MULTITRACE(...)
#define UF_DEBUG_TIMER_MULTITRACE_END(...)
#if UF_USE_OPENGL
#define UF_GRAPH_SPARSE_READ_MESH 1
#else
#define UF_GRAPH_SPARSE_READ_MESH 1
#endif
#endif
#if UF_USE_OPENGL
#define UF_GRAPH_SPARSE_READ_MESH 1
#else
#define UF_GRAPH_SPARSE_READ_MESH 1
#endif
#define UF_GRAPH_EXTENDED 1
namespace {
@ -1045,6 +1044,7 @@ void uf::graph::process( pod::Graph& graph ) {
isSrgb[texName] = true;
}
UF_DEBUG_TIMER_MULTITRACE("Processing images...");
for ( auto& key : graph.images ) {
auto& image = storage.images[key];
auto& texture = storage.texture2Ds[key];
@ -1071,6 +1071,8 @@ void uf::graph::process( pod::Graph& graph ) {
texture.sampler.descriptor.filter.mag = filter;
texture.srgb = isSrgb[key];
// to-do: figure out why I need to skip rendering the next frame to avoid a crash here if the storage buffers need to be resized on the GPU side
// i suppose timing is consistent enough to where this is loaded asynchronously and rendering throws a device lost error
texture.loadFromImage( image );
#if UF_ENV_DREAMCAST
image.clear();

View File

@ -51,6 +51,7 @@ bool ext::opengl::settings::experimental::dedicatedThread = true;
bool ext::opengl::settings::experimental::rebuildOnTickBegin = false;
bool ext::opengl::settings::experimental::batchQueueSubmissions = false;
bool ext::opengl::settings::experimental::registerRenderMode = true;
bool ext::opengl::settings::experimental::skipRenderOnRebuild = false;
// not so experimental
bool ext::opengl::settings::invariant::waitOnRenderEnd = false;

View File

@ -67,6 +67,7 @@ bool ext::vulkan::settings::experimental::rebuildOnTickBegin = false;
bool ext::vulkan::settings::experimental::enableMultiGPU = false;
bool ext::vulkan::settings::experimental::memoryBudgetBit = true;
bool ext::vulkan::settings::experimental::registerRenderMode = true;
bool ext::vulkan::settings::experimental::skipRenderOnRebuild = false;
// not so experimental
bool ext::vulkan::settings::invariant::waitOnRenderEnd = false;
@ -539,6 +540,8 @@ void ext::vulkan::tick() {
}
ext::vulkan::gc::textures.clear();
*/
if ( ext::vulkan::states::rebuild && ext::vulkan::settings::experimental::skipRenderOnRebuild ) ::skip = true;
ext::vulkan::states::rebuild = false;
ext::vulkan::states::resized = false;