@@ -12,6 +12,7 @@ typedef struct RenderData
12
12
{
13
13
VkRenderPass renderpass ;
14
14
VkFramebuffer * framebuffers ;
15
+ VkExtent2D swapchain_extent ;
15
16
mlx_context mlx ;
16
17
mlx_window win ;
17
18
mlx_image img ;
@@ -21,6 +22,16 @@ void VulkanRender(VkCommandBuffer cmd, void* param)
21
22
{
22
23
RenderData * data = (RenderData * )param ;
23
24
25
+ VkExtent2D swapchain_extent = GetMlxFuncs ()-> mlx_get_vk_swapchain_extent (data -> mlx , data -> win );
26
+ if (data -> swapchain_extent .width != swapchain_extent .width || data -> swapchain_extent .height != swapchain_extent .height )
27
+ {
28
+ data -> swapchain_extent = swapchain_extent ;
29
+ VulkanDestroyFramebuffers (data -> mlx , data -> win , data -> framebuffers );
30
+ GetVulkanFuncs ()-> vkDestroyRenderPass (GetMlxFuncs ()-> mlx_get_vk_device (data -> mlx ), data -> renderpass , NULL );
31
+ data -> renderpass = VulkanCreateRenderPass (data -> mlx , data -> win );
32
+ data -> framebuffers = VulkanCreateFramebuffers (data -> mlx , data -> win , data -> renderpass );
33
+ }
34
+
24
35
ImGui_ImplVulkan_NewFrame ();
25
36
ImGui_ImplSDL2_NewFrame ();
26
37
igNewFrame ();
@@ -34,8 +45,8 @@ void VulkanRender(VkCommandBuffer cmd, void* param)
34
45
info .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO ;
35
46
info .renderPass = data -> renderpass ;
36
47
info .framebuffer = data -> framebuffers [GetMlxFuncs ()-> mlx_get_current_vk_swapchain_image_index (data -> mlx , data -> win )];
37
- info .renderArea .extent .width = GetMlxFuncs () -> mlx_get_vk_swapchain_extent ( data -> mlx , data -> win ) .width ;
38
- info .renderArea .extent .height = GetMlxFuncs () -> mlx_get_vk_swapchain_extent ( data -> mlx , data -> win ) .height ;
48
+ info .renderArea .extent .width = swapchain_extent .width ;
49
+ info .renderArea .extent .height = swapchain_extent .height ;
39
50
GetVulkanFuncs ()-> vkCmdBeginRenderPass (cmd , & info , VK_SUBPASS_CONTENTS_INLINE );
40
51
41
52
ImGui_ImplVulkan_RenderDrawData (draw_data , cmd , VK_NULL_HANDLE );
@@ -82,7 +93,7 @@ int main(void)
82
93
info .title = "MLX Window" ;
83
94
info .width = 1250 ;
84
95
info .height = 720 ;
85
- info .is_resizable = false ;
96
+ info .is_resizable = true ;
86
97
mlx_window win = mlx_new_window (mlx , & info );
87
98
88
99
LoadMlxBindings (mlx , GetMlxFuncs ());
@@ -126,17 +137,14 @@ int main(void)
126
137
data .mlx = mlx ;
127
138
data .win = win ;
128
139
data .framebuffers = framebuffers ;
140
+ data .swapchain_extent = GetMlxFuncs ()-> mlx_get_vk_swapchain_extent (mlx , win );
129
141
data .img = mlx_new_image_from_file (mlx , "MacroLibX/example/42_logo.png" , NULL , NULL );
130
142
131
143
mlx_add_loop_hook (mlx , MlxRender , & data );
132
144
GetMlxFuncs ()-> mlx_add_pre_render_hook (mlx , win , VulkanRender , & data );
133
145
mlx_loop (mlx );
134
146
135
- GetVulkanFuncs ()-> vkDeviceWaitIdle (device );
136
-
137
- for (int i = 0 ; i < GetMlxFuncs ()-> mlx_get_vk_swapchain_image_count (mlx , win ); i ++ )
138
- GetVulkanFuncs ()-> vkDestroyFramebuffer (device , framebuffers [i ], NULL );
139
- free (framebuffers );
147
+ VulkanDestroyFramebuffers (mlx , win , framebuffers );
140
148
141
149
ImGui_ImplVulkan_Shutdown ();
142
150
ImGui_ImplSDL2_Shutdown ();
0 commit comments