diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2021-03-05 00:06:25 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2021-03-05 00:06:25 +0100 |
| commit | 2218ad410c01c8e3ea8416dd019d0c3072fbb1cf (patch) | |
| tree | c7a9db529253265db65942d3981273fbe7678ed5 /src/vk-renderer.cpp | |
| parent | 4460f6d85730cb630dda4be2ebe47fcf13478d58 (diff) | |
Fix imgui vertices rendering
Diffstat (limited to 'src/vk-renderer.cpp')
| -rw-r--r-- | src/vk-renderer.cpp | 167 |
1 files changed, 62 insertions, 105 deletions
diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp index b881fa2..0584ecf 100644 --- a/src/vk-renderer.cpp +++ b/src/vk-renderer.cpp @@ -84,6 +84,13 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) { .stageFlags = VK_SHADER_STAGE_VERTEX_BIT, .pImmutableSamplers = VK_NULL_HANDLE, }, + // { + // .binding = 1, + // .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + // .descriptorCount = 1, + // .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT, + // .pImmutableSamplers = VK_NULL_HANDLE, + // }, }; ui_pipeline = api.create_graphics_pipeline("ui", ui_sets_bindings, (VkShaderStageFlagBits)(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT), render_pass); ui_sets = api.create_descriptor_sets(ui_pipeline.descriptor_set_layout, swapchain.image_count); @@ -104,6 +111,34 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) { }; ui_texture = api.create_image(atlas_size, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT); io.Fonts->SetTexID((void*)&ui_texture); + + // std::memcpy(ui_texture.alloc_info.pMappedData, pixels, atlas_width * atlas_height * sizeof(uint8_t)); + + VkSamplerCreateInfo sampler_create_info = {}; + sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; + sampler_create_info.pNext = VK_NULL_HANDLE; + sampler_create_info.flags = 0; + sampler_create_info.magFilter = VK_FILTER_LINEAR; + sampler_create_info.minFilter = VK_FILTER_LINEAR; + sampler_create_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; + sampler_create_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + sampler_create_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + sampler_create_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + sampler_create_info.mipLodBias = 0.f; + sampler_create_info.anisotropyEnable = VK_FALSE; + sampler_create_info.compareEnable = VK_FALSE; + sampler_create_info.compareOp = VK_COMPARE_OP_ALWAYS; + sampler_create_info.minLod = 0.f; + sampler_create_info.maxLod = 0.f; + sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; + sampler_create_info.unnormalizedCoordinates = VK_FALSE; + + VkSampler sampler; + VKRESULT(vkCreateSampler(api.context.device, &sampler_create_info, VK_NULL_HANDLE, &sampler)) + + // for (size_t index = 0; index < swapchain.image_count; index++) { + // api.update_descriptor_set_image(ui_sets[index], ui_sets_bindings[1], ui_texture.view, sampler); + // } ui_vertex_buffers.resize(swapchain.image_count); ui_index_buffers.resize(swapchain.image_count); @@ -173,22 +208,14 @@ void vkrenderer::begin_frame() { auto vbuf = draw_list->VtxBuffer; auto ibuf = draw_list->IdxBuffer; - // auto vk_vtx_buf = api.create_buffer(vertex_buffer.Size * sizeof(vertex_buffer.Data[0]), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); - // std::memcpy(vk_vtx_buf.alloc_info.pMappedData, vertex_buffer.Data, vertex_buffer.Size * sizeof(vertex_buffer.Data[0])); - - // auto vk_idx_buf = api.create_buffer(index_buffer.Size * sizeof(index_buffer.Data[0]), VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); - // std::memcpy(vk_idx_buf.alloc_info.pMappedData, index_buffer.Data, index_buffer.Size * sizeof(index_buffer.Data[0])); + auto vk_vtx_buf = api.create_buffer(vbuf.Size * sizeof(vbuf.Data[0]), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + std::memcpy(vk_vtx_buf.alloc_info.pMappedData, vbuf.Data, vbuf.Size * sizeof(vbuf.Data[0])); - // temp_vertex_buffers.push_back(vk_vtx_buf); - // temp_index_buffers.push_back(vk_idx_buf); + auto vk_idx_buf = api.create_buffer(ibuf.Size * sizeof(ibuf.Data[0]), VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); + std::memcpy(vk_idx_buf.alloc_info.pMappedData, ibuf.Data, ibuf.Size * sizeof(ibuf.Data[0])); - vertex_buffer = api.create_buffer(vbuf.Size * sizeof(vbuf.Data[0]), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); - std::memcpy(vertex_buffer.alloc_info.pMappedData, vbuf.Data, vbuf.Size * sizeof(vbuf.Data[0])); - vmaFlushAllocation(api.context.allocator, vertex_buffer.alloc, 0, VK_WHOLE_SIZE); - - index_buffer = api.create_buffer(ibuf.Size * sizeof(ibuf.Data[0]), VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); - std::memcpy(index_buffer.alloc_info.pMappedData, ibuf.Data, ibuf.Size * sizeof(ibuf.Data[0])); - vmaFlushAllocation(api.context.allocator, index_buffer.alloc, 0, VK_WHOLE_SIZE); + temp_vertex_buffers.push_back(vk_vtx_buf); + temp_index_buffers.push_back(vk_idx_buf); } @@ -203,11 +230,11 @@ void vkrenderer::begin_frame() { // api.destroy_buffer(index_buffer); // } - // ui_vertex_buffers[frame_index].clear(); - // ui_index_buffers[frame_index].clear(); + ui_vertex_buffers[frame_index].clear(); + ui_index_buffers[frame_index].clear(); - // ui_vertex_buffers[frame_index] = std::move(temp_vertex_buffers); - // ui_index_buffers[frame_index] = std::move(temp_index_buffers); + ui_vertex_buffers[frame_index] = std::move(temp_vertex_buffers); + ui_index_buffers[frame_index] = std::move(temp_index_buffers); swapchain_image_index = 0; auto acquire_result = vkAcquireNextImageKHR(api.context.device, swapchain.handle, UINT64_MAX, acquire_semaphores[frame_index], VK_NULL_HANDLE, &swapchain_image_index); @@ -218,8 +245,8 @@ void vkrenderer::begin_frame() { auto output_image = accumulation_images[0]; auto accumulation_image = accumulation_images[1]; - api.update_descriptor_set_image(compute_shader_sets[swapchain_image_index], compute_sets_bindings[1], output_image.view); - api.update_descriptor_set_image(compute_shader_sets[swapchain_image_index], compute_sets_bindings[2], accumulation_image.view); + api.update_descriptor_set_image(compute_shader_sets[swapchain_image_index], compute_sets_bindings[1], output_image.view, VK_NULL_HANDLE); + api.update_descriptor_set_image(compute_shader_sets[swapchain_image_index], compute_sets_bindings[2], accumulation_image.view, VK_NULL_HANDLE); api.start_record(cmd_buf); @@ -248,99 +275,29 @@ void vkrenderer::ui() { render_pass_begin_info.pClearValues = &clear_value; - // std::vector<VkBufferMemoryBarrier> buffers_barrier = {}; - // VkBufferMemoryBarrier vertex_buffer_barrier = {}; - // vertex_buffer_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; - // vertex_buffer_barrier.pNext = VK_NULL_HANDLE; - // vertex_buffer_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; - // vertex_buffer_barrier.dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; - // vertex_buffer_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - // vertex_buffer_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - // vertex_buffer_barrier.buffer = vertex_buffer.handle; - // vertex_buffer_barrier.offset = 0; - // vertex_buffer_barrier.size = VK_WHOLE_SIZE; - // buffers_barrier.push_back(vertex_buffer_barrier); - - // VkBufferMemoryBarrier index_buffer_barrier = {}; - // index_buffer_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; - // index_buffer_barrier.pNext = VK_NULL_HANDLE; - // index_buffer_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; - // index_buffer_barrier.dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; - // index_buffer_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - // index_buffer_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - // index_buffer_barrier.buffer = index_buffer.handle; - // index_buffer_barrier.offset = 0; - // index_buffer_barrier.size = VK_WHOLE_SIZE; - // buffers_barrier.push_back(index_buffer_barrier); - - // vkCmdPipelineBarrier( - // cmd_buf, - // VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - // VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, - // 0, - // 0, - // nullptr, - // 2, - // buffers_barrier.data(), - // 0, - // nullptr - // ); - - // VkMemoryBarrier memory_barrier = {}; - // memory_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; - // memory_barrier.pNext = VK_NULL_HANDLE; - // memory_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; - // memory_barrier.dstAccessMask = VK_ACCESS_INDEX_READ_BIT; + VkMemoryBarrier memory_barrier = {}; + memory_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; + memory_barrier.pNext = VK_NULL_HANDLE; + memory_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; + memory_barrier.dstAccessMask = VK_ACCESS_INDEX_READ_BIT; - // vkCmdPipelineBarrier( - // cmd_buf, - // VK_PIPELINE_STAGE_HOST_BIT, - // VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, - // 0, - // 1, - // &memory_barrier, - // 0, - // nullptr, - // 0, - // nullptr - // ); - - vkCmdPipelineBarrier( - cmd_buf, - VK_PIPELINE_STAGE_HOST_BIT, - VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, - 0, - 0, - nullptr, - 0, - nullptr, - 0, - nullptr - ); vkCmdBeginRenderPass(cmd_buf, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); - vkCmdBindDescriptorSets(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, ui_pipeline.layout, 0, 1, &ui_sets[frame_index], 0, nullptr); - vkCmdBindPipeline(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, ui_pipeline.handle); - // for (size_t cmd_index = 0; cmd_index < draw_data->CmdListsCount; cmd_index++) { - // ImDrawList* draw_list = draw_data->CmdLists[cmd_index]; - - // api.update_descriptor_set_buffer(ui_sets[frame_index], ui_sets_bindings[0], ui_vertex_buffers[frame_index][cmd_index]); + for (size_t cmd_index = 0; cmd_index < draw_data->CmdListsCount; cmd_index++) { + ImDrawList* draw_list = draw_data->CmdLists[cmd_index]; - // vkCmdBindIndexBuffer(cmd_buf, ui_index_buffers[frame_index][cmd_index].handle, 0, VK_INDEX_TYPE_UINT16); + api.update_descriptor_set_buffer(ui_sets[frame_index], ui_sets_bindings[0], ui_vertex_buffers[frame_index][cmd_index]); - api.update_descriptor_set_buffer(ui_sets[frame_index], ui_sets_bindings[0], vertex_buffer); - // auto temp_buffer = { 0, 1, 2, 2, 1, 3 }; - // std::memcpy(ui_index_buffers[frame_index][cmd_index].alloc_info.pMappedData, &temp_buffer, sizeof(temp_buffer)); - vkCmdBindIndexBuffer(cmd_buf, index_buffer.handle, 0, VK_INDEX_TYPE_UINT16); - vkCmdDrawIndexed(cmd_buf, 50, 1, 0, 0, 0); + vkCmdBindIndexBuffer(cmd_buf, ui_index_buffers[frame_index][cmd_index].handle, 0, VK_INDEX_TYPE_UINT16); + vkCmdBindDescriptorSets(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, ui_pipeline.layout, 0, 1, &ui_sets[frame_index], 0, VK_NULL_HANDLE); - // for (auto& draw_cmd: draw_list->CmdBuffer) { - // vkCmdDrawIndexed(cmd_buf, draw_cmd.ElemCount, 1, draw_cmd.IdxOffset, draw_cmd.VtxOffset, 0); - // } - // } + for (auto& draw_cmd: draw_list->CmdBuffer) { + vkCmdDrawIndexed(cmd_buf, draw_cmd.ElemCount, 1, draw_cmd.IdxOffset, draw_cmd.VtxOffset, 0); + } + } vkCmdEndRenderPass(cmd_buf); } @@ -386,7 +343,7 @@ void vkrenderer::finish_frame() { auto present_result = api.present(swapchain, swapchain_image_index, execution_semaphores[frame_index]); handle_swapchain_result(present_result); - // std::swap(accumulation_images[0], accumulation_images[1]); + std::swap(accumulation_images[0], accumulation_images[1]); frame_index = ++frame_index % swapchain.image_count; } |
