diff --git a/client/include/pipeline.h b/client/include/pipeline.h index ea4bbfc..0d00bf7 100644 --- a/client/include/pipeline.h +++ b/client/include/pipeline.h @@ -24,6 +24,14 @@ typedef struct UIUniformStruct { typedef struct UILayerStruct { VkBuffer colored_rects; uint32_t colored_rect_count; + + VkBuffer textured_rects; + uint32_t textured_rect_count; + VkDescriptorSet textured_rect_descriptor; + + VkBuffer texts; + uint32_t text_count; + VkDescriptorSet text_descriptor; } UILayer; struct RectBuffer { @@ -34,7 +42,7 @@ struct RectBuffer { VmaAllocation index_memory; }; -VkResult create_ui_rect_pipeline(VkDevice device, VkRenderPass render_pass, VkDescriptorSetLayout descriptor_layout, GraphicsPipeline* pipeline); +VkResult create_ui_colored_rect_pipeline(VkDevice device, VkRenderPass render_pass, VkDescriptorSetLayout descriptor_layout, GraphicsPipeline* pipeline); VkResult create_ui_descriptor_set(VkDevice device, VmaAllocator allocator, VkExtent2D swapchain_extent, VkDescriptorSetLayout* ui_descriptor_layout, VkDescriptorPool* ui_descriptor_pool, VkDescriptorSet* ui_descriptor_set, VmaAllocation* ui_descriptor_memory, VkBuffer* ui_descriptor_buffer); diff --git a/client/include/render.h b/client/include/render.h index 5c63a1e..23223f6 100644 --- a/client/include/render.h +++ b/client/include/render.h @@ -77,7 +77,6 @@ typedef struct RenderContextStruct { VkFence* in_flight_fences; - VkBuffer ui_descriptor_buffer; VmaAllocation ui_descriptor_memory; VkDescriptorSetLayout ui_descriptor_layout; diff --git a/client/shader_src/ui_polygon.frag b/client/shader_src/ui_colored_rect.frag similarity index 100% rename from client/shader_src/ui_polygon.frag rename to client/shader_src/ui_colored_rect.frag diff --git a/client/shader_src/ui_polygon.vert b/client/shader_src/ui_colored_rect.vert similarity index 100% rename from client/shader_src/ui_polygon.vert rename to client/shader_src/ui_colored_rect.vert diff --git a/client/src/pipeline.c b/client/src/pipeline.c index d512086..b54d34b 100644 --- a/client/src/pipeline.c +++ b/client/src/pipeline.c @@ -48,102 +48,22 @@ VkShaderModule load_shader_file(const char* path, VkDevice device) { return shader; } -VkResult create_ui_rect_pipeline(VkDevice device, VkRenderPass render_pass, VkDescriptorSetLayout descriptor_layout, GraphicsPipeline* pipeline) { - VkShaderModule vert_shader = load_shader_file("shader_src/ui_polygon.vert.spv", device); - VkShaderModule frag_shader = load_shader_file("shader_src/ui_polygon.frag.spv", device); - VkPipelineShaderStageCreateInfo shader_stages[] = { - { - .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, - .stage = VK_SHADER_STAGE_VERTEX_BIT, - .module = vert_shader, - .pName = "main", - }, - { - .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, - .stage = VK_SHADER_STAGE_FRAGMENT_BIT, - .module = frag_shader, - .pName = "main", - }, - }; - - VkVertexInputBindingDescription bindings[] = { - { - .binding = 0, - .stride = sizeof(vec2), - .inputRate = VK_VERTEX_INPUT_RATE_VERTEX, - }, - { - .binding = 1, - .stride = sizeof(ColoredRect), - .inputRate = VK_VERTEX_INPUT_RATE_INSTANCE, - }, - }; - - VkVertexInputAttributeDescription attributes[] = { - { - .binding = 0, - .location = 0, - .format = VK_FORMAT_R32G32_SFLOAT, - .offset = 0, - }, - { - .binding = 1, - .location = 1, - .format = VK_FORMAT_R32G32B32_SFLOAT, - .offset = offsetof(ColoredRect, pos), - }, - { - .binding = 1, - .location = 2, - .format = VK_FORMAT_R32G32_SFLOAT, - .offset = offsetof(ColoredRect, size), - }, - { - .binding = 1, - .location = 3, - .format = VK_FORMAT_R32G32B32A32_SFLOAT, - .offset = offsetof(ColoredRect, color), - }, - }; - - VkPipelineVertexInputStateCreateInfo input_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, - .pVertexBindingDescriptions = bindings, - .vertexBindingDescriptionCount = sizeof(bindings)/sizeof(VkVertexInputBindingDescription), - .pVertexAttributeDescriptions = attributes, - .vertexAttributeDescriptionCount = sizeof(attributes)/sizeof(VkVertexInputAttributeDescription), - }; - - VkPipelineLayoutCreateInfo layout_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, - .setLayoutCount = 1, - .pSetLayouts = &descriptor_layout, - }; +VkResult create_ui_pipeline( + VkDevice device, + VkRenderPass render_pass, + VkPipelineShaderStageCreateInfo* shader_stages, + uint32_t shader_stage_count, + VkPipelineVertexInputStateCreateInfo input_info, + VkPipelineLayoutCreateInfo layout_info, + VkPipelineInputAssemblyStateCreateInfo input_assembly_info, + GraphicsPipeline* pipeline) { + VkResult result; - VkResult result = vkCreatePipelineLayout(device, &layout_info, 0, &pipeline->layout); + result = vkCreatePipelineLayout(device, &layout_info, 0, &pipeline->layout); if(result != VK_SUCCESS) { return result; } - VkDynamicState dynamic_states[] = { - VK_DYNAMIC_STATE_VIEWPORT, - VK_DYNAMIC_STATE_SCISSOR, - }; - - uint32_t dynamic_state_count = sizeof(dynamic_states)/sizeof(VkDynamicState); - - VkPipelineDynamicStateCreateInfo dynamic_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, - .dynamicStateCount = dynamic_state_count, - .pDynamicStates = dynamic_states, - }; - - VkPipelineInputAssemblyStateCreateInfo input_assembly_info = { - .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, - .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, - .primitiveRestartEnable = VK_FALSE, - }; - VkViewport viewport = { .x = 0.0f, .y = 0.0f, @@ -232,9 +152,22 @@ VkResult create_ui_rect_pipeline(VkDevice device, VkRenderPass render_pass, VkDe .blendConstants[3] = 0.0f, }; + VkDynamicState dynamic_states[] = { + VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR, + }; + + uint32_t dynamic_state_count = sizeof(dynamic_states)/sizeof(VkDynamicState); + + VkPipelineDynamicStateCreateInfo dynamic_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, + .dynamicStateCount = dynamic_state_count, + .pDynamicStates = dynamic_states, + }; + VkGraphicsPipelineCreateInfo draw_pipeline_info = { .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, - .stageCount = sizeof(shader_stages)/sizeof(VkPipelineShaderStageCreateInfo), + .stageCount = shader_stage_count, .pStages = shader_stages, .pVertexInputState = &input_info, .pInputAssemblyState = &input_assembly_info, @@ -255,6 +188,141 @@ VkResult create_ui_rect_pipeline(VkDevice device, VkRenderPass render_pass, VkDe if(result != VK_SUCCESS) { return result; } + return VK_SUCCESS; +} + +VkResult create_ui_colored_rect_pipeline(VkDevice device, VkRenderPass render_pass, VkDescriptorSetLayout ui_descriptor_layout, GraphicsPipeline* pipeline) { + VkShaderModule vert_shader = load_shader_file("shader_src/ui_colored_rect.vert.spv", device); + VkShaderModule frag_shader = load_shader_file("shader_src/ui_colored_rect.frag.spv", device); + VkPipelineShaderStageCreateInfo shader_stages[] = { + { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_VERTEX_BIT, + .module = vert_shader, + .pName = "main", + }, + { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_FRAGMENT_BIT, + .module = frag_shader, + .pName = "main", + }, + }; + + VkVertexInputBindingDescription bindings[] = { + { + .binding = 0, + .stride = sizeof(vec2), + .inputRate = VK_VERTEX_INPUT_RATE_VERTEX, + }, + { + .binding = 1, + .stride = sizeof(ColoredRect), + .inputRate = VK_VERTEX_INPUT_RATE_INSTANCE, + }, + }; + + VkVertexInputAttributeDescription attributes[] = { + { + .binding = 0, + .location = 0, + .format = VK_FORMAT_R32G32_SFLOAT, + .offset = 0, + }, + { + .binding = 1, +.location = 1, + .format = VK_FORMAT_R32G32B32_SFLOAT, + .offset = offsetof(ColoredRect, pos), + }, + { + .binding = 1, + .location = 2, + .format = VK_FORMAT_R32G32_SFLOAT, + .offset = offsetof(ColoredRect, size), + }, + { + .binding = 1, + .location = 3, + .format = VK_FORMAT_R32G32B32A32_SFLOAT, + .offset = offsetof(ColoredRect, color), + }, + }; + +VkPipelineVertexInputStateCreateInfo input_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, + .pVertexBindingDescriptions = bindings, + .vertexBindingDescriptionCount = sizeof(bindings)/sizeof(VkVertexInputBindingDescription), + .pVertexAttributeDescriptions = attributes, + .vertexAttributeDescriptionCount = sizeof(attributes)/sizeof(VkVertexInputAttributeDescription), + }; + + VkPipelineLayoutCreateInfo layout_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .setLayoutCount = 1, + .pSetLayouts = &ui_descriptor_layout, + }; + + VkPipelineInputAssemblyStateCreateInfo input_assembly_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + .primitiveRestartEnable = VK_FALSE, + }; + + VkResult result = create_ui_pipeline(device, render_pass, shader_stages, sizeof(shader_stages)/sizeof(VkPipelineShaderStageCreateInfo), input_info, layout_info, input_assembly_info, pipeline); + if(result != VK_SUCCESS) { + return result; + } + + return VK_SUCCESS; +} + +VkResult create_ui_text_pipeline(VkDevice device, VkRenderPass render_pass, VkDescriptorSetLayout ui_descriptor_layout, GraphicsPipeline* pipeline) { + VkShaderModule vert_shader = load_shader_file("shader_src/ui_text.vert.spv", device); + VkShaderModule frag_shader = load_shader_file("shader_src/ui_text.frag.spv", device); + VkPipelineShaderStageCreateInfo shader_stages[] = { + { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_VERTEX_BIT, + .module = vert_shader, + .pName = "main", + }, + { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .stage = VK_SHADER_STAGE_FRAGMENT_BIT, + .module = frag_shader, + .pName = "main", + }, + }; + + VkVertexInputBindingDescription bindings[] = {}; + VkVertexInputAttributeDescription attributes[] = {}; + + VkPipelineVertexInputStateCreateInfo input_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, + .pVertexBindingDescriptions = bindings, + .vertexBindingDescriptionCount = sizeof(bindings)/sizeof(VkVertexInputBindingDescription), + .pVertexAttributeDescriptions = attributes, + .vertexAttributeDescriptionCount = sizeof(attributes)/sizeof(VkVertexInputAttributeDescription), + }; + + VkDescriptorSetLayout all_layouts[] = {ui_descriptor_layout}; + VkPipelineLayoutCreateInfo layout_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .setLayoutCount = sizeof(all_layouts)/sizeof(VkDescriptorSetLayout), + .pSetLayouts = all_layouts, + }; + + VkPipelineInputAssemblyStateCreateInfo input_assembly_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + .primitiveRestartEnable = VK_FALSE, + }; + + VkResult result = create_ui_pipeline(device, render_pass, shader_stages, sizeof(shader_stages)/sizeof(VkPipelineShaderStageCreateInfo), input_info, layout_info, input_assembly_info, pipeline); + if(result != VK_SUCCESS) { + return result; + } return VK_SUCCESS; } diff --git a/client/src/render.c b/client/src/render.c index 26c6df8..b77a48c 100644 --- a/client/src/render.c +++ b/client/src/render.c @@ -949,7 +949,7 @@ VkResult init_vulkan(GLFWwindow* window, RenderContext* context) { return result; } - result = create_ui_rect_pipeline(context->device, context->world_render_pass, context->ui_descriptor_layout, &context->ui_pipeline_rect); + result = create_ui_colored_rect_pipeline(context->device, context->world_render_pass, context->ui_descriptor_layout, &context->ui_pipeline_rect); if(result != VK_SUCCESS) { return result; } diff --git a/client/src/vma.o b/client/src/vma.o deleted file mode 100644 index 41ba09a..0000000 Binary files a/client/src/vma.o and /dev/null differ