pre-emptive opengl fixes (it at least works fully which is mostly what I care about)

This commit is contained in:
ecker 2025-08-19 19:33:57 -05:00
parent 0a29063869
commit 114bed0d5d
7 changed files with 64 additions and 11 deletions

View File

@ -1 +1 @@
vulkan
opengl

View File

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

View File

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

View File

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

View File

@ -83,6 +83,18 @@ ext::opengl::CommandBuffer& ext::opengl::RenderMode::getCommands( std::thread::i
void ext::opengl::RenderMode::createCommandBuffers( const uf::stl::vector<ext::opengl::Graphic*>& 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() {

View File

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

View File

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