From 6d60a3394f949c5f64c16ebde572af76678547fb Mon Sep 17 00:00:00 2001 From: Noah Metz Date: Mon, 21 Oct 2024 13:31:42 -0600 Subject: [PATCH] API cleanup --- client/include/ui.h | 53 ++++-------------- client/src/main.c | 65 +++++++++++----------- client/src/ui.c | 131 +++++++++++++------------------------------- 3 files changed, 81 insertions(+), 168 deletions(-) diff --git a/client/include/ui.h b/client/include/ui.h index 906f67e..6239d89 100644 --- a/client/include/ui.h +++ b/client/include/ui.h @@ -196,9 +196,14 @@ VkResult load_texture( TextureStorage* memory); typedef struct UILayerInputStruct { - uint32_t strings; - uint32_t codes; - uint32_t drawables; + uint32_t num_strings; + uint32_t num_codes; + uint32_t num_drawables; + + UIString* strings; + uint32_t* codes; + UIDrawable* drawables; + uint32_t font; } UILayerInput; @@ -215,49 +220,11 @@ VkResult create_container( VkResult create_layer( uint32_t index, - uint32_t strings, - uint32_t codes, - uint32_t drawables, - uint32_t font, + UILayerInput* input, RenderContext* gpu, UIContainerStorage* container); -void set_ui_rect( - float x, - float y, - float width, - float height, - float r, - float g, - float b, - float a, - UIDrawable* drawable); - -void set_ui_image( - float x, - float y, - float width, - float height, - float r, - float g, - float b, - float a, - uint32_t index, - UIDrawable* drawable); - -void set_ui_string( - float x, - float y, - float size, - float r, - float g, - float b, - float a, - uint32_t length, - uint32_t offset, - UIString* string); - -VkResult set_ui_codes( +VkResult map_string( const char * text, uint32_t* buffer, uint32_t offset, diff --git a/client/src/main.c b/client/src/main.c index 3110591..30bb996 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -18,13 +18,10 @@ VkResult render_thread(GLFWwindow* window, RenderContext* render) { FontStorage font; uint32_t font_index; + TextureStorage texture; uint32_t texture_index; - VkBuffer transfer; - VmaAllocation transfer_memory; - void* mapped; - VkResult result; VK_RESULT(create_ui_context( @@ -41,42 +38,48 @@ VkResult render_thread(GLFWwindow* window, RenderContext* render) { VK_RESULT(load_texture("test.png", render, &ui, &texture_index, &texture)); + UIDrawable image = { + .pos = {0.0, 0.0}, + .size = {100.0, 200.0}, + .color = {1.0, 1.0, 1.0, 1.0}, + .type = 2, + .code = 0, + }; + + UIDrawable rect = { + .pos = {100.0, 0.0}, + .size = {100.0, 200.0}, + .color = {1.0, 0.0, 0.0, 1.0}, + .type = 0, + }; + + UIString string = { + .pos = {0.0, 100.0}, + .color = {1.0, 1.0, 1.0, 1.0}, + .size = 32.0, + .length = strlen("Hello, World!"), + .offset = 0, + }; + UILayerInput layers[] = { { - .strings = 0, - .codes = 0, - .drawables = 1, + .num_drawables = 1, + .drawables = &image, }, { - .strings = 1, - .codes = 100, - .drawables = 1, + .num_strings = 1, + .strings = &string, + .num_codes = strlen("Hello, World!"), + .codes = malloc(strlen("Hello, World!")*sizeof(uint32_t)), + .num_drawables = 1, + .drawables = &rect, .font = font_index, }, }; - VK_RESULT(create_container(0xDEADBEEF, 0.0, 0.0, 200.0, 200.0, sizeof(layers)/sizeof(UILayerInput), layers, render, &container)); - - VK_RESULT(create_transfer_buffer(render->allocator, 2*sizeof(UIDrawable) + sizeof(UIString) + 100*sizeof(uint32_t), &transfer, &transfer_memory, &mapped)); - - UIDrawable* mapped_drawable = (UIDrawable*)(mapped + 0); - set_ui_image(0.0, 0.0, 100.0, 200.0, 1.0, 1.0, 1.0, 1.0, texture_index, &mapped_drawable[0]); - set_ui_rect(100.0, 0.0, 100.0, 200.0, 0.0, 1.0, 0.0, 1.0, &mapped_drawable[1]); + map_string("Hello, World!", layers[1].codes, 0, font.charmap, font.num_symbols); - UIString* mapped_string = (UIString*)(mapped + 2*sizeof(UIDrawable)); - set_ui_string(0.0, 100.0, 32.0, 1.0, 1.0, 1.0, 1.0, 13, 0, &mapped_string[0]); - uint32_t* mapped_codes = (uint32_t*)(mapped + 2*sizeof(UIDrawable) + sizeof(UIString)); - VK_RESULT(set_ui_codes("Hello, World!", mapped_codes, 0, font.charmap, font.num_symbols)); - - VkCommandBuffer command_buffer = command_begin_single(render->device, render->transfer_pool); - command_copy_buffer(command_buffer, transfer, container.layers[0].drawables, 0, 0, sizeof(UIDrawable)); - command_copy_buffer(command_buffer, transfer, container.layers[1].drawables, sizeof(UIDrawable), 0, sizeof(UIDrawable)); - - command_copy_buffer(command_buffer, transfer, container.layers[1].strings, 2*sizeof(UIDrawable), 0, sizeof(UIString)); - command_copy_buffer(command_buffer, transfer, container.layers[1].codes, 2*sizeof(UIDrawable) + sizeof(UIString), 0, 100*sizeof(uint32_t)); - VK_RESULT(command_end_single(render->device, command_buffer, render->transfer_pool, render->transfer_queue)); - vkQueueWaitIdle(render->transfer_queue.handle); - destroy_transfer_buffer(render->allocator, transfer, transfer_memory); + VK_RESULT(create_container(0xDEADBEEF, 0.0, 0.0, 200.0, 200.0, sizeof(layers)/sizeof(UILayerInput), layers, render, &container)); while(glfwWindowShouldClose(window) == 0) { glfwPollEvents(); diff --git a/client/src/ui.c b/client/src/ui.c index a5ad9ae..114a7d8 100644 --- a/client/src/ui.c +++ b/client/src/ui.c @@ -309,7 +309,7 @@ VkResult create_container( memory->layer_count = layer_count; memory->layers = malloc(sizeof(UILayerStorage)*layer_count); for(uint32_t i = 0; i < layer_count; i++) { - VK_RESULT(create_layer(i, layers[i].strings, layers[i].codes, layers[i].drawables, layers[i].font, gpu, memory)); + VK_RESULT(create_layer(i, &layers[i], gpu, memory)); } return VK_SUCCESS; @@ -317,43 +317,40 @@ VkResult create_container( VkResult create_layer( uint32_t index, - uint32_t strings, - uint32_t codes, - uint32_t drawables, - uint32_t font, + UILayerInput* input, RenderContext* gpu, UIContainerStorage* container) { VkResult result; VK_RESULT(create_storage_buffer(gpu->allocator, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, sizeof(UILayer), &container->layers[index].layer, &container->layers[index].layer_memory)); - if(strings > 0) { - VK_RESULT(create_storage_buffer(gpu->allocator, 0, sizeof(UIString)*strings, &container->layers[index].strings, &container->layers[index].strings_memory)) + if(input->num_strings > 0) { + VK_RESULT(create_storage_buffer(gpu->allocator, 0, sizeof(UIString)*input->num_strings, &container->layers[index].strings, &container->layers[index].strings_memory)) } - if(codes + drawables > 0) { - VK_RESULT(create_storage_buffer(gpu->allocator, 0, sizeof(UIDrawable)*(drawables + codes), &container->layers[index].drawables, &container->layers[index].drawables_memory)); + if(input->num_codes + input->num_drawables > 0) { + VK_RESULT(create_storage_buffer(gpu->allocator, 0, sizeof(UIDrawable)*(input->num_drawables + input->num_codes), &container->layers[index].drawables, &container->layers[index].drawables_memory)); } - if(codes > 0) { - VK_RESULT(create_storage_buffer(gpu->allocator, 0, sizeof(uint32_t)*codes, &container->layers[index].codes, &container->layers[index].codes_memory)); + if(input->num_codes > 0) { + VK_RESULT(create_storage_buffer(gpu->allocator, 0, sizeof(uint32_t)*input->num_codes, &container->layers[index].codes, &container->layers[index].codes_memory)); } VkBuffer transfer; VmaAllocation transfer_memory; void* mapped; - VK_RESULT(create_transfer_buffer(gpu->allocator, sizeof(UILayer), &transfer, &transfer_memory, &mapped)); + VK_RESULT(create_transfer_buffer(gpu->allocator, sizeof(UILayer) + sizeof(UIString) * input->num_strings + sizeof(UIDrawable)*input->num_drawables + sizeof(uint32_t)*input->num_codes, &transfer, &transfer_memory, &mapped)); - if(strings > 0) { + if(input->num_strings > 0) { container->layers[index].data.strings = buffer_address(gpu->device, container->layers[index].strings); } else { container->layers[index].data.strings = 0x00000000; } - if(codes > 0) { + if(input->num_codes > 0) { container->layers[index].data.codes = buffer_address(gpu->device, container->layers[index].codes); } else { container->layers[index].data.codes = 0x00000000; } - if(codes + drawables > 0) { + if(input->num_codes + input->num_drawables > 0) { container->layers[index].data.drawables = buffer_address(gpu->device, container->layers[index].drawables); } else { container->layers[index].data.drawables = 0x00000000; @@ -365,29 +362,42 @@ VkResult create_layer( container->layers[index].data.draw.first_instance = 0; container->layers[index].data.draw.instance_count = 0; - container->layers[index].data.dispatch_strings.x = strings; + container->layers[index].data.dispatch_strings.x = input->num_strings; container->layers[index].data.dispatch_strings.y = 1; container->layers[index].data.dispatch_strings.z = 1; - container->layers[index].data.font_index = font; - container->layers[index].data.max_drawables = drawables + codes; - container->layers[index].data.max_strings = strings; - container->layers[index].data.num_drawables = drawables; + container->layers[index].data.font_index = input->font; + container->layers[index].data.max_drawables = input->num_drawables + input->num_codes; + container->layers[index].data.max_strings = input->num_strings; + container->layers[index].data.num_drawables = input->num_drawables; container->layers[index].data.container = container->address; memcpy(mapped, &container->layers[index].data, sizeof(UILayer)); VkCommandBuffer command_buffer = command_begin_single(gpu->device, gpu->transfer_pool); command_copy_buffer(command_buffer, transfer, container->layers[index].layer, 0, 0, sizeof(UILayer)); - if(strings > 0) { - vkCmdFillBuffer(command_buffer, container->layers[index].strings, 0, sizeof(UIString)*strings, 0x00000000); + if(input->num_strings > 0) { + UIString* strings = (UIString*)(mapped + sizeof(UILayer)); + for(uint32_t i = 0; i < input->num_strings; i++) { + memcpy(&strings[i], &input->strings[i], sizeof(UIString)); + } + command_copy_buffer(command_buffer, transfer, container->layers[index].strings, sizeof(UILayer), 0, sizeof(UIString)*input->num_strings); } - if(codes + drawables > 0) { - vkCmdFillBuffer(command_buffer, container->layers[index].drawables, 0, sizeof(UIDrawable)*(drawables+codes), 0x00000000); + if(input->num_drawables > 0) { + UIDrawable* drawables = (UIDrawable*)(mapped + sizeof(UILayer) + sizeof(UIString)*input->num_strings); + for(uint32_t i = 0; i < input->num_drawables; i++) { + memcpy(&drawables[i], &input->drawables[i], sizeof(UIDrawable)); + } + command_copy_buffer(command_buffer, transfer, container->layers[index].drawables, sizeof(UILayer) + sizeof(UIString)*input->num_strings, 0, sizeof(UIDrawable)*input->num_drawables); } - if(codes > 0) { - vkCmdFillBuffer(command_buffer, container->layers[index].codes, 0, sizeof(uint32_t)*codes, 0x00000000); + if(input->num_codes > 0) { + uint32_t* codes = (uint32_t*)(mapped + sizeof(UILayer) + sizeof(UIString)*input->num_strings + sizeof(UIDrawable)*input->num_drawables); + for(uint32_t i = 0; i < input->num_codes; i++) { + codes[i] = input->codes[i]; + } + vkCmdFillBuffer(command_buffer, container->layers[index].codes, sizeof(UIDrawable)*input->num_drawables, sizeof(UIDrawable)*input->num_codes, 0x00000000); + command_copy_buffer(command_buffer, transfer, container->layers[index].codes, sizeof(UILayer) + sizeof(UIString)*input->num_strings + sizeof(UIDrawable)*input->num_drawables, 0, sizeof(uint32_t)*input->num_codes); } VK_RESULT(command_end_single(gpu->device, command_buffer, gpu->transfer_pool, gpu->transfer_queue)); vkQueueWaitIdle(gpu->transfer_queue.handle); @@ -1082,74 +1092,7 @@ VkResult create_ui_context( return VK_SUCCESS; } -void set_ui_rect( - float x, - float y, - float width, - float height, - float r, - float g, - float b, - float a, - UIDrawable* drawable) { - drawable->pos[0] = x; - drawable->pos[1] = y; - drawable->size[0] = width; - drawable->size[1] = height; - drawable->color[0] = r; - drawable->color[1] = g; - drawable->color[2] = b; - drawable->color[3] = a; - drawable->type = 0; - drawable->code = 0; -} - -void set_ui_image( - float x, - float y, - float width, - float height, - float r, - float g, - float b, - float a, - uint32_t index, - UIDrawable* drawable) { - drawable->pos[0] = x; - drawable->pos[1] = y; - drawable->size[0] = width; - drawable->size[1] = height; - drawable->color[0] = r; - drawable->color[1] = g; - drawable->color[2] = b; - drawable->color[3] = a; - drawable->type = 2; - drawable->code = index; -} - -void set_ui_string( - float x, - float y, - float size, - float r, - float g, - float b, - float a, - uint32_t length, - uint32_t offset, - UIString* string) { - string->pos[0] = x; - string->pos[1] = y; - string->size = size; - string->color[0] = r; - string->color[1] = g; - string->color[2] = b; - string->color[3] = a; - string->length = length; - string->offset = offset; -} - -VkResult set_ui_codes( +VkResult map_string( const char * text, uint32_t* buffer, uint32_t offset,