aboutsummaryrefslogtreecommitdiffstats
path: root/src/vk-renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vk-renderer.cpp')
-rw-r--r--src/vk-renderer.cpp167
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;
}