aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--shaders/ui.frag4
-rw-r--r--shaders/ui.vert6
-rw-r--r--src/vk-api.cpp17
-rw-r--r--src/vk-renderer.cpp112
5 files changed, 98 insertions, 45 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8127409..af44977 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,6 +6,10 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")
+add_compile_options(
+ -fcolor-diagnostics -fansi-escape-codes # colored output when using ninja
+)
+
project(path-tracer VERSION 1.0 LANGUAGES CXX)
find_package(imgui CONFIG REQUIRED)
diff --git a/shaders/ui.frag b/shaders/ui.frag
index 99534aa..c9f0339 100644
--- a/shaders/ui.frag
+++ b/shaders/ui.frag
@@ -5,8 +5,8 @@ layout(location = 0) in struct {
vec4 color;
} In;
-// layout(set = 0, binding = 1) uniform sampler2D atlas;
+layout(set = 0, binding = 1) uniform sampler2D atlas;
void main() {
- o_Color = In.color; // * texture(atlas, In.uv.xy);
+ o_Color = In.color * texture(atlas, In.uv.xy);
}
diff --git a/shaders/ui.vert b/shaders/ui.vert
index 36d3144..2e6862d 100644
--- a/shaders/ui.vert
+++ b/shaders/ui.vert
@@ -2,7 +2,6 @@ struct Vertex {
vec2 pos;
vec2 uv;
uint color;
- uint padding;
};
layout(set = 0, binding = 0) uniform Vertices {
@@ -18,11 +17,14 @@ layout(location = 0) out struct {
vec4 color;
} Out;
+const vec2 scale = vec2(2.0 / 384.0, 2.0 / 186.0);
+const vec2 translate = vec2(-1.0, -1.0);
+
void main() {
Vertex v = vertices[gl_VertexIndex];
Out.color = unpackUnorm4x8(v.color);
Out.uv = v.uv;
- gl_Position = vec4(v.pos, 0.0, 1.0);
+ gl_Position = vec4(v.pos * scale + translate, 0.0, 1.0);
}
diff --git a/src/vk-api.cpp b/src/vk-api.cpp
index eeb96d5..0c7d114 100644
--- a/src/vk-api.cpp
+++ b/src/vk-api.cpp
@@ -107,7 +107,6 @@ Image vkapi::create_image(VkExtent3D size, VkFormat format, VkImageUsageFlags us
VmaAllocationCreateInfo alloc_create_info = {};
alloc_create_info.usage = VMA_MEMORY_USAGE_GPU_ONLY;
- alloc_create_info.flags = VMA_ALLOCATION_CREATE_MAPPED_BIT;
VKRESULT(vmaCreateImage(context.allocator, &img_create_info, &alloc_create_info, &image.handle, &image.alloc, &image.alloc_info))
@@ -513,7 +512,7 @@ Pipeline vkapi::create_graphics_pipeline(const char* shader_name, std::vector<Vk
rasterization_state_create_info.depthClampEnable = VK_FALSE;
rasterization_state_create_info.rasterizerDiscardEnable = VK_FALSE;
rasterization_state_create_info.polygonMode = VK_POLYGON_MODE_FILL;
- rasterization_state_create_info.cullMode = VK_CULL_MODE_BACK_BIT;
+ rasterization_state_create_info.cullMode = VK_CULL_MODE_NONE;
rasterization_state_create_info.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
rasterization_state_create_info.depthBiasEnable = VK_FALSE;
rasterization_state_create_info.lineWidth = 1.f;
@@ -527,12 +526,12 @@ Pipeline vkapi::create_graphics_pipeline(const char* shader_name, std::vector<Vk
multisample_state_create_info.minSampleShading = 1.f;
VkPipelineColorBlendAttachmentState color_attachment_state = {};
- color_attachment_state.blendEnable = VK_FALSE;
- color_attachment_state.srcColorBlendFactor = VK_BLEND_FACTOR_ONE;
- color_attachment_state.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO;
+ color_attachment_state.blendEnable = VK_TRUE;
+ color_attachment_state.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
+ color_attachment_state.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
color_attachment_state.colorBlendOp = VK_BLEND_OP_ADD;
color_attachment_state.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
- color_attachment_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
+ color_attachment_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
color_attachment_state.alphaBlendOp = VK_BLEND_OP_ADD;
color_attachment_state.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
@@ -880,10 +879,10 @@ VkResult vkapi::submit(VkCommandBuffer command_buffer, VkSemaphore wait_semaphor
VkSubmitInfo submit_info = {};
submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submit_info.pNext = nullptr;
- submit_info.waitSemaphoreCount = 1;
+ submit_info.waitSemaphoreCount = wait_semaphore ? 1 : 0;
submit_info.pWaitSemaphores = &wait_semaphore;
- submit_info.pWaitDstStageMask = &wait_stage;
- submit_info.signalSemaphoreCount = 1;
+ submit_info.pWaitDstStageMask = wait_semaphore ? &wait_stage : VK_NULL_HANDLE;
+ submit_info.signalSemaphoreCount = signal_semaphore ? 1 : 0;
submit_info.pSignalSemaphores = &signal_semaphore;
submit_info.commandBufferCount = 1;
submit_info.pCommandBuffers = &command_buffer;
diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp
index 7808f3f..f87871a 100644
--- a/src/vk-renderer.cpp
+++ b/src/vk-renderer.cpp
@@ -14,6 +14,13 @@
#define VKRESULT(result) assert(result == VK_SUCCESS);
+struct VkVertex {
+ float x, y;
+ float u, v;
+ uint32_t color;
+ uint32_t padding[3];
+};
+
vkrenderer::vkrenderer(window& wnd, const input_data& inputs) {
platform_surface = api.create_surface(wnd);
swapchain = api.create_swapchain(
@@ -86,13 +93,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,
- // },
+ {
+ .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);
@@ -100,8 +107,6 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) {
ImGui::CreateContext();
auto io = ImGui::GetIO();
- ImGui::StyleColorsDark();
-
uint8_t* pixels = nullptr;
int atlas_width, atlas_height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &atlas_width, &atlas_height);
@@ -111,10 +116,43 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) {
.height = (uint32_t)atlas_height,
.depth = 1,
};
- ui_texture = api.create_image(atlas_size, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT);
+ auto staging_buffer = api.create_buffer(atlas_width * atlas_height * sizeof(uint32_t), VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY);
+ std::memcpy(staging_buffer.alloc_info.pMappedData, pixels, atlas_width * atlas_height * sizeof(uint32_t));
+
+ ui_texture = api.create_image(atlas_size, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
io.Fonts->SetTexID((void*)&ui_texture);
-
- // std::memcpy(ui_texture.alloc_info.pMappedData, pixels, atlas_width * atlas_height * sizeof(uint8_t));
+
+ VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX))
+ VKRESULT(vkResetFences(api.context.device, 1, &submission_fences[frame_index]))
+
+ auto cmd_buf = command_buffers[frame_index];
+ api.start_record(cmd_buf);
+
+ api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, ui_texture);
+
+ VkImageSubresourceLayers image_subresource_layers = {};
+ image_subresource_layers.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ image_subresource_layers.mipLevel = 0;
+ image_subresource_layers.baseArrayLayer = 0;
+ image_subresource_layers.layerCount = 1;
+
+ VkBufferImageCopy buffer_to_image_copy = {};
+ buffer_to_image_copy.bufferOffset = 0;
+ buffer_to_image_copy.bufferRowLength = 0;
+ buffer_to_image_copy.bufferImageHeight = 0;
+ buffer_to_image_copy.imageSubresource = image_subresource_layers;
+ buffer_to_image_copy.imageOffset = { 0, 0, 0 };
+ buffer_to_image_copy.imageExtent = atlas_size;
+
+ vkCmdCopyBufferToImage(cmd_buf, staging_buffer.handle, ui_texture.handle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &buffer_to_image_copy);
+
+ api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, 0, ui_texture);
+
+ api.end_record(cmd_buf);
+
+ api.submit(cmd_buf, VK_NULL_HANDLE, VK_NULL_HANDLE, submission_fences[frame_index]);
+
+ frame_index++;
VkSamplerCreateInfo sampler_create_info = {};
sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
@@ -138,9 +176,9 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) {
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);
- // }
+ 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);
@@ -201,23 +239,33 @@ void vkrenderer::begin_frame() {
ImGui::Render();
ImDrawData* draw_data = ImGui::GetDrawData();
- std::vector<Buffer> temp_vertex_buffers {};
- std::vector<Buffer> temp_index_buffers {};
+ if (ui_vertex_buffers[frame_index].size() == 0) {
+ std::vector<Buffer> temp_vertex_buffers {};
+ std::vector<Buffer> temp_index_buffers {};
- // Update descriptor with only the part of the buffer we are interested in
- for (size_t cmd_index = 0; cmd_index < draw_data->CmdListsCount; cmd_index++) {
- ImDrawList* draw_list = draw_data->CmdLists[cmd_index];
- auto vbuf = draw_list->VtxBuffer;
- auto ibuf = draw_list->IdxBuffer;
+ // Update descriptor with only the part of the buffer we are interested in
+ for (size_t cmd_index = 0; cmd_index < draw_data->CmdListsCount; cmd_index++) {
+ ImDrawList* draw_list = draw_data->CmdLists[cmd_index];
+ auto vbuf = draw_list->VtxBuffer;
+ auto ibuf = draw_list->IdxBuffer;
- 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]));
+ std::vector<VkVertex> vertices;
- 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]));
+ for (auto& imVertex: vbuf) {
+ vertices.push_back(*((VkVertex*)&imVertex));
+ }
- temp_vertex_buffers.push_back(vk_vtx_buf);
- temp_index_buffers.push_back(vk_idx_buf);
+ auto vk_vtx_buf = api.create_buffer(vertices.size() * sizeof(VkVertex), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU);
+ std::memcpy(vk_vtx_buf.alloc_info.pMappedData, vertices.data(), vertices.size() * sizeof(VkVertex));
+
+ auto vk_idx_buf = api.create_buffer(ibuf.Size * sizeof(ImDrawIdx), 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(ImDrawIdx));
+
+ ui_vertex_buffers[frame_index].push_back(vk_vtx_buf);
+ ui_index_buffers[frame_index].push_back(vk_idx_buf);
+ // temp_vertex_buffers.push_back(vk_vtx_buf);
+ // temp_index_buffers.push_back(vk_idx_buf);
+ }
}
@@ -232,11 +280,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);