Handle swapchain resizing
This commit is contained in:
parent
457a32bc06
commit
8fe2718606
3 changed files with 19 additions and 4 deletions
|
@ -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 {
|
||||
|
|
10
src/main.cpp
10
src/main.cpp
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Reference in a new issue