120 lines
4.5 KiB
C
120 lines
4.5 KiB
C
#include "command.h"
|
|
#include "render.h"
|
|
#include "arpa/inet.h"
|
|
#include "ui.h"
|
|
#include "vk_mem_alloc.h"
|
|
#include "vulkan/vk_enum_string_helper.h"
|
|
#include "vulkan/vulkan_core.h"
|
|
|
|
#include "ft2build.h"
|
|
#include FT_FREETYPE_H
|
|
|
|
VkResult render_thread(GLFWwindow* window, RenderContext* render) {
|
|
FT_Library library;
|
|
|
|
UIContextStorage ui;
|
|
UIContainerStorage container;
|
|
UILayerStorage layers[2];
|
|
|
|
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(
|
|
render->device,
|
|
render->allocator,
|
|
render->render_pass,
|
|
10,
|
|
10,
|
|
render->swapchain_extent,
|
|
render->window_scale,
|
|
render->transfer_pool,
|
|
render->transfer_queue,
|
|
&ui));
|
|
|
|
if(FT_Init_FreeType(&library) != FT_Err_Ok) {
|
|
return VK_ERROR_UNKNOWN;
|
|
}
|
|
|
|
VK_RESULT(load_font(render->device, render->allocator, &ui, render->transfer_pool, render->transfer_queue, library, "test.ttf", 16, VK_TRUE, &font_index, &font));
|
|
|
|
VK_RESULT(load_texture(render->device, render->allocator, &ui, render->transfer_pool, render->transfer_queue, "test.png", &texture_index, &texture));
|
|
|
|
VK_RESULT(create_container(0, 0, 200, 200, render->device, render->allocator, render->transfer_pool, render->transfer_queue, &container));
|
|
|
|
VK_RESULT(create_layer(10, 100, 10, font_index, render->device, render->allocator, render->transfer_pool, render->transfer_queue, &container, &layers[0]));
|
|
VK_RESULT(create_layer(10, 100, 10, font_index, render->device, render->allocator, render->transfer_pool, render->transfer_queue, &container, &layers[1]));
|
|
|
|
VK_RESULT(create_transfer_buffer(render->allocator, 2*sizeof(uint32_t) + 2*sizeof(UIDrawable) + sizeof(UIString) + 100*sizeof(uint32_t), &transfer, &transfer_memory, &mapped));
|
|
|
|
uint32_t* mapped_count = (uint32_t*)(mapped);
|
|
mapped_count[0] = 1;
|
|
mapped_count[1] = 1;
|
|
UIDrawable* mapped_drawable = (UIDrawable*)(mapped + 2*sizeof(uint32_t));
|
|
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]);
|
|
|
|
UIString* mapped_string = (UIString*)(mapped + 2*sizeof(uint32_t) + 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(uint32_t) + 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, layers[0].layer, 0, offsetof(UILayer, num_drawables), sizeof(uint32_t));
|
|
command_copy_buffer(command_buffer, transfer, layers[1].layer, 0, offsetof(UILayer, num_drawables), sizeof(uint32_t));
|
|
command_copy_buffer(command_buffer, transfer, layers[1].layer, sizeof(uint32_t), offsetof(UILayer, dispatch_strings) + offsetof(DispatchCommand, x), sizeof(uint32_t));
|
|
|
|
command_copy_buffer(command_buffer, transfer, layers[0].drawables, 2*sizeof(uint32_t), 0, sizeof(UIDrawable));
|
|
command_copy_buffer(command_buffer, transfer, layers[1].drawables, 2*sizeof(uint32_t) + sizeof(UIDrawable), 0, sizeof(UIDrawable));
|
|
|
|
command_copy_buffer(command_buffer, transfer, layers[1].strings, 2*sizeof(uint32_t) + 2*sizeof(UIDrawable), 0, sizeof(UIString));
|
|
command_copy_buffer(command_buffer, transfer, layers[1].codes, 2*sizeof(uint32_t) + 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);
|
|
|
|
while(glfwWindowShouldClose(window) == 0) {
|
|
glfwPollEvents();
|
|
|
|
result = draw_frame(render, &ui, layers, sizeof(layers)/sizeof(UILayerStorage));
|
|
if(result != VK_SUCCESS) {
|
|
fprintf(stderr, "draw_frame error: %s\n", string_VkResult(result));
|
|
return result;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int logic_thread() {
|
|
return 0;
|
|
}
|
|
|
|
int network_thread() {
|
|
return 0;
|
|
}
|
|
|
|
int main() {
|
|
GLFWwindow* window = init_window();
|
|
if(window == NULL) {
|
|
return 1;
|
|
}
|
|
|
|
RenderContext render = {};
|
|
if(init_vulkan(window, &render) != VK_SUCCESS) {
|
|
return 2;
|
|
}
|
|
|
|
if(render_thread(window, &render) != VK_SUCCESS) {
|
|
return 3;
|
|
}
|
|
|
|
return 0;
|
|
}
|