aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorladevieq <ladevie.quentin@gmail.com>2021-03-05 00:06:25 +0100
committerladevieq <ladevie.quentin@gmail.com>2021-03-05 00:06:25 +0100
commit2218ad410c01c8e3ea8416dd019d0c3072fbb1cf (patch)
treec7a9db529253265db65942d3981273fbe7678ed5
parent4460f6d85730cb630dda4be2ebe47fcf13478d58 (diff)
Fix imgui vertices rendering
-rw-r--r--include/vk-api.hpp2
-rw-r--r--include/vk-renderer.hpp3
-rw-r--r--shaders/ui.frag9
-rw-r--r--shaders/ui.vert20
-rw-r--r--src/main.cpp4
-rw-r--r--src/vk-api.cpp13
-rw-r--r--src/vk-context.cpp2
-rw-r--r--src/vk-renderer.cpp167
8 files changed, 101 insertions, 119 deletions
diff --git a/include/vk-api.hpp b/include/vk-api.hpp
index c113d6c..5b869f7 100644
--- a/include/vk-api.hpp
+++ b/include/vk-api.hpp
@@ -99,7 +99,7 @@ class vkapi {
void update_descriptor_set_buffer(VkDescriptorSet set, VkDescriptorSetLayoutBinding binding, Buffer& buffer);
void update_descriptor_set_buffer(VkDescriptorSet set, VkDescriptorSetLayoutBinding binding, Buffer& buffer, VkDeviceSize offset, VkDeviceSize range);
- void update_descriptor_set_image(VkDescriptorSet set, VkDescriptorSetLayoutBinding binding, VkImageView view);
+ void update_descriptor_set_image(VkDescriptorSet set, VkDescriptorSetLayoutBinding binding, VkImageView view, VkSampler sampler);
void start_record(VkCommandBuffer command_buffer);
diff --git a/include/vk-renderer.hpp b/include/vk-renderer.hpp
index 95b7893..9a0df94 100644
--- a/include/vk-renderer.hpp
+++ b/include/vk-renderer.hpp
@@ -46,9 +46,6 @@ class vkrenderer {
std::vector<VkDescriptorSet> compute_shader_sets;
Pipeline compute_pipeline;
- Buffer vertex_buffer;
- Buffer index_buffer;
-
std::vector<VkDescriptorSetLayoutBinding> ui_sets_bindings;
std::vector<std::vector<Buffer>>ui_vertex_buffers;
std::vector<std::vector<Buffer>>ui_index_buffers;
diff --git a/shaders/ui.frag b/shaders/ui.frag
index e5a6aa3..99534aa 100644
--- a/shaders/ui.frag
+++ b/shaders/ui.frag
@@ -1,5 +1,12 @@
layout(location = 0) out vec4 o_Color;
+layout(location = 0) in struct {
+ vec2 uv;
+ vec4 color;
+} In;
+
+// layout(set = 0, binding = 1) uniform sampler2D atlas;
+
void main() {
- o_Color = vec4(1.0, 0.0, 0.0, 1.0);
+ o_Color = In.color; // * texture(atlas, In.uv.xy);
}
diff --git a/shaders/ui.vert b/shaders/ui.vert
index 020eabb..cc1091c 100644
--- a/shaders/ui.vert
+++ b/shaders/ui.vert
@@ -1,13 +1,27 @@
struct Vertex {
vec2 pos;
vec2 uv;
- uint col;
+ vec4 color;
};
layout(set = 0, binding = 0) uniform Vertices {
- Vertex[158] vertices;
+ Vertex vertices[158];
};
+out gl_PerVertex {
+ vec4 gl_Position;
+};
+
+layout(location = 0) out struct {
+ vec2 uv;
+ vec4 color;
+} Out;
+
void main() {
- gl_Position = vec4(vertices[gl_VertexIndex].pos, 0.0, 1.0);
+ Vertex v = vertices[gl_VertexIndex];
+
+ Out.color = v.color;
+ Out.uv = v.uv;
+
+ gl_Position = vec4(v.pos, 0.0, 1.0);
}
diff --git a/src/main.cpp b/src/main.cpp
index 4db8f55..b824fd4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -133,7 +133,7 @@ int main() {
// You can specify NULL, NULL for the device to capture on if you have only one device and
// either no windows at all or only one window, and it will capture from that device.
// See the documentation below for a longer explanation
- if(rdoc_api) rdoc_api->StartFrameCapture(NULL, NULL);
+ // if(rdoc_api) rdoc_api->StartFrameCapture(NULL, NULL);
if (canRender) {
renderer.begin_frame();
@@ -150,7 +150,7 @@ int main() {
}
// stop the capture
- if(rdoc_api) rdoc_api->EndFrameCapture(NULL, NULL);
+ // if(rdoc_api) rdoc_api->EndFrameCapture(NULL, NULL);
}
//-------------------------
diff --git a/src/vk-api.cpp b/src/vk-api.cpp
index 3ff6cb8..eeb96d5 100644
--- a/src/vk-api.cpp
+++ b/src/vk-api.cpp
@@ -20,12 +20,20 @@ vkapi::vkapi() {
std::vector<VkDescriptorPoolSize> descriptor_pools_sizes = {
{
+ .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+ .descriptorCount = (uint32_t)0xff,
+ },
+ {
.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
.descriptorCount = (uint32_t)0xff,
},
{
.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
.descriptorCount = (uint32_t)0xff,
+ },
+ {
+ .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ .descriptorCount = (uint32_t)0xff,
}
};
@@ -57,7 +65,6 @@ Buffer vkapi::create_buffer(size_t data_size, VkBufferUsageFlags buffer_usage, V
VmaAllocationCreateInfo alloc_create_info = {};
alloc_create_info.usage = mem_usage;
alloc_create_info.flags = VMA_ALLOCATION_CREATE_MAPPED_BIT;
- alloc_create_info.requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
VKRESULT(vmaCreateBuffer(context.allocator, &buffer_info, &alloc_create_info, &buffer.handle, &buffer.alloc, &buffer.alloc_info))
@@ -767,9 +774,9 @@ void vkapi::update_descriptor_set_buffer(VkDescriptorSet set, VkDescriptorSetLay
vkUpdateDescriptorSets(context.device, 1, &write_descriptor, 0, nullptr);
}
-void vkapi::update_descriptor_set_image(VkDescriptorSet set, VkDescriptorSetLayoutBinding binding, VkImageView view) {
+void vkapi::update_descriptor_set_image(VkDescriptorSet set, VkDescriptorSetLayoutBinding binding, VkImageView view, VkSampler sampler) {
VkDescriptorImageInfo descriptor_image_info = {};
- descriptor_image_info.sampler = VK_NULL_HANDLE;
+ descriptor_image_info.sampler = sampler;
descriptor_image_info.imageView = view;
descriptor_image_info.imageLayout = VK_IMAGE_LAYOUT_GENERAL;
diff --git a/src/vk-context.cpp b/src/vk-context.cpp
index cbf2777..936efb7 100644
--- a/src/vk-context.cpp
+++ b/src/vk-context.cpp
@@ -15,7 +15,7 @@ VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(VkDebugUtilsMessageSeverityFlagBits
void *userData)
{
std::cerr << data->pMessage << std::endl;
- return VK_FALSE;
+ return VK_FALSE;
}
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;
}