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.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": {
|
||||||
|
@ -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": {
|
||||||
|
@ -1 +1 @@
|
|||||||
vulkan
|
opengl
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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>() ) {
|
||||||
|
@ -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 );
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user