diff --git a/include/renderer.h b/include/renderer.h index ada4145..299e5a5 100644 --- a/include/renderer.h +++ b/include/renderer.h @@ -27,7 +27,7 @@ public: void render(RenderTarget* target); - RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface); + RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldRenderTarget = nullptr); void destroyRenderTarget(RenderTarget* target); VkInstance getInstance() const { diff --git a/src/main.cpp b/src/main.cpp index 6113e46..afe52c7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "renderer.h" #include "platform.h" @@ -21,7 +22,7 @@ uint32_t platform::getTime() { } int main(int, char*[]) { - window = SDL_CreateWindow("Graph", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_VULKAN); + window = SDL_CreateWindow("Graph", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE); if(!window) return -1; @@ -38,6 +39,11 @@ int main(int, char*[]) { while(SDL_PollEvent(&event)) { if(event.type == SDL_QUIT) running = false; + + if(event.type == SDL_WINDOWEVENT) { + if(event.window.event == SDL_WINDOWEVENT_RESIZED) + target = renderer->createSurfaceRenderTarget(surface, target); + } } renderer->render(target); @@ -45,6 +51,8 @@ int main(int, char*[]) { renderer->destroyRenderTarget(target); + vkDestroySurfaceKHR(renderer->getInstance(), surface, nullptr); + delete renderer; SDL_DestroyWindow(window); diff --git a/src/renderer.cpp b/src/renderer.cpp index 16fba8d..88754c8 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -93,7 +93,9 @@ void Renderer::render(RenderTarget* target) { vkQueuePresentKHR(graphicsQueue_, &presentInfo); } -RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) { +RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldTarget) { + vkDeviceWaitIdle(device_); + RenderTarget* target = new RenderTarget(); target->surface = surface; @@ -132,8 +134,14 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) { swapchainCreateInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; swapchainCreateInfo.presentMode = VK_PRESENT_MODE_FIFO_KHR; swapchainCreateInfo.clipped = true; + + if(oldTarget) + swapchainCreateInfo.oldSwapchain = oldTarget->swapchain; vkCreateSwapchainKHR(device_, &swapchainCreateInfo, nullptr, &target->swapchain); + + if(oldTarget) + destroyRenderTarget(oldTarget); delete[] surfaceFormats; @@ -226,7 +234,6 @@ void Renderer::destroyRenderTarget(RenderTarget* target) { delete[] target->images; vkDestroySwapchainKHR(device_, target->swapchain, nullptr); - vkDestroySurfaceKHR(instance_, target->surface, nullptr); delete target; }