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);
|
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 {
|
||||||
|
|
10
src/main.cpp
10
src/main.cpp
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue