fixed OpenGL crash + Dreamcast oddities (past me did in fact realize that userdata never called destructors and handled it for opengl pseudo-command buffers)

This commit is contained in:
ecker 2025-08-16 15:56:41 -05:00
parent 62bc086659
commit f7fba27753
11 changed files with 23 additions and 84 deletions

View File

@ -4,9 +4,9 @@
// { "filename": "./models/ss2_medsci1.glb" } // { "filename": "./models/ss2_medsci1.glb" }
// { "filename": "./models/ss2_medsci1/graph.json" } // { "filename": "./models/ss2_medsci1/graph.json" }
// { "filename": "./models/ss2_medsci1_small.glb" } // { "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.glb" }
{ "filename": "./models/ss2_medsci1_smallish/graph.json" } // { "filename": "./models/ss2_medsci1_smallish/graph.json" }
], ],
"metadata": { "metadata": {
"graph": { "graph": {

View File

@ -83,7 +83,7 @@
"memory pool": { "memory pool": {
"enabled": false, "enabled": false,
"subPools": true, "subPools": true,
"alignment": 32, "alignment": 4,
"override": false, "override": false,
"size": "512 KiB", "size": "512 KiB",
"pools": { "pools": {

View File

@ -1 +1 @@
vulkan opengl

View File

@ -77,7 +77,7 @@ namespace pod {
uf::stl::string tag = "worldspawn"; uf::stl::string tag = "worldspawn";
uf::stl::string player = "info_player_spawn"; uf::stl::string player = "info_player_spawn";
size_t hash = 0; uint64_t hash = 0;
float lastUpdate = 0; float lastUpdate = 0;
} stream; } stream;
} settings; } settings;

View File

@ -78,40 +78,7 @@ namespace ext {
const pod::Vector4f* pointer = NULL; const pod::Vector4f* pointer = NULL;
} color; } 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 #if UF_COMMAND_BUFFER_POINTERED_USERDATA
typedef uf::PointeredUserdata userdata_t; typedef uf::PointeredUserdata userdata_t;
#else #else

View File

@ -2120,7 +2120,7 @@ void uf::graph::reload( pod::Graph& graph, pod::Node& node ) {
} }
// bail if no update is detected // bail if no update is detected
uint64_t drawCommandHash = ::fnv1aHash(queuedDrawIDs); auto drawCommandHash = ::fnv1aHash(queuedDrawIDs);
if ( drawCommandHash == graph.settings.stream.hash ) { if ( drawCommandHash == graph.settings.stream.hash ) {
return; return;
} }
@ -2346,8 +2346,12 @@ void uf::graph::reload( pod::Graph& graph, pod::Node& node ) {
} }
mesh.updateDescriptor(); 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 // update graphic
if ( /*(graph.metadata["renderer"]["separate"].as<bool>()) &&*/ graph.metadata["renderer"]["render"].as<bool>() ) { if ( /*(graph.metadata["renderer"]["separate"].as<bool>()) &&*/ graph.metadata["renderer"]["render"].as<bool>() ) {

View File

@ -290,7 +290,6 @@ void uf::ObjectBehavior::tick( uf::Object& self ) {
for ( auto& q : executeQueue ) { for ( auto& q : executeQueue ) {
if ( q.type == 1 ) { if ( q.type == 1 ) {
this->callHook( q.name, q.userdata ); this->callHook( q.name, q.userdata );
q.userdata.destroy();
} }
else if ( q.type == -1 ) this->callHook( q.name, q.json ); else if ( q.type == -1 ) this->callHook( q.name, q.json );
else this->callHook( q.name ); else this->callHook( q.name );

View File

@ -41,44 +41,41 @@ void ext::opengl::CommandBuffer::end() {
} }
void ext::opengl::CommandBuffer::record( const CommandBuffer::Info& header ) { void ext::opengl::CommandBuffer::record( const CommandBuffer::Info& header ) {
if ( state != 1 ) return; if ( state != 1 ) return;
switch ( header.type ) { switch ( header.type ) {
case ext::opengl::enums::Command::CLEAR: { case ext::opengl::enums::Command::CLEAR: {
InfoClear* info = (InfoClear*) &header; InfoClear* info = (InfoClear*) &header;
info->next = NULL;
auto& userdata = infos.emplace_back(); auto& userdata = infos.emplace_back();
userdata.autoDestruct = false;
userdata.create<InfoClear>( *info ); userdata.create<InfoClear>( *info );
info = &userdata.get<InfoClear>(); info = &userdata.get<InfoClear>();
info->type = enums::Command::CLEAR; info->type = enums::Command::CLEAR;
info->next = NULL;
} break; } break;
case ext::opengl::enums::Command::VIEWPORT: { case ext::opengl::enums::Command::VIEWPORT: {
InfoViewport* info = (InfoViewport*) &header; InfoViewport* info = (InfoViewport*) &header;
info->next = NULL;
if ( info->size.x == 0 ) info->size.x = ext::opengl::settings::width; if ( info->size.x == 0 ) info->size.x = ext::opengl::settings::width;
if ( info->size.y == 0 ) info->size.y = ext::opengl::settings::height; if ( info->size.y == 0 ) info->size.y = ext::opengl::settings::height;
auto& userdata = infos.emplace_back(); auto& userdata = infos.emplace_back();
userdata.autoDestruct = false;
userdata.create<InfoViewport>( *info ); userdata.create<InfoViewport>( *info );
info->next = NULL;
info = &userdata.get<InfoViewport>(); info = &userdata.get<InfoViewport>();
info->type = enums::Command::VIEWPORT; info->type = enums::Command::VIEWPORT;
} break; } break;
case ext::opengl::enums::Command::VARIANT: { case ext::opengl::enums::Command::VARIANT: {
InfoVariant* info = (InfoVariant*) &header; InfoVariant* info = (InfoVariant*) &header;
info->next = NULL;
auto& userdata = infos.emplace_back(); auto& userdata = infos.emplace_back();
userdata.autoDestruct = false;
userdata.create<InfoVariant>( *info ); userdata.create<InfoVariant>( *info );
info = &userdata.get<InfoVariant>(); info = &userdata.get<InfoVariant>();
info->type = enums::Command::VARIANT; info->type = enums::Command::VARIANT;
info->next = NULL;
} break; } break;
case ext::opengl::enums::Command::DRAW: { case ext::opengl::enums::Command::DRAW: {
InfoDraw* info = (InfoDraw*) &header; InfoDraw* info = (InfoDraw*) &header;
info->next = NULL;
auto& userdata = infos.emplace_back(); auto& userdata = infos.emplace_back();
userdata.autoDestruct = false;
userdata.create<InfoDraw>( *info ); userdata.create<InfoDraw>( *info );
info = &userdata.get<InfoDraw>(); info = &userdata.get<InfoDraw>();
info->type = enums::Command::DRAW; info->type = enums::Command::DRAW;
info->next = NULL;
} break; } break;
default: { default: {
} break; } break;
@ -131,33 +128,6 @@ void ext::opengl::CommandBuffer::submit() {
} }
void ext::opengl::CommandBuffer::flush() { void ext::opengl::CommandBuffer::flush() {
mutex->lock(); 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(); infos.clear();
state = 0; state = 0;
mutex->unlock(); mutex->unlock();

View File

@ -100,8 +100,8 @@ void ext::opengl::Shader::destroy() {
} }
#endif #endif
for ( auto& userdata : uniforms ) userdata.destroy(); // for ( auto& userdata : uniforms ) userdata.destroy();
for ( auto& userdata : pushConstants ) userdata.destroy(); // for ( auto& userdata : pushConstants ) userdata.destroy();
uniforms.clear(); uniforms.clear();
pushConstants.clear(); pushConstants.clear();
} }

View File

@ -835,8 +835,8 @@ void ext::vulkan::Shader::destroy() {
module = VK_NULL_HANDLE; module = VK_NULL_HANDLE;
descriptor = {}; descriptor = {};
} }
for ( auto& userdata : uniforms ) userdata.destroy(); // for ( auto& userdata : uniforms ) userdata.destroy();
for ( auto& userdata : pushConstants ) userdata.destroy(); // for ( auto& userdata : pushConstants ) userdata.destroy();
uniforms.clear(); uniforms.clear();
pushConstants.clear(); pushConstants.clear();
} }

View File

@ -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 ) { pod::PointeredUserdata uf::pointeredUserdata::copy( uf::MemoryPool& requestedMemoryPool, const pod::PointeredUserdata& userdata ) {
if ( !userdata.data || userdata.len <= 0 ) return {}; if ( !userdata.data || userdata.len <= 0 ) return {};
pod::PointeredUserdata copied = uf::pointeredUserdata::create( userdata.len, const_cast<void*>(userdata.data) ); pod::PointeredUserdata copied = uf::pointeredUserdata::create( userdata.len, const_cast<void*>(userdata.data), userdata.type );
copied.type = userdata.type;
return copied; return copied;
} }