Archived
1
Fork 0

Handle swapchain resizing

This commit is contained in:
Joshua Goins 2018-10-01 21:02:27 -04:00
parent 457a32bc06
commit 8fe2718606
3 changed files with 19 additions and 4 deletions

View file

@ -27,7 +27,7 @@ public:
void render(RenderTarget* target); void render(RenderTarget* target);
RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface); RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldRenderTarget = nullptr);
void destroyRenderTarget(RenderTarget* target); void destroyRenderTarget(RenderTarget* target);
VkInstance getInstance() const { VkInstance getInstance() const {

View file

@ -1,5 +1,6 @@
#include <SDL.h> #include <SDL.h>
#include <SDL_vulkan.h> #include <SDL_vulkan.h>
#include <iostream>
#include "renderer.h" #include "renderer.h"
#include "platform.h" #include "platform.h"
@ -21,7 +22,7 @@ uint32_t platform::getTime() {
} }
int main(int, char*[]) { 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) if(!window)
return -1; return -1;
@ -38,6 +39,11 @@ int main(int, char*[]) {
while(SDL_PollEvent(&event)) { while(SDL_PollEvent(&event)) {
if(event.type == SDL_QUIT) if(event.type == SDL_QUIT)
running = false; running = false;
if(event.type == SDL_WINDOWEVENT) {
if(event.window.event == SDL_WINDOWEVENT_RESIZED)
target = renderer->createSurfaceRenderTarget(surface, target);
}
} }
renderer->render(target); renderer->render(target);
@ -45,6 +51,8 @@ int main(int, char*[]) {
renderer->destroyRenderTarget(target); renderer->destroyRenderTarget(target);
vkDestroySurfaceKHR(renderer->getInstance(), surface, nullptr);
delete renderer; delete renderer;
SDL_DestroyWindow(window); SDL_DestroyWindow(window);

View file

@ -93,7 +93,9 @@ void Renderer::render(RenderTarget* target) {
vkQueuePresentKHR(graphicsQueue_, &presentInfo); vkQueuePresentKHR(graphicsQueue_, &presentInfo);
} }
RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) { RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldTarget) {
vkDeviceWaitIdle(device_);
RenderTarget* target = new RenderTarget(); RenderTarget* target = new RenderTarget();
target->surface = surface; target->surface = surface;
@ -132,8 +134,14 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) {
swapchainCreateInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; swapchainCreateInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
swapchainCreateInfo.presentMode = VK_PRESENT_MODE_FIFO_KHR; swapchainCreateInfo.presentMode = VK_PRESENT_MODE_FIFO_KHR;
swapchainCreateInfo.clipped = true; swapchainCreateInfo.clipped = true;
if(oldTarget)
swapchainCreateInfo.oldSwapchain = oldTarget->swapchain;
vkCreateSwapchainKHR(device_, &swapchainCreateInfo, nullptr, &target->swapchain); vkCreateSwapchainKHR(device_, &swapchainCreateInfo, nullptr, &target->swapchain);
if(oldTarget)
destroyRenderTarget(oldTarget);
delete[] surfaceFormats; delete[] surfaceFormats;
@ -226,7 +234,6 @@ void Renderer::destroyRenderTarget(RenderTarget* target) {
delete[] target->images; delete[] target->images;
vkDestroySwapchainKHR(device_, target->swapchain, nullptr); vkDestroySwapchainKHR(device_, target->swapchain, nullptr);
vkDestroySurfaceKHR(instance_, target->surface, nullptr);
delete target; delete target;
} }