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/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": {

View File

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

View File

@ -1 +1 @@
vulkan
opengl

View File

@ -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;

View File

@ -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

View File

@ -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<bool>()) &&*/ graph.metadata["renderer"]["render"].as<bool>() ) {

View File

@ -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 );

View File

@ -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<InfoClear>( *info );
info = &userdata.get<InfoClear>();
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<InfoViewport>( *info );
info->next = NULL;
info = &userdata.get<InfoViewport>();
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<InfoVariant>( *info );
info = &userdata.get<InfoVariant>();
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<InfoDraw>( *info );
info = &userdata.get<InfoDraw>();
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();

View File

@ -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();
}

View File

@ -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();
}

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