aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorladevieq <ladevie.quentin@gmail.com>2021-03-08 23:37:50 +0100
committerladevieq <ladevie.quentin@gmail.com>2021-03-08 23:37:50 +0100
commit14b00bdd8d0f3a6bdbc5623a964177cc6df2f4cc (patch)
treea7907aef4980ad783053e323c6ea3b87809e5a53 /src
parenta14e25e7954b6101830c604f87694da5aee7625f (diff)
Add sampler creation/descruction and draw functions to the api
Diffstat (limited to 'src')
-rw-r--r--src/vk-api.cpp74
-rw-r--r--src/vk-renderer.cpp60
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) {