diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2021-03-08 23:37:50 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2021-03-08 23:37:50 +0100 |
| commit | 14b00bdd8d0f3a6bdbc5623a964177cc6df2f4cc (patch) | |
| tree | a7907aef4980ad783053e323c6ea3b87809e5a53 /src | |
| parent | a14e25e7954b6101830c604f87694da5aee7625f (diff) | |
Add sampler creation/descruction and draw functions to the api
Diffstat (limited to 'src')
| -rw-r--r-- | src/vk-api.cpp | 74 | ||||
| -rw-r--r-- | src/vk-renderer.cpp | 60 |
2 files changed, 79 insertions, 55 deletions
diff --git a/src/vk-api.cpp b/src/vk-api.cpp index 117f461..5dbe010 100644 --- a/src/vk-api.cpp +++ b/src/vk-api.cpp @@ -219,6 +219,37 @@ void vkapi::destroy_semaphores(std::vector<VkSemaphore> &semaphores) { } +VkSampler vkapi::create_sampler(VkFilter filter, VkSamplerAddressMode address_mode) { + 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 = filter; + sampler_create_info.minFilter = filter; + sampler_create_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; + sampler_create_info.addressModeU = address_mode; + sampler_create_info.addressModeV = address_mode; + sampler_create_info.addressModeW = address_mode; + 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(context.device, &sampler_create_info, VK_NULL_HANDLE, &sampler)) + + return sampler; +} + +void vkapi::destroy_sampler(VkSampler sampler) { + vkDestroySampler(context.device, sampler, VK_NULL_HANDLE); +} + + std::vector<VkCommandBuffer> vkapi::create_command_buffers(size_t command_buffers_count) { VkCommandBufferAllocateInfo cmd_buf_allocate_info = {}; cmd_buf_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; @@ -845,6 +876,35 @@ void vkapi::image_barrier(VkCommandBuffer command_buffer, VkImageLayout src_layo ); } + +void vkapi::begin_render_pass(VkCommandBuffer command_buffer, VkRenderPass render_pass, VkFramebuffer framebuffer, VkExtent2D size, Pipeline pipeline) { + VkRect2D render_area = { + { + 0, + 0, + }, + size + }; + + VkClearValue clear_value = { 0.f, 0.f, 0.f, 1.f }; + VkRenderPassBeginInfo render_pass_begin_info = {}; + render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + render_pass_begin_info.pNext = VK_NULL_HANDLE; + render_pass_begin_info.renderPass = render_pass; + render_pass_begin_info.framebuffer = framebuffer; + render_pass_begin_info.renderArea = render_area; + render_pass_begin_info.clearValueCount = 1; + render_pass_begin_info.pClearValues = &clear_value; + + vkCmdBeginRenderPass(command_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); + vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle); +} + +void vkapi::end_render_pass(VkCommandBuffer command_buffer) { + vkCmdEndRenderPass(command_buffer); +} + + void vkapi::run_compute_pipeline(VkCommandBuffer command_buffer, Pipeline pipeline, VkDescriptorSet set, size_t group_count_x, size_t group_count_y, size_t group_count_z) { vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.layout, 0, 1, &set, 0, nullptr); @@ -853,6 +913,20 @@ void vkapi::run_compute_pipeline(VkCommandBuffer command_buffer, Pipeline pipeli vkCmdDispatch(command_buffer, group_count_x, group_count_y, group_count_z); } +void vkapi::draw(VkCommandBuffer command_buffer, Pipeline pipeline, VkDescriptorSet set, uint32_t vertex_count, uint32_t vertex_offset) { + vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.layout, 0, 1, &set, 0, nullptr); + vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle); + + vkCmdDraw(command_buffer, vertex_count, 1, vertex_offset, 0); +} + +void vkapi::draw(VkCommandBuffer command_buffer, Pipeline pipeline, VkDescriptorSet set, Buffer index_buffer, uint32_t index_count, uint32_t index_offset, uint32_t vertex_offset) { + vkCmdBindIndexBuffer(command_buffer, index_buffer.handle, 0, VK_INDEX_TYPE_UINT16); + vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.layout, 0, 1, &set, 0, nullptr); + + vkCmdDrawIndexed(command_buffer, index_count, 1, index_offset, vertex_offset, 0); +} + void vkapi::blit_full(VkCommandBuffer command_buffer, Image src_image, Image dst_image) { VkImageSubresourceLayers images_subres_layers { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp index 7f23da6..5843309 100644 --- a/src/vk-renderer.cpp +++ b/src/vk-renderer.cpp @@ -175,26 +175,7 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) { frame_index++; - 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; - - VKRESULT(vkCreateSampler(api.context.device, &sampler_create_info, VK_NULL_HANDLE, &ui_texture_sampler)) + ui_texture_sampler = api.create_sampler(VK_FILTER_LINEAR, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); for (size_t index = 0; index < swapchain.image_count; index++) { api.update_descriptor_set_image(ui_sets[index], ui_sets_bindings[2], ui_texture.view, ui_texture_sampler); @@ -222,7 +203,7 @@ vkrenderer::~vkrenderer() { api.destroy_render_pass(render_pass); - vkDestroySampler(api.context.device, ui_texture_sampler, VK_NULL_HANDLE); + api.destroy_sampler(ui_texture_sampler); api.destroy_image(ui_texture); @@ -262,7 +243,6 @@ void vkrenderer::begin_frame() { VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX)) VKRESULT(vkResetFences(api.context.device, 1, &submission_fences[frame_index])) - // Update descriptor with only the part of the buffer we are interested in if (ui_vertex_buffers[frame_index].size < draw_data->TotalVtxCount * sizeof(VkVertex)) { api.destroy_buffer(ui_vertex_buffers[frame_index]); @@ -314,34 +294,7 @@ void vkrenderer::ui() { auto cmd_buf = command_buffers[frame_index]; - VkRect2D render_area = { - { - 0, - 0, - }, - swapchain.extent - }; - VkClearValue clear_value = { 0.f, 0.f, 0.f, 1.f }; - VkRenderPassBeginInfo render_pass_begin_info = {}; - render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - render_pass_begin_info.pNext = VK_NULL_HANDLE; - render_pass_begin_info.renderPass = render_pass; - render_pass_begin_info.framebuffer = framebuffers[swapchain_image_index]; - render_pass_begin_info.renderArea = render_area; - render_pass_begin_info.clearValueCount = 1; - render_pass_begin_info.pClearValues = &clear_value; - - - 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; - - - vkCmdBeginRenderPass(cmd_buf, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); - - vkCmdBindPipeline(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, ui_pipeline.handle); + api.begin_render_pass(cmd_buf, render_pass, framebuffers[swapchain_image_index], swapchain.extent, ui_pipeline); VkViewport viewport = {}; viewport.x = draw_data->DisplayPos.x; @@ -358,9 +311,6 @@ void vkrenderer::ui() { 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].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) { VkRect2D rect = {}; rect.offset = { @@ -373,14 +323,14 @@ void vkrenderer::ui() { }; vkCmdSetScissor(cmd_buf, 0, 1, &rect); - vkCmdDrawIndexed(cmd_buf, draw_cmd.ElemCount, 1, index_buffer_offset + draw_cmd.IdxOffset, vertex_buffer_offset + draw_cmd.VtxOffset, 0); + api.draw(cmd_buf, ui_pipeline, ui_sets[frame_index], ui_index_buffers[frame_index], draw_cmd.ElemCount, index_buffer_offset + draw_cmd.IdxOffset, vertex_buffer_offset + draw_cmd.VtxOffset); } vertex_buffer_offset += draw_list->VtxBuffer.Size; index_buffer_offset += draw_list->IdxBuffer.Size; } - vkCmdEndRenderPass(cmd_buf); + api.end_render_pass(cmd_buf); } void vkrenderer::compute(uint32_t width, uint32_t height, bool clear) { |
