refactor webgpu initialization into init_webgpu()

This commit is contained in:
Sven Balzer 2025-10-04 13:57:16 +02:00
parent 0d3bfaf12d
commit 5a1ea421f6

View File

@ -38,12 +38,15 @@ static WGPUTexture framebuffer;
static WGPURenderPipeline basic_render_pipeline; static WGPURenderPipeline basic_render_pipeline;
static WGPURenderPipeline world_render_pipeline; static WGPURenderPipeline world_render_pipeline;
static WGPURenderPipeline grid_render_pipeline; static WGPURenderPipeline grid_render_pipeline;
static WGPUSampler pixel_sampler; static WGPUSampler pixel_sampler;
static WGPUBindGroup per_frame_bind_group; static WGPUBindGroup per_frame_bind_group;
static WGPUBindGroup world_bind_group; static WGPUBindGroup world_bind_group;
static WGPUBindGroup basic_bind_group; static WGPUBindGroup basic_bind_group;
static WGPUTexture player_texture;
static WGPUTextureView player_texture_view;
static WGPUTexture tile_textures_array; static WGPUTexture tile_textures_array;
static WGPUTextureView tile_textures_array_view; static WGPUTextureView tile_textures_array_view;
static WGPUTextureView *tile_textures_array_view_individual; static WGPUTextureView *tile_textures_array_view_individual;
@ -59,8 +62,11 @@ static WGPUBuffer grid_index_buffer;
static WGPUBuffer player_instance_buffer; static WGPUBuffer player_instance_buffer;
static WGPUBuffer tile_infos_buffer; static WGPUBuffer tile_infos_buffer;
static Sint32 window_width; static WGPUSurfaceConfiguration surface_configuration;
static Sint32 window_height;
static Sint32 window_width = 1280;
static Sint32 window_height = 720;
static Mix_Music *music_setting_off_piano; static Mix_Music *music_setting_off_piano;
@ -1366,55 +1372,17 @@ WGPUSurface create_wgpu_surface_for_SDL_window(SDL_Window *window) {
return NULL; return NULL;
} }
void setup_working_directory() { bool init_webgpu() {
if (SDL_GetPathInfo(ASSETS_PATH, NULL)) return;
const char *current_directory = SDL_GetCurrentDirectory();
change_directory(SDL_GetBasePath());
if (SDL_GetPathInfo(ASSETS_PATH, NULL)) return;
change_directory("..");
if (SDL_GetPathInfo(ASSETS_PATH, NULL)) return;
change_directory(current_directory);
}
int main(int argc, char **argv) {
setup_memory_functions();
setup_working_directory();
#ifdef SDL_PLATFORM_LINUX
if (getenv("ENABLE_VULKAN_RENDERDOC_CAPTURE"))
SDL_SetHint(SDL_HINT_VIDEO_DRIVER, "x11,wayland");
#endif
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_EVENTS | SDL_INIT_GAMEPAD)) {
log_error("Failed to initialize SDL (%s). Exiting.", SDL_GetError());
return 1;
}
if (!Mix_Init(MIX_INIT_OPUS)) {
log_error("Failed to init SDL_mixer. Exiting.");
return 1;
}
instance = wgpuCreateInstance(NULL); instance = wgpuCreateInstance(NULL);
if (!instance) { if (!instance) {
log_error("Failed to create webgpu instance. Exiting."); log_error("Failed to create webgpu instance.");
return 1; return false;
}
window = SDL_CreateWindow("Mikemon", 1280, 720, SDL_WINDOW_RESIZABLE);
if (!window) {
log_error("Failed to create window (%s). Exiting.", SDL_GetError());
return 1;
} }
surface = create_wgpu_surface_for_SDL_window(window); surface = create_wgpu_surface_for_SDL_window(window);
if (!surface) { if (!surface) {
log_error("Failed to create webgpu surface for SDL window. Exiting."); log_error("Failed to create webgpu surface for SDL window.");
return 1; return false;
} }
WGPURequestAdapterCallbackInfo request_adapter_callback_info = { WGPURequestAdapterCallbackInfo request_adapter_callback_info = {
@ -1437,11 +1405,11 @@ int main(int argc, char **argv) {
} }
if (!device) { if (!device) {
log_error("Failed to initialize webgpu. Exiting."); log_error("Failed to get webgpu device.");
return 1; return false;
} }
WGPUSurfaceConfiguration surface_configuration = { surface_configuration = {
.device = device, .device = device,
.format = WGPUTextureFormat_BGRA8UnormSrgb, .format = WGPUTextureFormat_BGRA8UnormSrgb,
.usage = WGPUTextureUsage_RenderAttachment, .usage = WGPUTextureUsage_RenderAttachment,
@ -1456,26 +1424,8 @@ int main(int argc, char **argv) {
wgpuSurfaceConfigure(surface, &surface_configuration); wgpuSurfaceConfigure(surface, &surface_configuration);
if (!recreate_graphics_pipelines()) { if (!recreate_graphics_pipelines()) {
log_error("Failed to create graphics pipelines. Exiting."); log_error("Failed to create graphics pipelines.");
return 1; return false;
}
if (!load_map("map.sv", &current_map)) {
log_error("Failed to load initial map. Exiting.");
return 1;
}
WGPUTexture player_texture = create_shader_texture("decorations/strawberry.png");
if (!player_texture) {
log_error("Failed to create shader texture. Exiting.");
return 1;
}
WGPUTextureView player_texture_view = wgpuTextureCreateView(player_texture, NULL);
if (!recreate_tile_textures()) {
log_error("Failed to create tile textures. Exiting.");
return 1;
} }
WGPUSamplerDescriptor pixel_sampler_descriptor = { WGPUSamplerDescriptor pixel_sampler_descriptor = {
@ -1496,50 +1446,63 @@ int main(int argc, char **argv) {
view_projection_matrix_buffer = create_buffer(WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst, sizeof(M4x4), NULL, "view_projection_matrix_buffer"); view_projection_matrix_buffer = create_buffer(WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst, sizeof(M4x4), NULL, "view_projection_matrix_buffer");
if (!view_projection_matrix_buffer) { if (!view_projection_matrix_buffer) {
log_error("Failed to create buffer. Exiting."); log_error("Failed to create buffer.");
return 1; return false;
} }
per_frame_buffer = create_buffer(WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst, sizeof(per_frame), NULL, "per_frame_buffer"); per_frame_buffer = create_buffer(WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst, sizeof(per_frame), NULL, "per_frame_buffer");
if (!per_frame_buffer) { if (!per_frame_buffer) {
log_error("Failed to create buffer. Exiting."); log_error("Failed to create buffer.");
return 1; return false;
} }
tint_color_buffer = create_buffer(WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst, sizeof(V3), NULL, "tint_color_buffer"); tint_color_buffer = create_buffer(WGPUBufferUsage_Uniform | WGPUBufferUsage_CopyDst, sizeof(V3), NULL, "tint_color_buffer");
if (!tint_color_buffer) { if (!tint_color_buffer) {
log_error("Failed to create buffer. Exiting."); log_error("Failed to create buffer.");
return 1; return false;
} }
vertex_buffer = create_buffer(WGPUBufferUsage_Vertex, sizeof(vertices), vertices, "vertex_buffer"); vertex_buffer = create_buffer(WGPUBufferUsage_Vertex, sizeof(vertices), vertices, "vertex_buffer");
if (!vertex_buffer) { if (!vertex_buffer) {
log_error("Failed to create buffer. Exiting."); log_error("Failed to create buffer.");
return 1; return false;
} }
index_buffer = create_buffer(WGPUBufferUsage_Index, sizeof(indices), indices, "index_buffer"); index_buffer = create_buffer(WGPUBufferUsage_Index, sizeof(indices), indices, "index_buffer");
if (!index_buffer) { if (!index_buffer) {
log_error("Failed to create buffer. Exiting."); log_error("Failed to create buffer.");
return 1; return false;
} }
grid_vertex_buffer = create_buffer(WGPUBufferUsage_Vertex, sizeof(grid_vertices), grid_vertices, "grid_vertex_buffer"); grid_vertex_buffer = create_buffer(WGPUBufferUsage_Vertex, sizeof(grid_vertices), grid_vertices, "grid_vertex_buffer");
if (!grid_vertex_buffer) { if (!grid_vertex_buffer) {
log_error("Failed to create buffer. Exiting."); log_error("Failed to create buffer.");
return 1; return false;
} }
grid_index_buffer = create_buffer(WGPUBufferUsage_Index, sizeof(grid_indices), grid_indices, "grid_index_buffer"); grid_index_buffer = create_buffer(WGPUBufferUsage_Index, sizeof(grid_indices), grid_indices, "grid_index_buffer");
if (!grid_index_buffer) { if (!grid_index_buffer) {
log_error("Failed to create buffer. Exiting."); log_error("Failed to create buffer.");
return 1; return false;
} }
player_instance_buffer = create_buffer(WGPUBufferUsage_Vertex | WGPUBufferUsage_CopyDst, sizeof(player_instance), &player_instance, "player_instance_buffer"); player_instance_buffer = create_buffer(WGPUBufferUsage_Vertex | WGPUBufferUsage_CopyDst, sizeof(player_instance), &player_instance, "player_instance_buffer");
if (!player_instance_buffer) { if (!player_instance_buffer) {
log_error("Failed to create buffer. Exiting."); log_error("Failed to create buffer.");
return 1; return false;
}
player_texture = create_shader_texture("decorations/strawberry.png");
if (!player_texture) {
log_error("Failed to create shader texture.");
return false;
}
player_texture_view = wgpuTextureCreateView(player_texture, NULL);
if (!recreate_tile_textures()) {
log_error("Failed to create tile textures.");
return false;
} }
WGPUBindGroupEntry per_frame_bind_group_entries[] = { WGPUBindGroupEntry per_frame_bind_group_entries[] = {
@ -1583,6 +1546,58 @@ int main(int argc, char **argv) {
}; };
basic_bind_group = wgpuDeviceCreateBindGroup(device, &basic_bind_group_descriptor); basic_bind_group = wgpuDeviceCreateBindGroup(device, &basic_bind_group_descriptor);
return true;
}
void setup_working_directory() {
if (SDL_GetPathInfo(ASSETS_PATH, NULL)) return;
const char *current_directory = SDL_GetCurrentDirectory();
change_directory(SDL_GetBasePath());
if (SDL_GetPathInfo(ASSETS_PATH, NULL)) return;
change_directory("..");
if (SDL_GetPathInfo(ASSETS_PATH, NULL)) return;
change_directory(current_directory);
}
int main(int argc, char **argv) {
setup_memory_functions();
setup_working_directory();
#ifdef SDL_PLATFORM_LINUX
if (getenv("ENABLE_VULKAN_RENDERDOC_CAPTURE"))
SDL_SetHint(SDL_HINT_VIDEO_DRIVER, "x11,wayland");
#endif
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_EVENTS | SDL_INIT_GAMEPAD)) {
log_error("Failed to initialize SDL (%s). Exiting.", SDL_GetError());
return 1;
}
if (!Mix_Init(MIX_INIT_OPUS)) {
log_error("Failed to init SDL_mixer. Exiting.");
return 1;
}
window = SDL_CreateWindow("Mikemon", window_width, window_height, SDL_WINDOW_RESIZABLE);
if (!window) {
log_error("Failed to create window (%s). Exiting.", SDL_GetError());
return 1;
}
if (!init_webgpu()) {
log_error("Failed to initialize webgpu. Exiting.");
return 1;
}
if (!load_map("map.sv", &current_map)) {
log_error("Failed to load initial map. Exiting.");
return 1;
}
SDL_AudioSpec audio_spec = { SDL_AudioSpec audio_spec = {
.format = SDL_AUDIO_F32, .format = SDL_AUDIO_F32,
.channels = 2, .channels = 2,