Converted existing vulkan program without vkbootstrap to use SDL callbacks

This commit is contained in:
azraptor
2025-07-03 09:09:45 -04:00
parent 969a3285e9
commit 6d48ac251c
4 changed files with 52 additions and 43 deletions

View File

@@ -3,11 +3,15 @@
#include <SDL3/SDL_init.h>
#include <SDL3/SDL.h>
#include "vulkanapp.hh"
#include <exception>
constexpr uint32_t winInitWidth = 512;
constexpr uint32_t winInitHeight = 512;
struct AppContext {
SDL_Window *window;
VulkanApp vkapp;
SDL_AppResult appQuit = SDL_APP_CONTINUE;
};
@@ -17,18 +21,21 @@ SDL_AppResult SDL_Fail() {
}
SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) {
(void)argc;
(void)argv;
if(!SDL_Init(SDL_INIT_VIDEO))
return SDL_Fail();
SDL_Window *win = SDL_CreateWindow("SDL3 Vulkan", winInitWidth, winInitHeight, SDL_WINDOW_RESIZABLE | SDL_WINDOW_VULKAN);
if(!win)
return SDL_Fail();
*appstate = new AppContext {
.window = win,
};
try {
*appstate = new AppContext { .vkapp = VulkanApp(1024, 1024)};
AppContext* app = static_cast<AppContext*>(*appstate);
app->vkapp.init();
} catch(const std::exception& except) {
fprintf(stderr, "Error! %s\n", except.what());
return SDL_APP_FAILURE;
}
return SDL_APP_CONTINUE;
}
@@ -36,8 +43,20 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) {
AppContext* app = static_cast<AppContext*>(appstate);
switch(event->type) {
case SDL_EVENT_QUIT:
app->appQuit = SDL_APP_SUCCESS;
case SDL_EVENT_QUIT:
app->appQuit = SDL_APP_SUCCESS;
break;
case SDL_EVENT_WINDOW_RESIZED:
app->vkapp.resized(true);
break;
case SDL_EVENT_WINDOW_MINIMIZED:
app->vkapp.minimized(true);
break;
case SDL_EVENT_WINDOW_RESTORED:
app->vkapp.minimized(false);
break;
default:
break;
}
return SDL_APP_CONTINUE;
@@ -46,14 +65,28 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) {
SDL_AppResult SDL_AppIterate(void *appstate) {
AppContext* app = static_cast<AppContext*>(appstate);
try {
app->vkapp.loop();
} catch(const std::exception& except) {
fprintf(stderr, "Error! %s\n", except.what());
return SDL_APP_FAILURE;
}
return app->appQuit;
}
void SDL_AppQuit(void *appstate, SDL_AppResult result) {
AppContext* app = static_cast<AppContext*>(appstate);
if(result == SDL_APP_FAILURE) {
fputs("Program failure, shutting down\n", stderr);
} else {
puts("Program shutting down, no errors.");
}
if(app) {
SDL_DestroyWindow(app->window);
app->vkapp.cleanup();
delete app;
}

View File

@@ -862,31 +862,7 @@ void VulkanApp::loop() {
throw std::runtime_error(err);
}
mActive = true;
// Main loop
while(mActive) {
while(SDL_PollEvent(&mEvent)) {
switch (mEvent.type) {
case SDL_EVENT_QUIT:
mActive = false;
break;
case SDL_EVENT_WINDOW_RESIZED:
mResized = true;
break;
case SDL_EVENT_WINDOW_MINIMIZED:
mMinimized = true;
break;
case SDL_EVENT_WINDOW_RESTORED:
mMinimized = false;
break;
default:
break;
}
}
if(!mMinimized) drawFrame();
}
if(!mMinimized) drawFrame();
vkDeviceWaitIdle(mLogicalDevice);
}
@@ -921,7 +897,4 @@ void VulkanApp::cleanup() {
SDL_DestroyWindow(mWin);
mWin = nullptr;
}
//SDL_Vulkan_UnloadLibrary();
SDL_Quit();
}
}