fixing projection issue

This commit is contained in:
2024-10-17 15:37:39 +02:00
parent 99437a6d6a
commit 160364bda2
13 changed files with 117 additions and 57 deletions

View File

@@ -36,6 +36,7 @@ namespace mlx
if(f_loop_hook)
f_loop_hook(p_param);
#pragma omp parallel for
for(auto& gs : m_graphics)
{
if(gs)
@@ -80,6 +81,7 @@ namespace mlx
Error("trying to destroy a texture that has already been destroyed");
else
texture->Destroy();
#pragma omp parallel for
for(auto& gs : m_graphics)
{
if(gs)

View File

@@ -6,6 +6,7 @@ namespace mlx
{
void EventBus::Send(const std::string& listener_name, const EventBase& event)
{
#pragma omp parallel for
for(const EventListener& listener : s_listeners)
{
if(listener.GetName() == listener_name)
@@ -19,6 +20,7 @@ namespace mlx
void EventBus::SendBroadcast(const EventBase& event)
{
#pragma omp parallel for
for(const EventListener& listener : s_listeners)
listener.Call(event);
}

View File

@@ -7,6 +7,7 @@ namespace mlx
void Mesh::Draw(VkCommandBuffer cmd, std::size_t& drawcalls, std::size_t& polygondrawn) const noexcept
{
MLX_PROFILE_FUNCTION();
#pragma omp parallel for
for(std::size_t i = 0; i < m_sub_meshes.size(); i++)
Draw(cmd, drawcalls, polygondrawn, i);
}
@@ -25,6 +26,7 @@ namespace mlx
Mesh::~Mesh()
{
MLX_PROFILE_FUNCTION();
#pragma omp parallel for
for(auto& mesh : m_sub_meshes)
{
mesh.vbo.Destroy();

View File

@@ -23,7 +23,7 @@ namespace mlx
data[3].position = Vec4f(x, y + height, 0.0f, 1.0f);
data[3].uv = Vec2f(1.0f, 0.0f);
std::vector<std::uint32_t> indices = {
std::vector<std::uint32_t> indices{
0,
1,
2,
@@ -40,7 +40,7 @@ namespace mlx
Sprite::Sprite(Renderer& renderer, NonOwningPtr<Texture> texture)
{
MLX_PROFILE_FUNCTION();
Verify((bool)texture, "Sprite: invalid texture");
Verify((bool)texture, "Sprite: invalid texture (internal mlx issue, please report to devs)");
p_mesh = CreateQuad(0, 0, texture->GetWidth(), texture->GetHeight());
p_texture = texture;
@@ -49,6 +49,6 @@ namespace mlx
if(event.What() == Event::DescriptorPoolResetEventCode)
m_set.Reallocate(renderer.GetCurrentFrameIndex());
};
EventBus::RegisterListener({ functor, "__Sprite" + std::to_string(reinterpret_cast<std::uintptr_t>(this)) });
EventBus::RegisterListener({ functor, "__MlxSprite" + std::to_string(reinterpret_cast<std::uintptr_t>(this)) });
}
}

View File

@@ -99,6 +99,7 @@ namespace mlx
void DescriptorPoolManager::Destroy()
{
#pragma omp parallel for
for(auto& pool : m_pools)
pool.Destroy();
}

View File

@@ -1,10 +1,10 @@
#include "vulkan/vulkan_core.h"
#include <PreCompiled.h>
#include <Renderer/Pipelines/Graphics.h>
#include <Renderer/RenderCore.h>
#include <Renderer/Renderer.h>
#include <Renderer/Vertex.h>
#include <Core/EventBus.h>
#include <iostream>
namespace mlx
{
@@ -114,6 +114,7 @@ namespace mlx
scissor.extent = fb_extent;
RenderCore::Get().vkCmdSetScissor(command_buffer, 0, 1, &scissor);
#pragma omp parallel for
for(std::size_t i = 0; i < m_clears.size(); i++)
{
m_clears[i].color.float32[0] = clear[0];
@@ -141,6 +142,7 @@ namespace mlx
MLX_PROFILE_FUNCTION();
p_vertex_shader.reset();
p_fragment_shader.reset();
#pragma omp parallel for
for(auto& fb : m_framebuffers)
{
kvfDestroyFramebuffer(RenderCore::Get().GetDevice(), fb);
@@ -169,6 +171,7 @@ namespace mlx
attachment_views.push_back(p_renderer->GetSwapchainImages()[0].GetImageView());
}
#pragma omp parallel for
for(NonOwningPtr<Texture> image : render_targets)
{
attachments.push_back(kvfBuildAttachmentDescription((kvfIsDepthFormat(image->GetFormat()) ? KVF_IMAGE_DEPTH : KVF_IMAGE_COLOR), image->GetFormat(), image->GetLayout(), image->GetLayout(), clear_attachments, VK_SAMPLE_COUNT_1_BIT));
@@ -195,6 +198,7 @@ namespace mlx
DebugLog("Vulkan : framebuffer created");
}
}
#pragma omp parallel for
for(NonOwningPtr<Texture> image : render_targets)
{
m_framebuffers.push_back(kvfCreateFramebuffer(RenderCore::Get().GetDevice(), m_renderpass, attachment_views.data(), attachment_views.size(), { .width = image->GetWidth(), .height = image->GetHeight() }));
@@ -208,6 +212,7 @@ namespace mlx
if(p_depth)
p_depth->TransitionLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, cmd);
#pragma omp parallel for
for(NonOwningPtr<Texture> image : m_attachments)
{
if(!image->IsInit())

View File

@@ -5,6 +5,7 @@
#include <Renderer/Renderer.h>
#include <Graphics/Scene.h>
#include <Maths/Mat4.h>
#include <iostream>
namespace mlx
{
@@ -44,7 +45,6 @@ namespace mlx
};
p_fragment_shader = std::make_shared<Shader>(fragment_shader_code, ShaderType::Fragment, std::move(fragment_shader_layout));
func::function<void(const EventBase&)> functor = [this, &renderer](const EventBase& event)
{
if(event.What() == Event::ResizeEventCode)
@@ -65,6 +65,7 @@ namespace mlx
p_viewer_data_buffer = std::make_shared<UniformBuffer>();
p_viewer_data_buffer->Init(sizeof(ViewerData), "mlx_2d_pass_viewer_data");
for(std::size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
{
p_viewer_data_set->SetUniformBuffer(i, 0, p_viewer_data_buffer->Get(i));
@@ -93,13 +94,15 @@ namespace mlx
std::uint32_t frame_index = renderer.GetCurrentFrameIndex();
ViewerData viewer_data;
viewer_data.projection_matrix = Mat4f::Ortho(0.0f, render_target.GetWidth(), 0.0f, render_target.GetHeight(), -1.0f, 100'000.0f);
viewer_data.projection_matrix = Mat4f::Ortho(0.0f, render_target.GetWidth(), render_target.GetHeight(), 0.0f, -1.0f, 100'000.0f);
static CPUBuffer buffer(sizeof(ViewerData));
std::memcpy(buffer.GetData(), &viewer_data, buffer.GetSize());
p_viewer_data_buffer->SetData(buffer, frame_index);
VkCommandBuffer cmd = renderer.GetActiveCommandBuffer();
m_pipeline.BindPipeline(cmd, 0, {});
#pragma omp parallel for
for(auto sprite : scene.GetSprites())
{
SpriteData sprite_data;
@@ -107,7 +110,7 @@ namespace mlx
sprite_data.color = sprite->GetColor();
if(!sprite->IsSetInit())
sprite->UpdateDescriptorSet(*p_texture_set);
Verify((bool)sprite->GetTexture(), "a sprite has no texture attached");
Verify((bool)sprite->GetTexture(), "a sprite has no texture attached (internal mlx issue, please report to the devs)");
sprite->GetTexture()->Update(cmd);
sprite->Bind(frame_index, cmd);
std::array<VkDescriptorSet, 2> sets = { p_viewer_data_set->GetSet(frame_index), sprite->GetSet(frame_index) };

View File

@@ -69,10 +69,10 @@ namespace mlx
VkResult result = RenderCore::Get().vkAcquireNextImageKHR(RenderCore::Get().GetDevice(), m_swapchain, UINT64_MAX, m_image_available_semaphores[m_current_frame_index], VK_NULL_HANDLE, &m_swapchain_image_index);
if(result == VK_ERROR_OUT_OF_DATE_KHR)
{
DestroySwapchain();
CreateSwapchain();
EventBus::SendBroadcast(Internal::ResizeEventBroadcast{});
return false;
//DestroySwapchain();
//CreateSwapchain();
//EventBus::SendBroadcast(Internal::ResizeEventBroadcast{});
//return false;
}
else if(result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR)
FatalError("Vulkan error : failed to acquire swapchain image, %", kvfVerbaliseVkResult(result));
@@ -94,9 +94,9 @@ namespace mlx
if(!kvfQueuePresentKHR(RenderCore::Get().GetDevice(), m_render_finished_semaphores[m_current_frame_index], m_swapchain, m_swapchain_image_index) || m_framebuffers_resize)
{
m_framebuffers_resize = false;
DestroySwapchain();
CreateSwapchain();
EventBus::SendBroadcast(Internal::ResizeEventBroadcast{});
//DestroySwapchain();
//CreateSwapchain();
//EventBus::SendBroadcast(Internal::ResizeEventBroadcast{});
}
m_current_frame_index = (m_current_frame_index + 1) % MAX_FRAMES_IN_FLIGHT;
}