fixing bug with image recreation

This commit is contained in:
Kbz-8
2024-11-05 11:50:40 +01:00
parent 5bd66fd362
commit d1a5bceb03
14 changed files with 49 additions and 47 deletions

View File

@@ -8,7 +8,7 @@
#define STB_IMAGE_IMPLEMENTATION
#define STBI_ASSERT(x) mlx::Assert(x, "internal stb assertion " #x)
#define STBI_ASSERT(x) (mlx::Assert(x, "internal stb assertion " #x))
#define STBI_MALLOC(x) (mlx::MemManager::Get().Malloc(x))
#define STBI_REALLOC(p, x) (mlx::MemManager::Get().Realloc(p, x))
#define STBI_FREE(x) (mlx::MemManager::Get().Free(x))
@@ -162,6 +162,10 @@ namespace mlx
#endif
}
m_image = VK_NULL_HANDLE;
m_layout = VK_IMAGE_LAYOUT_UNDEFINED;
m_width = 0;
m_height = 0;
m_is_multisampled = false;
}
void Texture::Init(CPUBuffer pixels, std::uint32_t width, std::uint32_t height, VkFormat format, bool is_multisampled, [[maybe_unused]] std::string_view debug_name)
@@ -269,6 +273,7 @@ namespace mlx
Texture* StbTextureLoad(const std::filesystem::path& file, int* w, int* h)
{
using namespace std::literals;
MLX_PROFILE_FUNCTION();
std::string filename = file.string();
@@ -289,11 +294,9 @@ namespace mlx
Vec2i size;
int channels;
std::uint8_t* data = stbi_load(filename.c_str(), &size.x, &size.y, &channels, STBI_rgb_alpha);
std::uint8_t* data = stbi_load(filename.c_str(), &size.x, &size.y, &channels, 4);
CallOnExit defer([=]() { stbi_image_free(data); });
Verify(channels == 4, "invalid channels number in image loaded (should be 4, was %)", channels);
CPUBuffer buffer(size.x * size.y * 4);
std::memcpy(buffer.GetData(), data, buffer.GetSize());

View File

@@ -103,7 +103,6 @@ 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];
@@ -128,7 +127,6 @@ 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);
@@ -144,6 +142,9 @@ namespace mlx
kvfDestroyPipeline(RenderCore::Get().GetDevice(), m_pipeline);
m_pipeline = VK_NULL_HANDLE;
DebugLog("Vulkan: graphics pipeline destroyed");
p_renderer = nullptr;
m_clears.clear();
m_attachments.clear();
}
void GraphicPipeline::CreateFramebuffers(const std::vector<NonOwningPtr<Texture>>& render_targets, bool clear_attachments)
@@ -157,7 +158,6 @@ namespace mlx
attachment_views.push_back(p_renderer->GetSwapchain().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));
@@ -178,7 +178,6 @@ 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() }));

View File

@@ -1,12 +1,16 @@
#include <PreCompiled.h>
#include <Renderer/RenderCore.h>
#include <Core/Memory.h>
#define KVF_IMPLEMENTATION
#ifdef DEBUG
#define KVF_ENABLE_VALIDATION_LAYERS
#endif
#define KVF_ASSERT(x) mlx::Assert(x, #x)
#define KVF_ASSERT(x) (mlx::Assert(x, "internal kvf assertion " #x))
#define KVF_MALLOC(x) (mlx::MemManager::Get().Malloc(x))
#define KVF_REALLOC(p, x) (mlx::MemManager::Get().Realloc(p, x))
#define KVF_FREE(x) (mlx::MemManager::Get().Free(x))
#if defined(MLX_COMPILER_GCC) || defined(MLX_COMPILER_CLANG)
#pragma clang diagnostic push

View File

@@ -20,7 +20,7 @@ namespace mlx
ShaderLayout fragment_shader_layout(
{
{ 0,
ShaderSetLayout({
ShaderSetLayout({
{ 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER }
})
}

View File

@@ -5,37 +5,30 @@
namespace mlx
{
void RenderPasses::Init(Renderer& renderer)
void RenderPasses::Init()
{
m_2Dpass.Init();
m_final.Init();
func::function<void(const EventBase&)> functor = [this, &renderer](const EventBase& event)
func::function<void(const EventBase&)> functor = [this](const EventBase& event)
{
if(event.What() == Event::ResizeEventCode)
{
m_main_render_texture.Destroy();
auto extent = kvfGetSwapchainImagesSize(renderer.GetSwapchain().Get());
#ifdef DEBUG
m_main_render_texture.Init({}, extent.width, extent.height, VK_FORMAT_R8G8B8A8_SRGB, false, "mlx_renderpasses_target");
#else
m_main_render_texture.Init({}, extent.width, extent.height, VK_FORMAT_R8G8B8A8_SRGB, false, {});
#endif
m_main_render_texture.TransitionLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
}
};
EventBus::RegisterListener({ functor, "__MlxRenderPasses" });
auto extent = kvfGetSwapchainImagesSize(renderer.GetSwapchain().Get());
#ifdef DEBUG
m_main_render_texture.Init({}, extent.width, extent.height, VK_FORMAT_R8G8B8A8_SRGB, false, "mlx_renderpasses_target");
#else
m_main_render_texture.Init({}, extent.width, extent.height, VK_FORMAT_R8G8B8A8_SRGB, false, {});
#endif
m_main_render_texture.TransitionLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
}
void RenderPasses::Pass(Scene& scene, Renderer& renderer, const Vec4f& clear_color)
{
if(!m_main_render_texture.IsInit())
{
auto extent = kvfGetSwapchainImagesSize(renderer.GetSwapchain().Get());
#ifdef DEBUG
m_main_render_texture.Init({}, extent.width, extent.height, VK_FORMAT_R8G8B8A8_SRGB, false, "mlx_renderpasses_target");
#else
m_main_render_texture.Init({}, extent.width, extent.height, VK_FORMAT_R8G8B8A8_SRGB, false, {});
#endif
m_main_render_texture.TransitionLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
}
m_main_render_texture.Clear(renderer.GetActiveCommandBuffer(), clear_color);
m_2Dpass.Pass(scene, renderer, m_main_render_texture);

View File

@@ -6,10 +6,10 @@
namespace mlx
{
void SceneRenderer::Init(Renderer& renderer)
void SceneRenderer::Init()
{
MLX_PROFILE_FUNCTION();
m_passes.Init(renderer);
m_passes.Init();
}
void SceneRenderer::Render(Scene& scene, Renderer& renderer)