Converted existing vulkan program without vkbootstrap to use SDL callbacks
This commit is contained in:
parent
969a3285e9
commit
6d48ac251c
@ -4,7 +4,7 @@ project(vksdlproj VERSION 0.2.0 LANGUAGES C CXX)
|
||||
SET(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)
|
||||
set(EXE_NAME project)
|
||||
|
||||
set(PROGRAM_SOURCES )#${CMAKE_CURRENT_SOURCE_DIR}/src/vulkanapp.cc)
|
||||
set(PROGRAM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/vulkanapp.cc)
|
||||
|
||||
option(SDL3_NONSYSTEM "Use SDL3 from folder in source tree" ON)
|
||||
|
||||
|
||||
@ -53,6 +53,9 @@ public:
|
||||
void init();
|
||||
void loop();
|
||||
void cleanup();
|
||||
inline bool minimized() { return mMinimized; }
|
||||
inline void minimized(bool v) { mMinimized = v; }
|
||||
inline void resized(bool v) { mResized = v; }
|
||||
private:
|
||||
// SDL2
|
||||
SDL_Window *mWin;
|
||||
@ -61,7 +64,7 @@ private:
|
||||
// Not tied to library
|
||||
uint32_t mWidth;
|
||||
uint32_t mHeight;
|
||||
bool mActive = false;
|
||||
// bool mActive = false;
|
||||
bool mResized = false;
|
||||
bool mMinimized = false;
|
||||
|
||||
|
||||
57
src/main.cc
57
src/main.cc
@ -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;
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user