Changeset 1cb64e6 in opengl-game for vulkan-game.cpp
- Timestamp:
- Feb 14, 2021, 4:04:56 AM (4 years ago)
- Branches:
- feature/imgui-sdl
- Children:
- ea2b4dc
- Parents:
- 737c26a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vulkan-game.cpp
r737c26a r1cb64e6 56 56 // Also, decide whether to use this-> for all instance variables, or only when necessary 57 57 58 this->debugMessenger = VK_NULL_HANDLE;59 60 this->gui = nullptr;61 this->window = nullptr;62 63 this->swapChainPresentMode = VK_PRESENT_MODE_MAX_ENUM_KHR;64 this->swapChainMinImageCount = 0;65 66 this->currentFrame = 0;58 debugMessenger = VK_NULL_HANDLE; 59 60 gui = nullptr; 61 window = nullptr; 62 63 swapChainPresentMode = VK_PRESENT_MODE_MAX_ENUM_KHR; 64 swapChainMinImageCount = 0; 65 66 currentFrame = 0; 67 67 shouldRecreateSwapChain = false; 68 68 69 this->object_VP_mats = {};70 this->ship_VP_mats = {};71 this->asteroid_VP_mats = {};72 this->laser_VP_mats = {};73 this->explosion_UBO = {};69 object_VP_mats = {}; 70 ship_VP_mats = {}; 71 asteroid_VP_mats = {}; 72 laser_VP_mats = {}; 73 explosion_UBO = {}; 74 74 } 75 75 … … 108 108 currentScreen->init(); 109 109 110 // TODO: Maybe just set shouldRecreateSwapChain to true instead. Check this render loop logic 111 // to make sure there'd be no issues 110 112 recreateSwapChain(); 111 113 } … … 218 220 createImageViews(); 219 221 createRenderPass(); 222 220 223 createResourceCommandPool(); 221 224 createCommandPools(); … … 1141 1144 1142 1145 void VulkanGame::cleanup() { 1143 if (vkDeviceWaitIdle(device) != VK_SUCCESS) { 1144 throw runtime_error("failed to wait for device!"); 1145 } 1146 VKUTIL_CHECK_RESULT(vkDeviceWaitIdle(device), "failed to wait for device!"); 1146 1147 1147 1148 ImGui_ImplVulkan_Shutdown(); … … 1281 1282 cerr << "validation layer: " << pCallbackData->pMessage << endl; 1282 1283 1284 // TODO: Figure out what the return value means and if it should always be VK_FALSE 1283 1285 return VK_FALSE; 1284 1286 } … … 1683 1685 } 1684 1686 } 1685 1686 for (size_t i = 0; i < commandBuffers.size(); i++) {1687 VkCommandBufferBeginInfo beginInfo = {};1688 beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;1689 beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;1690 beginInfo.pInheritanceInfo = nullptr;1691 1692 if (vkBeginCommandBuffer(commandBuffers[i], &beginInfo) != VK_SUCCESS) {1693 throw runtime_error("failed to begin recording command buffer!");1694 }1695 1696 VkRenderPassBeginInfo renderPassInfo = {};1697 renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;1698 renderPassInfo.renderPass = renderPass;1699 renderPassInfo.framebuffer = swapChainFramebuffers[i];1700 renderPassInfo.renderArea.offset = { 0, 0 };1701 renderPassInfo.renderArea.extent = swapChainExtent;1702 1703 array<VkClearValue, 2> clearValues = {};1704 clearValues[0].color = {{ 0.0f, 0.0f, 0.0f, 1.0f }};1705 clearValues[1].depthStencil = { 1.0f, 0 };1706 1707 renderPassInfo.clearValueCount = static_cast<uint32_t>(clearValues.size());1708 renderPassInfo.pClearValues = clearValues.data();1709 1710 vkCmdBeginRenderPass(commandBuffers[i], &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);1711 1712 currentScreen->createRenderCommands(commandBuffers[i], i);1713 1714 /**********************************************************/1715 1716 ImGui_ImplVulkan_NewFrame();1717 ImGui_ImplSDL2_NewFrame(this->window);1718 ImGui::NewFrame();1719 1720 {1721 ImGui::SetNextWindowSize(ImVec2(250, 35), ImGuiCond_Once);1722 ImGui::SetNextWindowPos(ImVec2(380, 10), ImGuiCond_Once);1723 ImGui::Begin("WndMenubar", NULL,1724 ImGuiWindowFlags_NoTitleBar |1725 ImGuiWindowFlags_NoResize |1726 ImGuiWindowFlags_NoMove);1727 ImGui::InvisibleButton("", ImVec2(155, 18));1728 ImGui::SameLine();1729 if (ImGui::Button("Main Menu")) {1730 cout << "Clicked on the main button" << endl;1731 //events.push(Event::GO_TO_MAIN_MENU);1732 }1733 ImGui::End();1734 }1735 1736 ImGui::Render();1737 ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), commandBuffers[i]);1738 1739 /**********************************************************/1740 1741 vkCmdEndRenderPass(commandBuffers[i]);1742 1743 if (vkEndCommandBuffer(commandBuffers[i]) != VK_SUCCESS) {1744 throw runtime_error("failed to record command buffer!");1745 }1746 }1747 1687 } 1748 1688 … … 1766 1706 1767 1707 updateScene(); 1708 1709 VKUTIL_CHECK_RESULT(vkResetCommandPool(device, commandPools[imageIndex], 0), 1710 "failed to reset command pool!"); 1711 1712 VkCommandBufferBeginInfo beginInfo = {}; 1713 beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; 1714 beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT; 1715 beginInfo.pInheritanceInfo = nullptr; 1716 1717 if (vkBeginCommandBuffer(commandBuffers[imageIndex], &beginInfo) != VK_SUCCESS) { 1718 throw runtime_error("failed to begin recording command buffer!"); 1719 } 1720 1721 VkRenderPassBeginInfo renderPassInfo = {}; 1722 renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; 1723 renderPassInfo.renderPass = renderPass; 1724 renderPassInfo.framebuffer = swapChainFramebuffers[imageIndex]; 1725 renderPassInfo.renderArea.offset = { 0, 0 }; 1726 renderPassInfo.renderArea.extent = swapChainExtent; 1727 1728 array<VkClearValue, 2> clearValues = {}; 1729 clearValues[0].color = { { 0.0f, 0.0f, 0.0f, 1.0f } }; 1730 clearValues[1].depthStencil = { 1.0f, 0 }; 1731 1732 renderPassInfo.clearValueCount = static_cast<uint32_t>(clearValues.size()); 1733 renderPassInfo.pClearValues = clearValues.data(); 1734 1735 vkCmdBeginRenderPass(commandBuffers[imageIndex], &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); 1736 1737 currentScreen->createRenderCommands(commandBuffers[imageIndex], imageIndex); 1738 1739 /**********************************************************/ 1740 1741 ImGui_ImplVulkan_NewFrame(); 1742 ImGui_ImplSDL2_NewFrame(this->window); 1743 ImGui::NewFrame(); 1744 1745 { 1746 ImGui::SetNextWindowSize(ImVec2(250, 35), ImGuiCond_Once); 1747 ImGui::SetNextWindowPos(ImVec2(380, 10), ImGuiCond_Once); 1748 ImGui::Begin("WndMenubar", NULL, 1749 ImGuiWindowFlags_NoTitleBar | 1750 ImGuiWindowFlags_NoResize | 1751 ImGuiWindowFlags_NoMove); 1752 ImGui::InvisibleButton("", ImVec2(155, 18)); 1753 ImGui::SameLine(); 1754 if (ImGui::Button("Main Menu")) { 1755 cout << "Clicked on the main button" << endl; 1756 //events.push(Event::GO_TO_MAIN_MENU); 1757 } 1758 ImGui::End(); 1759 } 1760 1761 ImGui::Render(); 1762 ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), commandBuffers[imageIndex]); 1763 1764 /**********************************************************/ 1765 1766 vkCmdEndRenderPass(commandBuffers[imageIndex]); 1767 1768 if (vkEndCommandBuffer(commandBuffers[imageIndex]) != VK_SUCCESS) { 1769 throw runtime_error("failed to record command buffer!"); 1770 } 1768 1771 1769 1772 VkSemaphore waitSemaphores[] = { imageAcquiredSemaphores[currentFrame] }; … … 1781 1784 submitInfo.pSignalSemaphores = signalSemaphores; 1782 1785 1783 if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[imageIndex]) != VK_SUCCESS) { 1784 throw runtime_error("failed to submit draw command buffer!"); 1785 } 1786 VKUTIL_CHECK_RESULT(vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[imageIndex]), 1787 "failed to submit draw command buffer!"); 1786 1788 } 1787 1789 … … 1800 1802 VkResult result = vkQueuePresentKHR(presentQueue, &presentInfo); 1801 1803 1802 if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR || shouldRecreateSwapChain) { 1803 shouldRecreateSwapChain = false; 1804 recreateSwapChain(); 1805 } else if (result != VK_SUCCESS) { 1806 throw runtime_error("failed to present swap chain image!"); 1804 if (result == VK_SUBOPTIMAL_KHR) { 1805 shouldRecreateSwapChain = true; 1806 } else if (result == VK_ERROR_OUT_OF_DATE_KHR) { 1807 shouldRecreateSwapChain = true; 1808 return; 1809 } else { 1810 VKUTIL_CHECK_RESULT(result, "failed to present swap chain image!"); 1807 1811 } 1808 1812 … … 2125 2129 } 2126 2130 2127 // TODO: Fix the crash that happens when alt-tabbing2128 2131 void VulkanGame::recreateSwapChain() { 2129 cout << "Recreating swap chain" << endl;2130 gui->refreshWindowSize();2131 2132 while (gui->getWindowWidth() == 0 || gui->getWindowHeight() == 0 ||2133 (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED) != 0) {2134 SDL_WaitEvent(nullptr);2135 gui->refreshWindowSize();2136 }2137 2138 2132 if (vkDeviceWaitIdle(device) != VK_SUCCESS) { 2139 2133 throw runtime_error("failed to wait for device!");
Note:
See TracChangeset
for help on using the changeset viewer.