aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/vk-api.hpp1
-rw-r--r--include/vk-renderer.hpp5
-rw-r--r--src/main.cpp10
-rw-r--r--src/vk-api.cpp6
-rw-r--r--src/vk-renderer.cpp38
5 files changed, 36 insertions, 24 deletions
diff --git a/include/vk-api.hpp b/include/vk-api.hpp
index 53a33ba..c4b51aa 100644
--- a/include/vk-api.hpp
+++ b/include/vk-api.hpp
@@ -73,7 +73,6 @@ class vkapi {
void destroy_descriptor_sets(std::vector<VkDescriptorSet> &descriptor_sets);
- // TODO: Maybe includes surface in the swapchain structure
VkSurfaceKHR create_surface(window& wnd);
void destroy_surface(VkSurfaceKHR surface);
diff --git a/include/vk-renderer.hpp b/include/vk-renderer.hpp
index 301aad2..cd09458 100644
--- a/include/vk-renderer.hpp
+++ b/include/vk-renderer.hpp
@@ -31,7 +31,6 @@ class vkrenderer {
std::vector<VkCommandBuffer> command_buffers;
- VkDescriptorPool descriptor_pool;
std::vector<VkDescriptorSet> compute_shader_sets;
ComputePipeline compute_pipeline;
@@ -40,9 +39,7 @@ class vkrenderer {
std::vector<VkSemaphore> execution_semaphores;
std::vector<VkSemaphore> acquire_semaphores;
- VkSurfaceFormatKHR surface_format;
- VkSurfaceKHR platform_surface = VK_NULL_HANDLE;
-
+ VkSurfaceKHR platform_surface;
Swapchain swapchain;
const uint32_t min_swapchain_image_count = 3;
diff --git a/src/main.cpp b/src/main.cpp
index 390df41..37ebddb 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -44,8 +44,8 @@ int main() {
// Image dimensions
const float aspect_ratio = 16.0 / 9.0;
- const uint32_t width = 400;
- const uint32_t height = width / aspect_ratio;
+ uint32_t width = 400;
+ uint32_t height = width / aspect_ratio;
window wnd { width , height };
@@ -68,8 +68,10 @@ int main() {
for (auto event: wnd.events) {
switch(event.type) {
case EVENT_TYPES::RESIZE: {
- ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->width = event.width;
- ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->height = event.height;
+ width = event.width;
+ height = event.height;
+ ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->width = width;
+ ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->height = height;
if (event.width == 0 && event.height == 0) {
canRender = false;
diff --git a/src/vk-api.cpp b/src/vk-api.cpp
index 84ac583..c81927e 100644
--- a/src/vk-api.cpp
+++ b/src/vk-api.cpp
@@ -405,7 +405,7 @@ Swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count,
create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
create_info.presentMode = VK_PRESENT_MODE_FIFO_KHR;
create_info.clipped = VK_TRUE;
- create_info.oldSwapchain = old_swapchain_handle;
+ create_info.oldSwapchain = VK_NULL_HANDLE;
VKRESULT(vkCreateSwapchainKHR(context.device, &create_info, nullptr, &swapchain.handle))
@@ -413,8 +413,10 @@ Swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count,
destroy_swapchain(old_swapchain.value());
}
- VKRESULT(vkGetSwapchainImagesKHR(context.device, swapchain.handle, (uint32_t*)&swapchain.image_count, VK_NULL_HANDLE))
+ uint32_t image_count = 0;
+ VKRESULT(vkGetSwapchainImagesKHR(context.device, swapchain.handle, &image_count, VK_NULL_HANDLE))
+ swapchain.image_count = image_count;
swapchain.images = std::vector<Image>{ swapchain.image_count };
auto images = std::vector<VkImage>{ swapchain.image_count };
auto views = std::vector<VkImageView>{ swapchain.image_count };
diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp
index a8baa38..63694f2 100644
--- a/src/vk-renderer.cpp
+++ b/src/vk-renderer.cpp
@@ -50,15 +50,14 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) {
compute_shader_buffer = api.create_buffer(sizeof(inputs), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU);
std::memcpy(compute_shader_buffer.mapped_ptr, &inputs, sizeof(inputs));
- size_t image_index = 0;
- for (auto& set: compute_shader_sets) {
- api.update_descriptor_set_buffer(set, bindings[0], compute_shader_buffer);
- api.update_descriptor_set_image(set, bindings[1], swapchain.images[image_index].view);
+ for (size_t index = 0; index < swapchain.image_count; index++) {
+ api.update_descriptor_set_buffer(compute_shader_sets[index], bindings[0], compute_shader_buffer);
+ api.update_descriptor_set_image(compute_shader_sets[index], bindings[1], swapchain.images[index].view);
}
}
vkrenderer::~vkrenderer() {
- VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX))
+ VKRESULT(vkWaitForFences(api.context.device, submission_fences.size(), submission_fences.data(), VK_TRUE, UINT64_MAX))
api.destroy_buffer(compute_shader_buffer);
api.destroy_fences(submission_fences);
@@ -81,6 +80,17 @@ void vkrenderer::compute(uint32_t width, uint32_t height) {
auto acquire_result = vkAcquireNextImageKHR(api.context.device, swapchain.handle, UINT64_MAX, acquire_semaphores[frame_index], VK_NULL_HANDLE, &current_image_index);
handle_swapchain_result(acquire_result);
+ // API
+ // api.start_record(cmd_buffer);
+ // api.command_barrier();
+ // bind pipeline
+ // bind descriptor set
+ // dispatch
+ // api.command_barrier();
+ // api.stop_record();
+ // api.execute(cmd_buffer, wait_semaphore, signal_semaphore);
+ // api.present(swapchain, img_index, wait_semaphore);
+
VkCommandBufferBeginInfo cmd_buf_begin_info = {};
cmd_buf_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
cmd_buf_begin_info.pNext = nullptr;
@@ -88,7 +98,6 @@ void vkrenderer::compute(uint32_t width, uint32_t height) {
cmd_buf_begin_info.pInheritanceInfo = nullptr;
vkBeginCommandBuffer(command_buffers[frame_index], &cmd_buf_begin_info);
-
VkImageSubresourceRange image_subresource_range = {};
image_subresource_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
image_subresource_range.baseMipLevel = 0;
@@ -182,15 +191,18 @@ void vkrenderer::compute(uint32_t width, uint32_t height) {
auto present_result = vkQueuePresentKHR(api.context.queue, &present_info);
handle_swapchain_result(present_result);
- VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX))
-
frame_index = ++frame_index % swapchain.image_count;
}
void vkrenderer::recreate_swapchain() {
- VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX))
+ VKRESULT(vkWaitForFences(api.context.device, submission_fences.size(), submission_fences.data(), VK_TRUE, UINT64_MAX))
- swapchain = api.create_swapchain(platform_surface, 3, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, std::optional<Swapchain> { swapchain });
+ swapchain = api.create_swapchain(
+ platform_surface,
+ min_swapchain_image_count,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_STORAGE_BIT,
+ std::optional<Swapchain> { swapchain }
+ );
VkDescriptorSetLayoutBinding binding {
.binding = 1,
@@ -199,9 +211,9 @@ void vkrenderer::recreate_swapchain() {
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
.pImmutableSamplers = VK_NULL_HANDLE,
};
- size_t image_index = 0;
- for (auto& set: compute_shader_sets) {
- api.update_descriptor_set_image(set, binding, swapchain.images[image_index].view);
+
+ for (size_t index = 0; index < swapchain.image_count; index++) {
+ api.update_descriptor_set_image(compute_shader_sets[index], binding, swapchain.images[index].view);
}
}