diff --git a/display/lava-extras/display/DisplayWindow.cc b/display/lava-extras/display/DisplayWindow.cc index d9f1b575e146bfc257d98a377855360383185594..1be02bb7f04aefe7df607460e748b898bf6a0e8e 100644 --- a/display/lava-extras/display/DisplayWindow.cc +++ b/display/lava-extras/display/DisplayWindow.cc @@ -141,15 +141,25 @@ DisplayWindow::Frame DisplayWindow::startFrame() { assert(mChain && "You need to provide a handler for swapchain creation."); while (true) { - auto res = vkAcquireNextImageKHR(mDevice->handle(), mChain, 1e9, - mImageReady, {}, &mPresentIndex); - if (res == VK_TIMEOUT) { - lava::error() - << "GlfwWindow::startFrame(): acquireNextImage timed out (>1s)"; - continue; + // TODO: count retries, risk of infinite loop! + // TODO: consolidate into abstract window base class? -> GlfwWindow + try { + auto result = mDevice->handle().acquireNextImageKHR(mChain, 1e9, mImageReady, {}); + + if(result.result == vk::Result::eTimeout || + result.result == vk::Result::eNotReady) { + lava::error() << "GlfwWindow::startFrame(): acquireNextImage timed out (>1s)"; + continue; + } + if(result.result == vk::Result::eSuboptimalKHR) { + mDevice->handle().waitIdle(); + buildSwapchain(); + continue; + } + + mPresentIndex = result.value; } - - if (res == VK_ERROR_OUT_OF_DATE_KHR || res == VK_SUBOPTIMAL_KHR) { + catch(vk::OutOfDateKHRError) { mDevice->handle().waitIdle(); buildSwapchain(); continue; @@ -174,19 +184,12 @@ DisplayWindow::Frame::~Frame() { info.pWaitSemaphores = &window->mRenderingComplete; info.waitSemaphoreCount = 1; - auto result = vkQueuePresentKHR(window->mQueue->handle(), (VkPresentInfoKHR*)&info); - if (result == VK_ERROR_OUT_OF_DATE_KHR) { + auto result = window->mQueue->handle().presentKHR(info); + if (result == vk::Result::eErrorOutOfDateKHR) { std::cout << "DisplayWindow: Rebuilding swapchain" << std::endl; window->mDevice->handle().waitIdle(); window->buildSwapchain(); } - - //try { - // window->mQueue->handle().presentKHR(info); - //} catch (vk::OutOfDateKHRError const &) { - // window->mDevice->handle().waitIdle(); - // window->buildSwapchain(); - //} } DisplayWindow::Frame::Frame(DisplayWindow *parent) : window(parent) {} diff --git a/imgui/lava-extras/imgui/impl/imgui_impl_lava.cc b/imgui/lava-extras/imgui/impl/imgui_impl_lava.cc index 18c477ea20116b0d4009633330c332279dd2f02f..a94b4bc6de40991cfc2861637279930b1f806e82 100644 --- a/imgui/lava-extras/imgui/impl/imgui_impl_lava.cc +++ b/imgui/lava-extras/imgui/impl/imgui_impl_lava.cc @@ -150,10 +150,14 @@ static uint32_t __glsl_shader_frag_spv[] = 0x00010038 }; +namespace { +auto const& d = VULKAN_HPP_DEFAULT_DISPATCHER; +} + static uint32_t ImGui_ImplVulkan_MemoryType(VkMemoryPropertyFlags properties, uint32_t type_bits) { VkPhysicalDeviceMemoryProperties prop; - vkGetPhysicalDeviceMemoryProperties(g_PhysicalDevice, &prop); + d.vkGetPhysicalDeviceMemoryProperties(g_PhysicalDevice, &prop); for (uint32_t i = 0; i < prop.memoryTypeCount; i++) if ((prop.memoryTypes[i].propertyFlags & properties) == properties && type_bits & (1<<i)) return i; @@ -170,9 +174,9 @@ static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory { VkResult err; if (buffer != VK_NULL_HANDLE) - vkDestroyBuffer(g_Device, buffer, g_Allocator); + d.vkDestroyBuffer(g_Device, buffer, g_Allocator); if (buffer_memory) - vkFreeMemory(g_Device, buffer_memory, g_Allocator); + d.vkFreeMemory(g_Device, buffer_memory, g_Allocator); VkDeviceSize vertex_buffer_size_aligned = ((new_size - 1) / g_BufferMemoryAlignment + 1) * g_BufferMemoryAlignment; VkBufferCreateInfo buffer_info = {}; @@ -180,20 +184,20 @@ static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory buffer_info.size = vertex_buffer_size_aligned; buffer_info.usage = usage; buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - err = vkCreateBuffer(g_Device, &buffer_info, g_Allocator, &buffer); + err = d.vkCreateBuffer(g_Device, &buffer_info, g_Allocator, &buffer); check_vk_result(err); VkMemoryRequirements req; - vkGetBufferMemoryRequirements(g_Device, buffer, &req); + d.vkGetBufferMemoryRequirements(g_Device, buffer, &req); g_BufferMemoryAlignment = (g_BufferMemoryAlignment > req.alignment) ? g_BufferMemoryAlignment : req.alignment; VkMemoryAllocateInfo alloc_info = {}; alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; alloc_info.allocationSize = req.size; alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits); - err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &buffer_memory); + err = d.vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &buffer_memory); check_vk_result(err); - err = vkBindBufferMemory(g_Device, buffer, buffer_memory, 0); + err = d.vkBindBufferMemory(g_Device, buffer, buffer_memory, 0); check_vk_result(err); p_buffer_size = new_size; } @@ -221,9 +225,9 @@ void ImGui_ImplLava_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comman { ImDrawVert* vtx_dst = NULL; ImDrawIdx* idx_dst = NULL; - err = vkMapMemory(g_Device, fd->VertexBufferMemory, 0, vertex_size, 0, (void**)(&vtx_dst)); + err = d.vkMapMemory(g_Device, fd->VertexBufferMemory, 0, vertex_size, 0, (void**)(&vtx_dst)); check_vk_result(err); - err = vkMapMemory(g_Device, fd->IndexBufferMemory, 0, index_size, 0, (void**)(&idx_dst)); + err = d.vkMapMemory(g_Device, fd->IndexBufferMemory, 0, index_size, 0, (void**)(&idx_dst)); check_vk_result(err); for (int n = 0; n < draw_data->CmdListsCount; n++) { @@ -240,25 +244,25 @@ void ImGui_ImplLava_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comman range[1].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; range[1].memory = fd->IndexBufferMemory; range[1].size = VK_WHOLE_SIZE; - err = vkFlushMappedMemoryRanges(g_Device, 2, range); + err = d.vkFlushMappedMemoryRanges(g_Device, 2, range); check_vk_result(err); - vkUnmapMemory(g_Device, fd->VertexBufferMemory); - vkUnmapMemory(g_Device, fd->IndexBufferMemory); + d.vkUnmapMemory(g_Device, fd->VertexBufferMemory); + d.vkUnmapMemory(g_Device, fd->IndexBufferMemory); } // Bind pipeline and descriptor sets: { - vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, g_Pipeline); + d.vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, g_Pipeline); VkDescriptorSet desc_set[1] = { g_DescriptorSet }; - vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, g_PipelineLayout, 0, 1, desc_set, 0, NULL); + d.vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, g_PipelineLayout, 0, 1, desc_set, 0, NULL); } // Bind Vertex And Index Buffer: { VkBuffer vertex_buffers[1] = { fd->VertexBuffer }; VkDeviceSize vertex_offset[1] = { 0 }; - vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffers, vertex_offset); - vkCmdBindIndexBuffer(command_buffer, fd->IndexBuffer, 0, VK_INDEX_TYPE_UINT16); + d.vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffers, vertex_offset); + d.vkCmdBindIndexBuffer(command_buffer, fd->IndexBuffer, 0, VK_INDEX_TYPE_UINT16); } // Setup viewport: @@ -270,7 +274,7 @@ void ImGui_ImplLava_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comman viewport.height = draw_data->DisplaySize.y; viewport.minDepth = 0.0f; viewport.maxDepth = 1.0f; - vkCmdSetViewport(command_buffer, 0, 1, &viewport); + d.vkCmdSetViewport(command_buffer, 0, 1, &viewport); } // Setup scale and translation: @@ -282,8 +286,8 @@ void ImGui_ImplLava_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comman float translate[2]; translate[0] = -1.0f - draw_data->DisplayPos.x * scale[0]; translate[1] = -1.0f - draw_data->DisplayPos.y * scale[1]; - vkCmdPushConstants(command_buffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 0, sizeof(float) * 2, scale); - vkCmdPushConstants(command_buffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate); + d.vkCmdPushConstants(command_buffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 0, sizeof(float) * 2, scale); + d.vkCmdPushConstants(command_buffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate); } // Render the command lists: @@ -309,10 +313,10 @@ void ImGui_ImplLava_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comman scissor.offset.y = (int32_t)(pcmd->ClipRect.y - display_pos.y) > 0 ? (int32_t)(pcmd->ClipRect.y - display_pos.y) : 0; scissor.extent.width = (uint32_t)(pcmd->ClipRect.z - pcmd->ClipRect.x); scissor.extent.height = (uint32_t)(pcmd->ClipRect.w - pcmd->ClipRect.y + 1); // FIXME: Why +1 here? - vkCmdSetScissor(command_buffer, 0, 1, &scissor); + d.vkCmdSetScissor(command_buffer, 0, 1, &scissor); // Draw - vkCmdDrawIndexed(command_buffer, pcmd->ElemCount, 1, idx_offset, vtx_offset, 0); + d.vkCmdDrawIndexed(command_buffer, pcmd->ElemCount, 1, idx_offset, vtx_offset, 0); } idx_offset += pcmd->ElemCount; } @@ -347,17 +351,17 @@ bool ImGui_ImplLava_CreateFontsTexture(VkCommandBuffer command_buffer) info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - err = vkCreateImage(g_Device, &info, g_Allocator, &g_FontImage); + err = d.vkCreateImage(g_Device, &info, g_Allocator, &g_FontImage); check_vk_result(err); VkMemoryRequirements req; - vkGetImageMemoryRequirements(g_Device, g_FontImage, &req); + d.vkGetImageMemoryRequirements(g_Device, g_FontImage, &req); VkMemoryAllocateInfo alloc_info = {}; alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; alloc_info.allocationSize = req.size; alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, req.memoryTypeBits); - err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_FontMemory); + err = d.vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_FontMemory); check_vk_result(err); - err = vkBindImageMemory(g_Device, g_FontImage, g_FontMemory, 0); + err = d.vkBindImageMemory(g_Device, g_FontImage, g_FontMemory, 0); check_vk_result(err); } @@ -371,7 +375,7 @@ bool ImGui_ImplLava_CreateFontsTexture(VkCommandBuffer command_buffer) info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; info.subresourceRange.levelCount = 1; info.subresourceRange.layerCount = 1; - err = vkCreateImageView(g_Device, &info, g_Allocator, &g_FontView); + err = d.vkCreateImageView(g_Device, &info, g_Allocator, &g_FontView); check_vk_result(err); } @@ -387,7 +391,7 @@ bool ImGui_ImplLava_CreateFontsTexture(VkCommandBuffer command_buffer) write_desc[0].descriptorCount = 1; write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; write_desc[0].pImageInfo = desc_image; - vkUpdateDescriptorSets(g_Device, 1, write_desc, 0, NULL); + d.vkUpdateDescriptorSets(g_Device, 1, write_desc, 0, NULL); } // Create the Upload Buffer: @@ -397,34 +401,34 @@ bool ImGui_ImplLava_CreateFontsTexture(VkCommandBuffer command_buffer) buffer_info.size = upload_size; buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - err = vkCreateBuffer(g_Device, &buffer_info, g_Allocator, &g_UploadBuffer); + err = d.vkCreateBuffer(g_Device, &buffer_info, g_Allocator, &g_UploadBuffer); check_vk_result(err); VkMemoryRequirements req; - vkGetBufferMemoryRequirements(g_Device, g_UploadBuffer, &req); + d.vkGetBufferMemoryRequirements(g_Device, g_UploadBuffer, &req); g_BufferMemoryAlignment = (g_BufferMemoryAlignment > req.alignment) ? g_BufferMemoryAlignment : req.alignment; VkMemoryAllocateInfo alloc_info = {}; alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; alloc_info.allocationSize = req.size; alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits); - err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_UploadBufferMemory); + err = d.vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_UploadBufferMemory); check_vk_result(err); - err = vkBindBufferMemory(g_Device, g_UploadBuffer, g_UploadBufferMemory, 0); + err = d.vkBindBufferMemory(g_Device, g_UploadBuffer, g_UploadBufferMemory, 0); check_vk_result(err); } // Upload to Buffer: { char* map = NULL; - err = vkMapMemory(g_Device, g_UploadBufferMemory, 0, upload_size, 0, (void**)(&map)); + err = d.vkMapMemory(g_Device, g_UploadBufferMemory, 0, upload_size, 0, (void**)(&map)); check_vk_result(err); memcpy(map, pixels, upload_size); VkMappedMemoryRange range[1] = {}; range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; range[0].memory = g_UploadBufferMemory; range[0].size = upload_size; - err = vkFlushMappedMemoryRanges(g_Device, 1, range); + err = d.vkFlushMappedMemoryRanges(g_Device, 1, range); check_vk_result(err); - vkUnmapMemory(g_Device, g_UploadBufferMemory); + d.vkUnmapMemory(g_Device, g_UploadBufferMemory); } // Copy to Image: @@ -440,7 +444,7 @@ bool ImGui_ImplLava_CreateFontsTexture(VkCommandBuffer command_buffer) copy_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; copy_barrier[0].subresourceRange.levelCount = 1; copy_barrier[0].subresourceRange.layerCount = 1; - vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 0, NULL, 1, copy_barrier); + d.vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 0, NULL, 1, copy_barrier); VkBufferImageCopy region = {}; region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; @@ -448,7 +452,7 @@ bool ImGui_ImplLava_CreateFontsTexture(VkCommandBuffer command_buffer) region.imageExtent.width = width; region.imageExtent.height = height; region.imageExtent.depth = 1; - vkCmdCopyBufferToImage(command_buffer, g_UploadBuffer, g_FontImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + d.vkCmdCopyBufferToImage(command_buffer, g_UploadBuffer, g_FontImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); VkImageMemoryBarrier use_barrier[1] = {}; use_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; @@ -462,7 +466,7 @@ bool ImGui_ImplLava_CreateFontsTexture(VkCommandBuffer command_buffer) use_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; use_barrier[0].subresourceRange.levelCount = 1; use_barrier[0].subresourceRange.layerCount = 1; - vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, NULL, 0, NULL, 1, use_barrier); + d.vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, NULL, 0, NULL, 1, use_barrier); } // Store our identifier @@ -483,13 +487,13 @@ bool ImGui_ImplLava_CreateDeviceObjects() vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; vert_info.codeSize = sizeof(__glsl_shader_vert_spv); vert_info.pCode = (uint32_t*)__glsl_shader_vert_spv; - err = vkCreateShaderModule(g_Device, &vert_info, g_Allocator, &vert_module); + err = d.vkCreateShaderModule(g_Device, &vert_info, g_Allocator, &vert_module); check_vk_result(err); VkShaderModuleCreateInfo frag_info = {}; frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; frag_info.codeSize = sizeof(__glsl_shader_frag_spv); frag_info.pCode = (uint32_t*)__glsl_shader_frag_spv; - err = vkCreateShaderModule(g_Device, &frag_info, g_Allocator, &frag_module); + err = d.vkCreateShaderModule(g_Device, &frag_info, g_Allocator, &frag_module); check_vk_result(err); } @@ -506,7 +510,7 @@ bool ImGui_ImplLava_CreateDeviceObjects() info.minLod = -1000; info.maxLod = 1000; info.maxAnisotropy = 1.0f; - err = vkCreateSampler(g_Device, &info, g_Allocator, &g_FontSampler); + err = d.vkCreateSampler(g_Device, &info, g_Allocator, &g_FontSampler); check_vk_result(err); } @@ -522,7 +526,7 @@ bool ImGui_ImplLava_CreateDeviceObjects() info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; info.bindingCount = 1; info.pBindings = binding; - err = vkCreateDescriptorSetLayout(g_Device, &info, g_Allocator, &g_DescriptorSetLayout); + err = d.vkCreateDescriptorSetLayout(g_Device, &info, g_Allocator, &g_DescriptorSetLayout); check_vk_result(err); } @@ -533,7 +537,7 @@ bool ImGui_ImplLava_CreateDeviceObjects() alloc_info.descriptorPool = g_DescriptorPool; alloc_info.descriptorSetCount = 1; alloc_info.pSetLayouts = &g_DescriptorSetLayout; - err = vkAllocateDescriptorSets(g_Device, &alloc_info, &g_DescriptorSet); + err = d.vkAllocateDescriptorSets(g_Device, &alloc_info, &g_DescriptorSet); check_vk_result(err); } @@ -551,7 +555,7 @@ bool ImGui_ImplLava_CreateDeviceObjects() layout_info.pSetLayouts = set_layout; layout_info.pushConstantRangeCount = 1; layout_info.pPushConstantRanges = push_constants; - err = vkCreatePipelineLayout(g_Device, &layout_info, g_Allocator, &g_PipelineLayout); + err = d.vkCreatePipelineLayout(g_Device, &layout_info, g_Allocator, &g_PipelineLayout); check_vk_result(err); } @@ -649,11 +653,11 @@ bool ImGui_ImplLava_CreateDeviceObjects() info.pDynamicState = &dynamic_state; info.layout = g_PipelineLayout; info.renderPass = g_RenderPass; - err = vkCreateGraphicsPipelines(g_Device, g_PipelineCache, 1, &info, g_Allocator, &g_Pipeline); + err = d.vkCreateGraphicsPipelines(g_Device, g_PipelineCache, 1, &info, g_Allocator, &g_Pipeline); check_vk_result(err); - vkDestroyShaderModule(g_Device, vert_module, g_Allocator); - vkDestroyShaderModule(g_Device, frag_module, g_Allocator); + d.vkDestroyShaderModule(g_Device, vert_module, g_Allocator); + d.vkDestroyShaderModule(g_Device, frag_module, g_Allocator); return true; } @@ -662,12 +666,12 @@ void ImGui_ImplLava_InvalidateFontUploadObjects() { if (g_UploadBuffer) { - vkDestroyBuffer(g_Device, g_UploadBuffer, g_Allocator); + d.vkDestroyBuffer(g_Device, g_UploadBuffer, g_Allocator); g_UploadBuffer = VK_NULL_HANDLE; } if (g_UploadBufferMemory) { - vkFreeMemory(g_Device, g_UploadBufferMemory, g_Allocator); + d.vkFreeMemory(g_Device, g_UploadBufferMemory, g_Allocator); g_UploadBufferMemory = VK_NULL_HANDLE; } } @@ -679,19 +683,19 @@ void ImGui_ImplLava_InvalidateDeviceObjects() for (int i = 0; i < IMGUI_VK_QUEUED_FRAMES; i++) { FrameDataForRender* fd = &g_FramesDataBuffers[i]; - if (fd->VertexBuffer) { vkDestroyBuffer (g_Device, fd->VertexBuffer, g_Allocator); fd->VertexBuffer = VK_NULL_HANDLE; } - if (fd->VertexBufferMemory) { vkFreeMemory (g_Device, fd->VertexBufferMemory, g_Allocator); fd->VertexBufferMemory = VK_NULL_HANDLE; } - if (fd->IndexBuffer) { vkDestroyBuffer (g_Device, fd->IndexBuffer, g_Allocator); fd->IndexBuffer = VK_NULL_HANDLE; } - if (fd->IndexBufferMemory) { vkFreeMemory (g_Device, fd->IndexBufferMemory, g_Allocator); fd->IndexBufferMemory = VK_NULL_HANDLE; } + if (fd->VertexBuffer) { d.vkDestroyBuffer (g_Device, fd->VertexBuffer, g_Allocator); fd->VertexBuffer = VK_NULL_HANDLE; } + if (fd->VertexBufferMemory) { d.vkFreeMemory (g_Device, fd->VertexBufferMemory, g_Allocator); fd->VertexBufferMemory = VK_NULL_HANDLE; } + if (fd->IndexBuffer) { d.vkDestroyBuffer (g_Device, fd->IndexBuffer, g_Allocator); fd->IndexBuffer = VK_NULL_HANDLE; } + if (fd->IndexBufferMemory) { d.vkFreeMemory (g_Device, fd->IndexBufferMemory, g_Allocator); fd->IndexBufferMemory = VK_NULL_HANDLE; } } - if (g_FontView) { vkDestroyImageView(g_Device, g_FontView, g_Allocator); g_FontView = VK_NULL_HANDLE; } - if (g_FontImage) { vkDestroyImage(g_Device, g_FontImage, g_Allocator); g_FontImage = VK_NULL_HANDLE; } - if (g_FontMemory) { vkFreeMemory(g_Device, g_FontMemory, g_Allocator); g_FontMemory = VK_NULL_HANDLE; } - if (g_FontSampler) { vkDestroySampler(g_Device, g_FontSampler, g_Allocator); g_FontSampler = VK_NULL_HANDLE; } - if (g_DescriptorSetLayout) { vkDestroyDescriptorSetLayout(g_Device, g_DescriptorSetLayout, g_Allocator); g_DescriptorSetLayout = VK_NULL_HANDLE; } - if (g_PipelineLayout) { vkDestroyPipelineLayout(g_Device, g_PipelineLayout, g_Allocator); g_PipelineLayout = VK_NULL_HANDLE; } - if (g_Pipeline) { vkDestroyPipeline(g_Device, g_Pipeline, g_Allocator); g_Pipeline = VK_NULL_HANDLE; } + if (g_FontView) { d.vkDestroyImageView(g_Device, g_FontView, g_Allocator); g_FontView = VK_NULL_HANDLE; } + if (g_FontImage) { d.vkDestroyImage(g_Device, g_FontImage, g_Allocator); g_FontImage = VK_NULL_HANDLE; } + if (g_FontMemory) { d.vkFreeMemory(g_Device, g_FontMemory, g_Allocator); g_FontMemory = VK_NULL_HANDLE; } + if (g_FontSampler) { d.vkDestroySampler(g_Device, g_FontSampler, g_Allocator); g_FontSampler = VK_NULL_HANDLE; } + if (g_DescriptorSetLayout) { d.vkDestroyDescriptorSetLayout(g_Device, g_DescriptorSetLayout, g_Allocator); g_DescriptorSetLayout = VK_NULL_HANDLE; } + if (g_PipelineLayout) { d.vkDestroyPipelineLayout(g_Device, g_PipelineLayout, g_Allocator); g_PipelineLayout = VK_NULL_HANDLE; } + if (g_Pipeline) { d.vkDestroyPipeline(g_Device, g_Pipeline, g_Allocator); g_Pipeline = VK_NULL_HANDLE; } } bool ImGui_ImplLava_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass render_pass) @@ -785,10 +789,10 @@ VkSurfaceFormatKHR ImGui_ImplLavaH_SelectSurfaceFormat(VkPhysicalDevice physical // Additionally several new color spaces were introduced with Vulkan Spec v1.0.40, // hence we must make sure that a format with the mostly available color space, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, is found and used. uint32_t avail_count; - vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface, &avail_count, NULL); + d.vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface, &avail_count, NULL); ImVector<VkSurfaceFormatKHR> avail_format; avail_format.resize((int)avail_count); - vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface, &avail_count, avail_format.Data); + d.vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface, &avail_count, avail_format.Data); // First check if only one format, VK_FORMAT_UNDEFINED, is available, which would imply that any format is available if (avail_count == 1) @@ -826,10 +830,10 @@ VkPresentModeKHR ImGui_ImplLavaH_SelectPresentMode(VkPhysicalDevice physical_dev // Request a certain mode and confirm that it is available. If not use VK_PRESENT_MODE_FIFO_KHR which is mandatory uint32_t avail_count = 0; - vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device, surface, &avail_count, NULL); + d.vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device, surface, &avail_count, NULL); ImVector<VkPresentModeKHR> avail_modes; avail_modes.resize((int)avail_count); - vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device, surface, &avail_count, avail_modes.Data); + d.vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device, surface, &avail_count, avail_modes.Data); //for (uint32_t avail_i = 0; avail_i < avail_count; avail_i++) // printf("[vulkan] avail_modes[%d] = %d\n", avail_i, avail_modes[avail_i]); @@ -857,7 +861,7 @@ void ImGui_ImplLavaH_CreateWindowDataCommandBuffers(VkPhysicalDevice physical_de info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; info.queueFamilyIndex = queue_family; - err = vkCreateCommandPool(device, &info, allocator, &fd->CommandPool); + err = d.vkCreateCommandPool(device, &info, allocator, &fd->CommandPool); check_vk_result(err); } { @@ -866,22 +870,22 @@ void ImGui_ImplLavaH_CreateWindowDataCommandBuffers(VkPhysicalDevice physical_de info.commandPool = fd->CommandPool; info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; info.commandBufferCount = 1; - err = vkAllocateCommandBuffers(device, &info, &fd->CommandBuffer); + err = d.vkAllocateCommandBuffers(device, &info, &fd->CommandBuffer); check_vk_result(err); } { VkFenceCreateInfo info = {}; info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; info.flags = VK_FENCE_CREATE_SIGNALED_BIT; - err = vkCreateFence(device, &info, allocator, &fd->Fence); + err = d.vkCreateFence(device, &info, allocator, &fd->Fence); check_vk_result(err); } { VkSemaphoreCreateInfo info = {}; info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - err = vkCreateSemaphore(device, &info, allocator, &fd->ImageAcquiredSemaphore); + err = d.vkCreateSemaphore(device, &info, allocator, &fd->ImageAcquiredSemaphore); check_vk_result(err); - err = vkCreateSemaphore(device, &info, allocator, &fd->RenderCompleteSemaphore); + err = d.vkCreateSemaphore(device, &info, allocator, &fd->RenderCompleteSemaphore); check_vk_result(err); } } @@ -905,20 +909,20 @@ void ImGui_ImplLavaH_CreateWindowDataSwapChainAndFramebuffer(VkPhysicalDevice ph VkResult err; VkSwapchainKHR old_swapchain = wd->Swapchain; - err = vkDeviceWaitIdle(device); + err = d.vkDeviceWaitIdle(device); check_vk_result(err); // Destroy old Framebuffer for (uint32_t i = 0; i < wd->BackBufferCount; i++) { if (wd->BackBufferView[i]) - vkDestroyImageView(device, wd->BackBufferView[i], allocator); + d.vkDestroyImageView(device, wd->BackBufferView[i], allocator); if (wd->Framebuffer[i]) - vkDestroyFramebuffer(device, wd->Framebuffer[i], allocator); + d.vkDestroyFramebuffer(device, wd->Framebuffer[i], allocator); } wd->BackBufferCount = 0; if (wd->RenderPass) - vkDestroyRenderPass(device, wd->RenderPass, allocator); + d.vkDestroyRenderPass(device, wd->RenderPass, allocator); // If min image count was not specified, request different count of images dependent on selected present mode if (min_image_count == 0) @@ -941,7 +945,7 @@ void ImGui_ImplLavaH_CreateWindowDataSwapChainAndFramebuffer(VkPhysicalDevice ph info.clipped = VK_TRUE; info.oldSwapchain = old_swapchain; VkSurfaceCapabilitiesKHR cap; - err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device, wd->Surface, &cap); + err = d.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device, wd->Surface, &cap); check_vk_result(err); if (info.minImageCount < cap.minImageCount) info.minImageCount = cap.minImageCount; @@ -958,15 +962,15 @@ void ImGui_ImplLavaH_CreateWindowDataSwapChainAndFramebuffer(VkPhysicalDevice ph info.imageExtent.width = wd->Width = cap.currentExtent.width; info.imageExtent.height = wd->Height = cap.currentExtent.height; } - err = vkCreateSwapchainKHR(device, &info, allocator, &wd->Swapchain); + err = d.vkCreateSwapchainKHR(device, &info, allocator, &wd->Swapchain); check_vk_result(err); - err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->BackBufferCount, NULL); + err = d.vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->BackBufferCount, NULL); check_vk_result(err); - err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->BackBufferCount, wd->BackBuffer); + err = d.vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->BackBufferCount, wd->BackBuffer); check_vk_result(err); } if (old_swapchain) - vkDestroySwapchainKHR(device, old_swapchain, allocator); + d.vkDestroySwapchainKHR(device, old_swapchain, allocator); // Create the Render Pass { @@ -1001,7 +1005,7 @@ void ImGui_ImplLavaH_CreateWindowDataSwapChainAndFramebuffer(VkPhysicalDevice ph info.pSubpasses = &subpass; info.dependencyCount = 1; info.pDependencies = &dependency; - err = vkCreateRenderPass(device, &info, allocator, &wd->RenderPass); + err = d.vkCreateRenderPass(device, &info, allocator, &wd->RenderPass); check_vk_result(err); } @@ -1020,7 +1024,7 @@ void ImGui_ImplLavaH_CreateWindowDataSwapChainAndFramebuffer(VkPhysicalDevice ph for (uint32_t i = 0; i < wd->BackBufferCount; i++) { info.image = wd->BackBuffer[i]; - err = vkCreateImageView(device, &info, allocator, &wd->BackBufferView[i]); + err = d.vkCreateImageView(device, &info, allocator, &wd->BackBufferView[i]); check_vk_result(err); } } @@ -1039,7 +1043,7 @@ void ImGui_ImplLavaH_CreateWindowDataSwapChainAndFramebuffer(VkPhysicalDevice ph for (uint32_t i = 0; i < wd->BackBufferCount; i++) { attachment[0] = wd->BackBufferView[i]; - err = vkCreateFramebuffer(device, &info, allocator, &wd->Framebuffer[i]); + err = d.vkCreateFramebuffer(device, &info, allocator, &wd->Framebuffer[i]); check_vk_result(err); } } @@ -1047,25 +1051,25 @@ void ImGui_ImplLavaH_CreateWindowDataSwapChainAndFramebuffer(VkPhysicalDevice ph void ImGui_ImplLavaH_DestroyWindowData(VkInstance instance, VkDevice device, ImGui_ImplLavaH_WindowData* wd, const VkAllocationCallbacks* allocator) { - vkDeviceWaitIdle(device); // FIXME: We could wait on the Queue if we had the queue in wd-> (otherwise VulkanH functions can't use globals) + d.vkDeviceWaitIdle(device); // FIXME: We could wait on the Queue if we had the queue in wd-> (otherwise VulkanH functions can't use globals) //vkQueueWaitIdle(g_Queue); for (int i = 0; i < IMGUI_VK_QUEUED_FRAMES; i++) { ImGui_ImplLavaH_FrameData* fd = &wd->Frames[i]; - vkDestroyFence(device, fd->Fence, allocator); - vkFreeCommandBuffers(device, fd->CommandPool, 1, &fd->CommandBuffer); - vkDestroyCommandPool(device, fd->CommandPool, allocator); - vkDestroySemaphore(device, fd->ImageAcquiredSemaphore, allocator); - vkDestroySemaphore(device, fd->RenderCompleteSemaphore, allocator); + d.vkDestroyFence(device, fd->Fence, allocator); + d.vkFreeCommandBuffers(device, fd->CommandPool, 1, &fd->CommandBuffer); + d.vkDestroyCommandPool(device, fd->CommandPool, allocator); + d.vkDestroySemaphore(device, fd->ImageAcquiredSemaphore, allocator); + d.vkDestroySemaphore(device, fd->RenderCompleteSemaphore, allocator); } for (uint32_t i = 0; i < wd->BackBufferCount; i++) { - vkDestroyImageView(device, wd->BackBufferView[i], allocator); - vkDestroyFramebuffer(device, wd->Framebuffer[i], allocator); + d.vkDestroyImageView(device, wd->BackBufferView[i], allocator); + d.vkDestroyFramebuffer(device, wd->Framebuffer[i], allocator); } - vkDestroyRenderPass(device, wd->RenderPass, allocator); - vkDestroySwapchainKHR(device, wd->Swapchain, allocator); - vkDestroySurfaceKHR(instance, wd->Surface, allocator); + d.vkDestroyRenderPass(device, wd->RenderPass, allocator); + d.vkDestroySwapchainKHR(device, wd->Swapchain, allocator); + d.vkDestroySurfaceKHR(instance, wd->Surface, allocator); *wd = ImGui_ImplLavaH_WindowData(); }