X-Git-Url: https://eleni.mutantstargoat.com/git/?p=vkrt;a=blobdiff_plain;f=src%2Fmain.cc;h=5ec96d4cc7c9ccaf78ea34dd50d34c1c531eedb8;hp=d642aab00041230d197096fed0c7493b6a3b8714;hb=c7de7f04077b07757ffef63ce6771a9d561945d5;hpb=739a8266145a78fdc015ac74c890474f023b1fd1 diff --git a/src/main.cc b/src/main.cc index d642aab..5ec96d4 100644 --- a/src/main.cc +++ b/src/main.cc @@ -19,7 +19,6 @@ #include "camera.h" /* defines */ -#define FRAME_LAG 2 #define FENCE_TIMEOUT UINT64_MAX /**************************/ @@ -100,7 +99,7 @@ static std::vectorvk_framebuffers; /* for the moment: one cmd buffer per swapchain image */ static std::vectorvk_cmd_buffers; static std::vectorvk_fences; -static struct vk_semaphores vk_semas[FRAME_LAG]; +static struct vk_semaphores *vk_semas; /* FIXME make them part of each object's functions/params */ static struct vk_renderer vk_rnd; @@ -127,14 +126,14 @@ int main(int argc, char** argv) if (glfwVulkanSupported() != GLFW_TRUE) { fprintf(stderr, "Vulkan is not supported on this device.\n"); - return false; + return 1; } glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); if (!(win = glfwCreateWindow(win_w, win_h, "helloworld rt", 0, 0))) { fprintf(stderr, "Failed to create GLFW window\n"); - return false; + return 1; } glfwSetKeyCallback(win, clb_key); @@ -148,7 +147,7 @@ int main(int argc, char** argv) if (!vk_init_ctx_for_rendering(&vk_core, true, vk_enable_layers)) { fprintf(stderr, "Failed to initialize Vulkan context.\n"); - return false; + return 1; } /*********************************************************** @@ -159,7 +158,7 @@ int main(int argc, char** argv) if (glfwCreateWindowSurface(vk_core.inst, win, 0, &vk_surf) != VK_SUCCESS) { fprintf(stderr, "Failed to create XCB surface.\n"); - return false; + return 1; } /*********************************************************** @@ -347,8 +346,9 @@ display() } while (err != VK_SUCCESS); /* FIXME update buffer data */ - if (!vk_record_cmd_buffer(&vk_core, vk_cmd_buffers[0], - &vk_rnd, 0, + if (!vk_record_cmd_buffer(&vk_core, + vk_cmd_buffers[0], + &vk_rnd, 4, vk_fb_color, vk_framebuffers[vk_current_image], 2, 0, @@ -386,7 +386,7 @@ display() abort(); } - vk_frame_idx = (vk_frame_idx + 1) % FRAME_LAG; + vk_frame_idx = (vk_frame_idx + 1) % (vk_chain.num_images - 1); printf("display %d\n", count++); printf("current image %u\n", vk_current_image); @@ -396,6 +396,8 @@ display() static void vk_cleanup() { + int num_images = vk_chain.num_images - 1; + vk_destroy_image(&vk_core, &vk_depth_att.obj); vk_destroy_renderer(&vk_core, &vk_rnd); @@ -420,8 +422,9 @@ vk_cleanup() vk_destroy_fences(&vk_core, vk_fences.size(), vk_fences.data()); vk_fences.clear(); - for (int i = 0; i < FRAME_LAG; i++) + for (int i = 0; i < num_images; i++) vk_destroy_semaphores(&vk_core, &vk_semas[i]); + free(vk_semas); for (size_t i = 0; i < vk_cmd_buffers.size(); i++) vk_destroy_cmd_buffers(&vk_core, vk_cmd_buffers.size(), vk_cmd_buffers.data()); @@ -444,9 +447,10 @@ vk_create_sync_objects() memset(&sinfo, 0, sizeof sinfo); sinfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - vk_fences.resize(FRAME_LAG, VK_NULL_HANDLE); + vk_fences.resize(vk_chain.num_images - 1, VK_NULL_HANDLE); - for (int i = 0; i < FRAME_LAG; i++) { + vk_semas = (vk_semaphores *)malloc(sizeof(vk_semaphores) * (vk_chain.num_images - 1)); + for (uint32_t i = 0; i < (vk_chain.num_images - 1); i++) { if (vkCreateFence(vk_core.dev, &finfo, 0, &vk_fences[i]) != VK_SUCCESS) { fprintf(stderr, "Failed to create fence: %d\n", i); return false;