refactor webgpu initialization into init_webgpu()
This commit is contained in:
parent
0d3bfaf12d
commit
5a1ea421f6
185
src/main.cpp
185
src/main.cpp
@ -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", ¤t_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", ¤t_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,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user