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);
RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface);
RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldRenderTarget = nullptr);
void destroyRenderTarget(RenderTarget* target);
VkInstance getInstance() const {

View file

@ -1,5 +1,6 @@
#include <SDL.h>
#include <SDL_vulkan.h>
#include <iostream>
#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);

View file

@ -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;
@ -133,8 +135,14 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) {
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;
uint32_t swapchainImageCount = 0;
@ -226,7 +234,6 @@ void Renderer::destroyRenderTarget(RenderTarget* target) {
delete[] target->images;
vkDestroySwapchainKHR(device_, target->swapchain, nullptr);
vkDestroySurfaceKHR(instance_, target->surface, nullptr);
delete target;
}