From 114bed0d5d29357576a69d57f4684dd2840e0101 Mon Sep 17 00:00:00 2001 From: ecker Date: Tue, 19 Aug 2025 19:33:57 -0500 Subject: [PATCH] pre-emptive opengl fixes (it at least works fully which is mostly what I care about) --- bin/exe/default/renderer | 2 +- engine/inc/uf/ext/opengl/rendermode.h | 2 +- engine/src/engine/graph/graph.cpp | 2 ++ engine/src/ext/opengl/graphic.cpp | 33 +++++++++++++++++++++++++++ engine/src/ext/opengl/rendermode.cpp | 18 +++++++++++++++ engine/src/ext/vulkan/graphic.cpp | 16 ++++++------- engine/src/ext/vulkan/rendermode.cpp | 2 +- 7 files changed, 64 insertions(+), 11 deletions(-) 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/ext/opengl/rendermode.h b/engine/inc/uf/ext/opengl/rendermode.h index c1b63281..543c644d 100644 --- a/engine/inc/uf/ext/opengl/rendermode.h +++ b/engine/inc/uf/ext/opengl/rendermode.h @@ -7,7 +7,7 @@ namespace ext { namespace opengl { - struct UF_API RenderMode { + struct UF_API RenderMode : public Buffers { bool execute = false; bool executed = false; bool rebuild = false; diff --git a/engine/src/engine/graph/graph.cpp b/engine/src/engine/graph/graph.cpp index f6ef8ca5..41e255cd 100644 --- a/engine/src/engine/graph/graph.cpp +++ b/engine/src/engine/graph/graph.cpp @@ -119,9 +119,11 @@ namespace { graphic.material.metadata.autoInitializeUniformBuffers = false; graphic.material.attachShader(vertexShaderFilename, uf::renderer::enums::Shader::VERTEX); graphic.material.attachShader(fragmentShaderFilename, uf::renderer::enums::Shader::FRAGMENT); + #if UF_USE_VULKAN if ( geometryShaderFilename != "" && uf::renderer::device.enabledFeatures.geometryShader ) { // to-do: should cram in the attachShader itself graphic.material.attachShader(geometryShaderFilename, uf::renderer::enums::Shader::GEOMETRY); } + #endif graphic.material.metadata.autoInitializeUniformBuffers = true; // vertex shader { diff --git a/engine/src/ext/opengl/graphic.cpp b/engine/src/ext/opengl/graphic.cpp index 7d4a8714..ba63c2b2 100644 --- a/engine/src/ext/opengl/graphic.cpp +++ b/engine/src/ext/opengl/graphic.cpp @@ -357,10 +357,43 @@ void ext::opengl::Graphic::record( CommandBuffer& commandBuffer, const GraphicDe auto shaders = pipeline.getShaders( material.shaders ); for ( auto shader : shaders ) { + // bind aliased buffers + for ( auto& descriptor : shader->metadata.aliases.buffers ) { + auto matches = uf::string::match(descriptor.name, R"(/^(.+?)\[(\d+)\]$/)"); + auto name = matches.size() == 2 ? matches[0] : descriptor.name; + auto view = matches.size() == 2 ? stoi(matches[1]) : -1; + const ext::opengl::Buffer* buffer = &descriptor.fallback; + if ( descriptor.renderMode ) { + if ( descriptor.renderMode->hasBuffer(name) ) + buffer = &descriptor.renderMode->getBuffer(name); + }/* else if ( renderMode.hasBuffer(name) ) { + buffer = &renderMode.getBuffer(name); + }*/ + + if ( !buffer ) continue; + + if ( buffer->usage & uf::renderer::enums::Buffer::UNIFORM ) uniformBuffers.emplace_back(buffer->descriptor); + if ( buffer->usage & uf::renderer::enums::Buffer::STORAGE ) storageBuffers.emplace_back(buffer->descriptor); + } + // bind shader for ( auto& buffer : shader->buffers ) { if ( buffer.usage & uf::renderer::enums::Buffer::UNIFORM ) { uniformBuffers.emplace_back(buffer.descriptor); } if ( buffer.usage & uf::renderer::enums::Buffer::STORAGE ) { storageBuffers.emplace_back(buffer.descriptor); } } + /* + // add per-pipeline buffers + for ( auto& buffer : this->buffers ) { + if ( buffer.usage & uf::renderer::enums::Buffer::UNIFORM ) infos.uniform.emplace_back(buffer.descriptor); + if ( buffer.usage & uf::renderer::enums::Buffer::STORAGE ) infos.storage.emplace_back(buffer.descriptor); + // if ( buffer.usage & VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR ) infos.accelerationStructure.emplace_back(buffer.descriptor); + } + // add per-graphics buffers + for ( auto& buffer : graphic.buffers ) { + if ( buffer.usage & uf::renderer::enums::Buffer::UNIFORM ) infos.uniform.emplace_back(buffer.descriptor); + if ( buffer.usage & uf::renderer::enums::Buffer::STORAGE ) infos.storage.emplace_back(buffer.descriptor); + // if ( buffer.usage & VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR ) infos.accelerationStructure.emplace_back(buffer.descriptor); + } + */ } auto uniformBufferIt = uniformBuffers.begin(); diff --git a/engine/src/ext/opengl/rendermode.cpp b/engine/src/ext/opengl/rendermode.cpp index 335573b1..68feec5b 100644 --- a/engine/src/ext/opengl/rendermode.cpp +++ b/engine/src/ext/opengl/rendermode.cpp @@ -83,6 +83,18 @@ ext::opengl::CommandBuffer& ext::opengl::RenderMode::getCommands( std::thread::i void ext::opengl::RenderMode::createCommandBuffers( const uf::stl::vector& graphics ) { } + +bool ext::opengl::RenderMode::hasBuffer( const uf::stl::string& name ) const { + return metadata.buffers.count(name) > 0; +} +const ext::opengl::Buffer& ext::opengl::RenderMode::getBuffer( const uf::stl::string& name ) const { + UF_ASSERT_MSG( hasBuffer( name ), "attachment in `{}`: {} not found: {}", this->getName(), this->getType(), name ); + return this->buffers[metadata.buffers.at(name)]; +} +size_t ext::opengl::RenderMode::getBufferIndex( const uf::stl::string& name ) const { + return hasBuffer( name ) ? metadata.buffers.at(name) : SIZE_MAX; +} + void ext::opengl::RenderMode::bindPipelines() { this->execute = true; @@ -172,6 +184,12 @@ void ext::opengl::RenderMode::initialize( Device& device ) { if ( this->width > 0 ) renderTarget.width = this->width; if ( this->height > 0 ) renderTarget.height = this->height; } + +/* + if ( !this->hasBuffer("camera") ) { + this->metadata.buffers["camera"] = this->initializeBuffer( (const void*) nullptr, sizeof(pod::Camera::Viewports), uf::renderer::enums::Buffer::UNIFORM ); + } +*/ } void ext::opengl::RenderMode::tick() { diff --git a/engine/src/ext/vulkan/graphic.cpp b/engine/src/ext/vulkan/graphic.cpp index 037a63da..90406aac 100644 --- a/engine/src/ext/vulkan/graphic.cpp +++ b/engine/src/ext/vulkan/graphic.cpp @@ -532,32 +532,32 @@ void ext::vulkan::Pipeline::update( const Graphic& graphic, const GraphicDescrip if ( !buffer ) continue; if ( buffer->usage & uf::renderer::enums::Buffer::UNIFORM ) infos.uniform.emplace_back(buffer->descriptor); - if ( buffer->usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT ) infos.storage.emplace_back(buffer->descriptor); + if ( buffer->usage & uf::renderer::enums::Buffer::STORAGE ) infos.storage.emplace_back(buffer->descriptor); } #if 0 // add per-rendermode buffers for ( auto& buffer : renderMode.buffers ) { if ( buffer.usage & uf::renderer::enums::Buffer::UNIFORM ) infos.uniform.emplace_back(buffer.descriptor); - if ( buffer.usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT ) infos.storage.emplace_back(buffer.descriptor); + if ( buffer.usage & uf::renderer::enums::Buffer::STORAGE ) infos.storage.emplace_back(buffer.descriptor); // if ( buffer.usage & VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR ) infos.accelerationStructure.emplace_back(buffer.descriptor); } #endif // add per-shader buffers for ( auto& buffer : shader->buffers ) { if ( buffer.usage & uf::renderer::enums::Buffer::UNIFORM ) infos.uniform.emplace_back(buffer.descriptor); - if ( buffer.usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT ) infos.storage.emplace_back(buffer.descriptor); + if ( buffer.usage & uf::renderer::enums::Buffer::STORAGE ) infos.storage.emplace_back(buffer.descriptor); // if ( buffer.usage & VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR ) infos.accelerationStructure.emplace_back(buffer.descriptor); } // add per-pipeline buffers for ( auto& buffer : this->buffers ) { if ( buffer.usage & uf::renderer::enums::Buffer::UNIFORM ) infos.uniform.emplace_back(buffer.descriptor); - if ( buffer.usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT ) infos.storage.emplace_back(buffer.descriptor); + if ( buffer.usage & uf::renderer::enums::Buffer::STORAGE ) infos.storage.emplace_back(buffer.descriptor); // if ( buffer.usage & VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR ) infos.accelerationStructure.emplace_back(buffer.descriptor); } // add per-graphics buffers for ( auto& buffer : graphic.buffers ) { if ( buffer.usage & uf::renderer::enums::Buffer::UNIFORM ) infos.uniform.emplace_back(buffer.descriptor); - if ( buffer.usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT ) infos.storage.emplace_back(buffer.descriptor); + if ( buffer.usage & uf::renderer::enums::Buffer::STORAGE ) infos.storage.emplace_back(buffer.descriptor); // if ( buffer.usage & VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR ) infos.accelerationStructure.emplace_back(buffer.descriptor); } @@ -1133,10 +1133,10 @@ void ext::vulkan::Graphic::initializeMesh( uf::Mesh& mesh, bool buffer ) { // allocate buffers auto previousRequestedAlignment = this->requestedAlignment; this->requestedAlignment = 16; - PARSE_INPUT_INITIALIZE(vertex, uf::renderer::enums::Buffer::VERTEX | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT ) + PARSE_INPUT_INITIALIZE(vertex, uf::renderer::enums::Buffer::VERTEX | uf::renderer::enums::Buffer::STORAGE ) PARSE_INPUT_INITIALIZE(index, uf::renderer::enums::Buffer::INDEX ) PARSE_INPUT_INITIALIZE(instance, uf::renderer::enums::Buffer::VERTEX ) - PARSE_INPUT_INITIALIZE(indirect, uf::renderer::enums::Buffer::INDIRECT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT ) + PARSE_INPUT_INITIALIZE(indirect, uf::renderer::enums::Buffer::INDIRECT | uf::renderer::enums::Buffer::STORAGE ) this->requestedAlignment = previousRequestedAlignment; } @@ -1745,7 +1745,7 @@ void ext::vulkan::Graphic::generateTopAccelerationStructure( const uf::stl::vect // UF_MSG_DEBUG("Reduced size to {}% ({} -> {} = {})", (float) (oldSize - compactedSize) / (float) (oldSize), oldSize, compactedSize, oldSize - compactedSize); ext::vulkan::Buffer oldBuffer; - oldBuffer.initialize( NULL, tlasBufferSize, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT ); + oldBuffer.initialize( NULL, tlasBufferSize, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | uf::renderer::enums::Buffer::STORAGE ); this->buffers[tlasBufferIndex].swap(oldBuffer); tlas.buffer = this->buffers[tlasBufferIndex].alias(); diff --git a/engine/src/ext/vulkan/rendermode.cpp b/engine/src/ext/vulkan/rendermode.cpp index 4d3145ef..fe94d063 100644 --- a/engine/src/ext/vulkan/rendermode.cpp +++ b/engine/src/ext/vulkan/rendermode.cpp @@ -64,7 +64,7 @@ const ext::vulkan::Buffer& ext::vulkan::RenderMode::getBuffer( const uf::stl::st return this->buffers[metadata.buffers.at(name)]; } size_t ext::vulkan::RenderMode::getBufferIndex( const uf::stl::string& name ) const { - return hasAttachment( name ) ? metadata.buffers.at(name) : SIZE_MAX; + return hasBuffer( name ) ? metadata.buffers.at(name) : SIZE_MAX; } uf::Image ext::vulkan::RenderMode::screenshot( size_t attachmentID, size_t layerID ) {