aboutsummaryrefslogtreecommitdiff
path: root/src/layer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/layer.cc')
-rw-r--r--src/layer.cc147
1 files changed, 48 insertions, 99 deletions
diff --git a/src/layer.cc b/src/layer.cc
index 1b1d9e7..f9917f6 100644
--- a/src/layer.cc
+++ b/src/layer.cc
@@ -1,5 +1,6 @@
#include "layer.hh"
+#include <iostream>
#include <memory>
#include <span>
#include <string_view>
@@ -278,7 +279,7 @@ static VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(
return result;
}
-
+
#define DEVICE_VTABLE_LOAD(name) \
.name = reinterpret_cast<PFN_vk##name>(gdpa(*pDevice, "vk" #name))
auto vtable = VkuDeviceDispatchTable{
@@ -457,23 +458,19 @@ vkQueueSubmit(VkQueue queue, std::uint32_t submit_count,
}
// We have to avoid casting away the const* of the passed VkSubmitInfos.
- // We wrap every single submission with *two* extra VkSubmitInfos to
- // accomplish this. The first executes a command buffer that
+ // So we end up copying a lot of stuff and wrapping them in unique_ptrs
+ // so their position in memory is stable.
using cb_vect = std::vector<VkCommandBuffer>;
using tssi_ptr_t = std::unique_ptr<VkTimelineSemaphoreSubmitInfo>;
auto next_submits = std::vector<VkSubmitInfo>{};
auto next_cbs = std::vector<std::unique_ptr<cb_vect>>{};
- auto next_signals = std::vector<std::unique_ptr<std::uint64_t>>{};
- auto next_tssis = std::vector<tssi_ptr_t>{};
auto handles = std::vector<std::shared_ptr<TimestampPool::Handle>>{};
for (const auto& submit_info : std::span{submit_infos, submit_count}) {
const auto head_handle = queue_context->timestamp_pool->acquire();
const auto tail_handle = queue_context->timestamp_pool->acquire();
- // Head is special as we need to inject a CB into a copy of
- // their command buffers that records the time the waits completed.
next_cbs.emplace_back([&]() -> auto {
auto cbs = std::make_unique<std::vector<VkCommandBuffer>>();
head_handle->setup_command_buffers(*tail_handle, *queue_context);
@@ -488,42 +485,13 @@ vkQueueSubmit(VkQueue queue, std::uint32_t submit_count,
next_submits.back().pCommandBuffers = std::data(*next_cbs.back());
next_submits.back().commandBufferCount = std::size(*next_cbs.back());
- const auto next_signal = 1 + queue_context->semaphore_sequence++;
-
- next_signals.push_back(std::make_unique<std::uint64_t>(next_signal));
-
- next_tssis.push_back(std::make_unique<VkTimelineSemaphoreSubmitInfo>(
- VkTimelineSemaphoreSubmitInfo{
- .sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR,
- .signalSemaphoreValueCount = 1,
- .pSignalSemaphoreValues = next_signals.back().get(),
- }));
- next_submits.push_back(VkSubmitInfo{
- .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
- .pNext = next_tssis.back().get(),
- .commandBufferCount = 1,
- .pCommandBuffers = &tail_handle->command_buffer,
- .signalSemaphoreCount = 1,
- .pSignalSemaphores = &queue_context->semaphore,
- });
-
- queue_context->notify_submit(submit_info, next_signal, head_handle,
- tail_handle);
-
+ queue_context->notify_submit(submit_info, head_handle, tail_handle);
handles.push_back(head_handle);
handles.push_back(tail_handle);
}
- if (const auto res = vtable.QueueSubmit(queue, std::size(next_submits),
- std::data(next_submits), fence);
- res != VK_SUCCESS) {
-
- return res;
- }
-
- // ?!?
-
- return VK_SUCCESS;
+ return vtable.QueueSubmit(queue, std::size(next_submits),
+ std::data(next_submits), fence);
}
// The logic for this function is identical to vkSubmitInfo.
@@ -531,71 +499,52 @@ static VKAPI_ATTR VkResult VKAPI_CALL
vkQueueSubmit2(VkQueue queue, std::uint32_t submit_count,
const VkSubmitInfo2* submit_infos, VkFence fence) {
- const auto queue_context = layer_context.get_context(queue);
+ const auto& queue_context = layer_context.get_context(queue);
const auto& vtable = queue_context->device_context.vtable;
- // TODO
- if (!submit_count || true) {
+ if (!submit_count) {
return vtable.QueueSubmit2(queue, submit_count, submit_infos, fence);
}
- /*
- auto timestamp_handle = queue_context->timestamp_pool->acquire();
- timestamp_handle->setup_command_buffers(vtable);
- const auto& [head_cb, tail_cb] = timestamp_handle->command_buffers;
-
- const auto next_command_buffers = [&]() -> auto {
- auto next_command_buffers = std::vector<VkCommandBufferSubmitInfo>{};
- next_command_buffers.push_back(VkCommandBufferSubmitInfo{
- .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
- .commandBuffer = head_cb,
- });
- std::ranges::copy_n(submit_infos[0].pCommandBufferInfos,
- submit_infos[0].commandBufferInfoCount,
- std::back_inserter(next_command_buffers));
- return next_command_buffers;
- }();
+ using cb_vect_t = std::vector<VkCommandBufferSubmitInfo>;
+ auto next_submits = std::vector<VkSubmitInfo2>{};
+ auto next_cbs = std::vector<std::unique_ptr<cb_vect_t>>{};
+ auto handles = std::vector<std::shared_ptr<TimestampPool::Handle>>{};
- auto next_submit_infos = std::vector<VkSubmitInfo2>();
- std::ranges::copy_n(submit_infos, submit_count,
- std::back_inserter(next_submit_infos));
- next_submit_infos[0].pCommandBufferInfos = std::data(next_command_buffers);
- next_submit_infos[0].commandBufferInfoCount =
- std::size(next_command_buffers);
-
- const auto target_semaphore_sequence =
- 1 + queue_context->semaphore_sequence++;
- const auto tail_ssi = VkSemaphoreSubmitInfo{
- .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
- .semaphore = queue_context->semaphore,
- .value = target_semaphore_sequence,
- .stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
- };
- const auto tail_cbsi = VkCommandBufferSubmitInfo{
- .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
- .commandBuffer = tail_cb,
- };
- next_submit_infos.push_back(VkSubmitInfo2{
- .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
- .commandBufferInfoCount = 1,
- .pCommandBufferInfos = &tail_cbsi,
- .signalSemaphoreInfoCount = 1,
- .pSignalSemaphoreInfos = &tail_ssi,
- });
-
- if (const auto res =
- vtable.QueueSubmit2(queue, std::size(next_submit_infos),
- std::data(next_submit_infos), fence);
- res != VK_SUCCESS) {
- return res;
- }
+ for (const auto& submit_info : std::span{submit_infos, submit_count}) {
+ const auto head_handle = queue_context->timestamp_pool->acquire();
+ const auto tail_handle = queue_context->timestamp_pool->acquire();
+
+ next_cbs.emplace_back([&]() -> auto {
+ auto cbs = std::make_unique<cb_vect_t>();
+ head_handle->setup_command_buffers(*tail_handle, *queue_context);
+ cbs->push_back(VkCommandBufferSubmitInfo{
+ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
+ .commandBuffer = head_handle->command_buffer,
+ });
+ std::ranges::copy_n(submit_info.pCommandBufferInfos,
+ submit_info.commandBufferInfoCount,
+ std::back_inserter(*cbs));
+ cbs->push_back(VkCommandBufferSubmitInfo{
+ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
+ .commandBuffer = tail_handle->command_buffer,
+ });
+ return cbs;
+ }());
- queue_context->notify_submit({submit_infos, submit_count},
- target_semaphore_sequence,
- std::move(timestamp_handle));
+ next_submits.push_back(submit_info);
+ next_submits.back().pCommandBufferInfos = std::data(*next_cbs.back());
+ next_submits.back().commandBufferInfoCount =
+ std::size(*next_cbs.back());
- return VK_SUCCESS;
- */
+ queue_context->notify_submit(submit_info, head_handle, tail_handle);
+
+ handles.push_back(head_handle);
+ handles.push_back(tail_handle);
+ }
+
+ return vtable.QueueSubmit2(queue, std::size(next_submits),
+ std::data(next_submits), fence);
}
static VKAPI_ATTR VkResult VKAPI_CALL
@@ -621,10 +570,10 @@ vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* present_info) {
queue_context->notify_present(*present_info);
}
- if (const auto sleep_time = queue_context->get_delay_time();
- sleep_time.has_value()) {
+ if (const auto sleep_until = queue_context->get_sleep_until();
+ sleep_until.has_value()) {
- std::this_thread::sleep_for(*sleep_time);
+ std::this_thread::sleep_until(*sleep_until);
}
return VK_SUCCESS;