From f7fba27753c5598206108d16f1baf7726caf89a9 Mon Sep 17 00:00:00 2001 From: ecker Date: Sat, 16 Aug 2025 15:56:41 -0500 Subject: [PATCH] fixed OpenGL crash + Dreamcast oddities (past me did in fact realize that userdata never called destructors and handled it for opengl pseudo-command buffers) --- bin/data/scenes/sourceengine/ss2_medsci1.json | 4 +- bin/dreamcast/data/config.json | 2 +- bin/exe/default/renderer | 2 +- engine/inc/uf/engine/graph/graph.h | 2 +- engine/inc/uf/ext/opengl/commands.h | 35 +--------------- engine/src/engine/graph/graph.cpp | 10 +++-- engine/src/engine/object/behavior.cpp | 1 - engine/src/ext/opengl/commands.cpp | 40 +++---------------- engine/src/ext/opengl/shader.cpp | 4 +- engine/src/ext/vulkan/shader.cpp | 4 +- engine/src/utils/userdata/pointered.cpp | 3 +- 11 files changed, 23 insertions(+), 84 deletions(-) diff --git a/bin/data/scenes/sourceengine/ss2_medsci1.json b/bin/data/scenes/sourceengine/ss2_medsci1.json index c963a955..5c86088e 100644 --- a/bin/data/scenes/sourceengine/ss2_medsci1.json +++ b/bin/data/scenes/sourceengine/ss2_medsci1.json @@ -4,9 +4,9 @@ // { "filename": "./models/ss2_medsci1.glb" } // { "filename": "./models/ss2_medsci1/graph.json" } // { "filename": "./models/ss2_medsci1_small.glb" } - // { "filename": "./models/ss2_medsci1_small/graph.json" } + { "filename": "./models/ss2_medsci1_small/graph.json" } // { "filename": "./models/ss2_medsci1_smallish.glb" } - { "filename": "./models/ss2_medsci1_smallish/graph.json" } + // { "filename": "./models/ss2_medsci1_smallish/graph.json" } ], "metadata": { "graph": { diff --git a/bin/dreamcast/data/config.json b/bin/dreamcast/data/config.json index 44a519cc..22b5636f 100644 --- a/bin/dreamcast/data/config.json +++ b/bin/dreamcast/data/config.json @@ -83,7 +83,7 @@ "memory pool": { "enabled": false, "subPools": true, - "alignment": 32, + "alignment": 4, "override": false, "size": "512 KiB", "pools": { diff --git a/bin/exe/default/renderer b/bin/exe/default/renderer index 53395cff..91caa7c1 100644 --- a/bin/exe/default/renderer +++ b/bin/exe/default/renderer @@ -1 +1 @@ -vulkan \ No newline at end of file +opengl \ No newline at end of file diff --git a/engine/inc/uf/engine/graph/graph.h b/engine/inc/uf/engine/graph/graph.h index f789533b..850c4744 100644 --- a/engine/inc/uf/engine/graph/graph.h +++ b/engine/inc/uf/engine/graph/graph.h @@ -77,7 +77,7 @@ namespace pod { uf::stl::string tag = "worldspawn"; uf::stl::string player = "info_player_spawn"; - size_t hash = 0; + uint64_t hash = 0; float lastUpdate = 0; } stream; } settings; diff --git a/engine/inc/uf/ext/opengl/commands.h b/engine/inc/uf/ext/opengl/commands.h index 3b9eda65..97bee2ff 100644 --- a/engine/inc/uf/ext/opengl/commands.h +++ b/engine/inc/uf/ext/opengl/commands.h @@ -78,40 +78,7 @@ namespace ext { const pod::Vector4f* pointer = NULL; } color; }; - /* - struct UF_API InfoBuffer : public Info { - // ext::opengl::enums::Command::type_t type = 0; - ext::opengl::Buffer::Descriptor descriptor = { GL_NULL_HANDLE, 0, 0 }; - enums::Buffer::type_t usage = 0; - }; - struct UF_API InfoTexture : public Info { - // ext::opengl::enums::Command::type_t type = 0; - ext::opengl::Texture::Descriptor descriptor = {}; - }; - struct UF_API InfoPipeline : public Info { - // ext::opengl::enums::Command::type_t type = 0; - struct Descriptor { - GLuint pipeline = GL_NULL_HANDLE; - GLuint vertexArray = GL_NULL_HANDLE; - } descriptor = { GL_NULL_HANDLE, GL_NULL_HANDLE }; - }; - struct UF_API InfoGraphicBuffer : public Info { - // ext::opengl::enums::Command::type_t type = 0; - ext::opengl::Graphic* graphic = NULL; - size_t bufferIndex = 0; - }; - struct UF_API InfoDraw : public Info { - // ext::opengl::enums::Command::type_t type = 0; - size_t length = 0; - GraphicDescriptor descriptor = {}; - }; - struct UF_API InfoGenerateTexture : public Info { - // ext::opengl::enums::Command::type_t type = 0; - Texture::Descriptor descriptor; - void* data = NULL; - size_t size = 0; - }; - */ + #if UF_COMMAND_BUFFER_POINTERED_USERDATA typedef uf::PointeredUserdata userdata_t; #else diff --git a/engine/src/engine/graph/graph.cpp b/engine/src/engine/graph/graph.cpp index f76264b0..76ba30cf 100644 --- a/engine/src/engine/graph/graph.cpp +++ b/engine/src/engine/graph/graph.cpp @@ -2120,7 +2120,7 @@ void uf::graph::reload( pod::Graph& graph, pod::Node& node ) { } // bail if no update is detected - uint64_t drawCommandHash = ::fnv1aHash(queuedDrawIDs); + auto drawCommandHash = ::fnv1aHash(queuedDrawIDs); if ( drawCommandHash == graph.settings.stream.hash ) { return; } @@ -2346,8 +2346,12 @@ void uf::graph::reload( pod::Graph& graph, pod::Node& node ) { } mesh.updateDescriptor(); - - // uf::renderer::states::rebuild = true; + + // necessary for OpenGL because recorded descriptors have invalidated pointers + // Vulkan doesn't care about the CPU-side mesh data +#if UF_USE_OPENGL + uf::renderer::states::rebuild = true; +#endif // update graphic if ( /*(graph.metadata["renderer"]["separate"].as()) &&*/ graph.metadata["renderer"]["render"].as() ) { diff --git a/engine/src/engine/object/behavior.cpp b/engine/src/engine/object/behavior.cpp index 8a6ec5bf..aab75877 100644 --- a/engine/src/engine/object/behavior.cpp +++ b/engine/src/engine/object/behavior.cpp @@ -290,7 +290,6 @@ void uf::ObjectBehavior::tick( uf::Object& self ) { for ( auto& q : executeQueue ) { if ( q.type == 1 ) { this->callHook( q.name, q.userdata ); - q.userdata.destroy(); } else if ( q.type == -1 ) this->callHook( q.name, q.json ); else this->callHook( q.name ); diff --git a/engine/src/ext/opengl/commands.cpp b/engine/src/ext/opengl/commands.cpp index 41abf113..2176782a 100644 --- a/engine/src/ext/opengl/commands.cpp +++ b/engine/src/ext/opengl/commands.cpp @@ -41,44 +41,41 @@ void ext::opengl::CommandBuffer::end() { } void ext::opengl::CommandBuffer::record( const CommandBuffer::Info& header ) { if ( state != 1 ) return; + switch ( header.type ) { case ext::opengl::enums::Command::CLEAR: { InfoClear* info = (InfoClear*) &header; - info->next = NULL; auto& userdata = infos.emplace_back(); - userdata.autoDestruct = false; userdata.create( *info ); info = &userdata.get(); info->type = enums::Command::CLEAR; + info->next = NULL; } break; case ext::opengl::enums::Command::VIEWPORT: { InfoViewport* info = (InfoViewport*) &header; - info->next = NULL; if ( info->size.x == 0 ) info->size.x = ext::opengl::settings::width; if ( info->size.y == 0 ) info->size.y = ext::opengl::settings::height; auto& userdata = infos.emplace_back(); - userdata.autoDestruct = false; userdata.create( *info ); + info->next = NULL; info = &userdata.get(); info->type = enums::Command::VIEWPORT; } break; case ext::opengl::enums::Command::VARIANT: { InfoVariant* info = (InfoVariant*) &header; - info->next = NULL; auto& userdata = infos.emplace_back(); - userdata.autoDestruct = false; userdata.create( *info ); info = &userdata.get(); info->type = enums::Command::VARIANT; + info->next = NULL; } break; case ext::opengl::enums::Command::DRAW: { InfoDraw* info = (InfoDraw*) &header; - info->next = NULL; auto& userdata = infos.emplace_back(); - userdata.autoDestruct = false; userdata.create( *info ); info = &userdata.get(); info->type = enums::Command::DRAW; + info->next = NULL; } break; default: { } break; @@ -131,33 +128,6 @@ void ext::opengl::CommandBuffer::submit() { } void ext::opengl::CommandBuffer::flush() { mutex->lock(); - for ( auto& info : infos ) { - CommandBuffer::Info* header = (CommandBuffer::Info*) (void*) info; - switch ( header->type ) { - case ext::opengl::enums::Command::CLEAR: { - InfoClear* info = (InfoClear*) header; - info->~InfoClear(); - } break; - case ext::opengl::enums::Command::VIEWPORT: { - InfoViewport* info = (InfoViewport*) header; - info->~InfoViewport(); - } break; - case ext::opengl::enums::Command::VARIANT: { - InfoVariant* info = (InfoVariant*) header; - info->~InfoVariant(); - } break; - case ext::opengl::enums::Command::DRAW: { - InfoDraw* info = (InfoDraw*) header; - info->~InfoDraw(); - } break; - default: { - } break; - } - } - for ( auto& userdata : infos ) { - userdata.autoDestruct = true; - userdata.destroy(); - } infos.clear(); state = 0; mutex->unlock(); diff --git a/engine/src/ext/opengl/shader.cpp b/engine/src/ext/opengl/shader.cpp index a14b5256..681d5d2e 100644 --- a/engine/src/ext/opengl/shader.cpp +++ b/engine/src/ext/opengl/shader.cpp @@ -100,8 +100,8 @@ void ext::opengl::Shader::destroy() { } #endif - for ( auto& userdata : uniforms ) userdata.destroy(); - for ( auto& userdata : pushConstants ) userdata.destroy(); +// for ( auto& userdata : uniforms ) userdata.destroy(); +// for ( auto& userdata : pushConstants ) userdata.destroy(); uniforms.clear(); pushConstants.clear(); } diff --git a/engine/src/ext/vulkan/shader.cpp b/engine/src/ext/vulkan/shader.cpp index 5d11c78f..0e364260 100644 --- a/engine/src/ext/vulkan/shader.cpp +++ b/engine/src/ext/vulkan/shader.cpp @@ -835,8 +835,8 @@ void ext::vulkan::Shader::destroy() { module = VK_NULL_HANDLE; descriptor = {}; } - for ( auto& userdata : uniforms ) userdata.destroy(); - for ( auto& userdata : pushConstants ) userdata.destroy(); +// for ( auto& userdata : uniforms ) userdata.destroy(); +// for ( auto& userdata : pushConstants ) userdata.destroy(); uniforms.clear(); pushConstants.clear(); } diff --git a/engine/src/utils/userdata/pointered.cpp b/engine/src/utils/userdata/pointered.cpp index bda1fab0..64590f9f 100644 --- a/engine/src/utils/userdata/pointered.cpp +++ b/engine/src/utils/userdata/pointered.cpp @@ -69,8 +69,7 @@ void uf::pointeredUserdata::destroy( uf::MemoryPool& requestedMemoryPool, pod::P } pod::PointeredUserdata uf::pointeredUserdata::copy( uf::MemoryPool& requestedMemoryPool, const pod::PointeredUserdata& userdata ) { if ( !userdata.data || userdata.len <= 0 ) return {}; - pod::PointeredUserdata copied = uf::pointeredUserdata::create( userdata.len, const_cast(userdata.data) ); - copied.type = userdata.type; + pod::PointeredUserdata copied = uf::pointeredUserdata::create( userdata.len, const_cast(userdata.data), userdata.type ); return copied; }