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:
parent
62bc086659
commit
f7fba27753
@ -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": {
|
||||
|
@ -83,7 +83,7 @@
|
||||
"memory pool": {
|
||||
"enabled": false,
|
||||
"subPools": true,
|
||||
"alignment": 32,
|
||||
"alignment": 4,
|
||||
"override": false,
|
||||
"size": "512 KiB",
|
||||
"pools": {
|
||||
|
@ -1 +1 @@
|
||||
vulkan
|
||||
opengl
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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>() ) {
|
||||
|
@ -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 );
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user