aboutsummaryrefslogtreecommitdiff
path: root/src/layer.cc
diff options
context:
space:
mode:
authorNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-02-13 18:21:04 +1100
committerNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-02-13 18:21:04 +1100
commit8f4501215c0dbbbde59da2d015fdec3dbe5131bc (patch)
treeac7e4b58309adb26e621c776f97fa8f08e608f04 /src/layer.cc
parent76f3ef1d7c2b4393a8e8b402deb924e606448d27 (diff)
add working frame tracking and commit before i break everything
Diffstat (limited to 'src/layer.cc')
-rw-r--r--src/layer.cc58
1 files changed, 34 insertions, 24 deletions
diff --git a/src/layer.cc b/src/layer.cc
index cead7cd..c521bb9 100644
--- a/src/layer.cc
+++ b/src/layer.cc
@@ -1,13 +1,10 @@
#include "layer.hh"
-#include <iostream>
#include <string_view>
+#include <thread>
#include <unordered_map>
#include <utility>
-// hack
-#include <deque>
-
#include <vulkan/utility/vk_dispatch_table.h>
#include <vulkan/vk_layer.h>
#include <vulkan/vk_platform.h>
@@ -90,6 +87,7 @@ CreateInstance(const VkInstanceCreateInfo* pCreateInfo,
auto vtable = VkuInstanceDispatchTable{
INSTANCE_VTABLE_LOAD(DestroyInstance),
INSTANCE_VTABLE_LOAD(EnumeratePhysicalDevices),
+ INSTANCE_VTABLE_LOAD(GetPhysicalDeviceProperties),
INSTANCE_VTABLE_LOAD(GetInstanceProcAddr),
INSTANCE_VTABLE_LOAD(CreateDevice),
INSTANCE_VTABLE_LOAD(EnumerateDeviceExtensionProperties),
@@ -307,16 +305,20 @@ static VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(
DEVICE_VTABLE_LOAD(GetSemaphoreCounterValueKHR),
DEVICE_VTABLE_LOAD(CmdWriteTimestamp2KHR),
DEVICE_VTABLE_LOAD(QueueSubmit2KHR),
+ DEVICE_VTABLE_LOAD(GetCalibratedTimestampsKHR),
};
#undef DEVICE_VTABLE_LOAD
+ const auto physical_context = layer_context.get_context(physical_device);
+
const auto key = layer_context.get_key(*pDevice);
const auto lock = std::scoped_lock{layer_context.mutex};
assert(!layer_context.contexts.contains(key));
layer_context.contexts.try_emplace(
- key, std::make_shared<DeviceContext>(instance_context, *pDevice, sdld,
- std::move(vtable)));
+ key,
+ std::make_shared<DeviceContext>(instance_context, *physical_context,
+ *pDevice, sdld, std::move(vtable)));
return VK_SUCCESS;
}
@@ -415,6 +417,8 @@ static VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR(
return result;
}
+ context->notify_acquire(swapchain, *pImageIndex, semaphore);
+
return VK_SUCCESS;
}
@@ -430,6 +434,9 @@ static VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImage2KHR(
return result;
}
+ context->notify_acquire(pAcquireInfo->swapchain, *pImageIndex,
+ pAcquireInfo->semaphore);
+
return VK_SUCCESS;
}
@@ -465,7 +472,7 @@ vkQueueSubmit(VkQueue queue, std::uint32_t submit_count,
next_submit_infos[0].pCommandBuffers = std::data(next_command_buffers);
next_submit_infos[0].commandBufferCount = std::size(next_command_buffers);
- const auto next_signal = queue_context->semaphore_sequence + 1;
+ const auto next_signal = 1 + queue_context->semaphore_sequence++;
const auto tail_tssi = VkTimelineSemaphoreSubmitInfo{
.sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR,
.signalSemaphoreValueCount = 1,
@@ -488,13 +495,8 @@ vkQueueSubmit(VkQueue queue, std::uint32_t submit_count,
return res;
}
- // Hack for now, store timestamp handles.
- queue_context->handle_hack.push_front(std::move(timestamp_handle));
- if (std::size(queue_context->handle_hack) > 250) {
- queue_context->handle_hack.pop_back();
- }
-
- ++queue_context->semaphore_sequence;
+ queue_context->notify_submit(std::span{submit_info, submit_count},
+ next_signal, std::move(timestamp_handle));
return VK_SUCCESS;
}
@@ -534,10 +536,12 @@ vkQueueSubmit2(VkQueue queue, std::uint32_t submit_count,
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 = queue_context->semaphore_sequence + 1,
+ .value = target_semaphore_sequence,
.stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
};
const auto tail_cbsi = VkCommandBufferSubmitInfo{
@@ -559,13 +563,9 @@ vkQueueSubmit2(VkQueue queue, std::uint32_t submit_count,
return res;
}
- // hack
- queue_context->handle_hack.push_front(std::move(timestamp_handle));
- if (std::size(queue_context->handle_hack) > 250) {
- queue_context->handle_hack.pop_back();
- }
-
- ++queue_context->semaphore_sequence;
+ queue_context->notify_submit({submit_infos, submit_count},
+ target_semaphore_sequence,
+ std::move(timestamp_handle));
return VK_SUCCESS;
}
@@ -580,8 +580,8 @@ vkQueueSubmit2KHR(VkQueue queue, std::uint32_t submit_count,
static VKAPI_ATTR VkResult VKAPI_CALL
vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* present_info) {
- const auto& vtable =
- layer_context.get_context(queue)->device_context.vtable;
+ const auto queue_context = layer_context.get_context(queue);
+ const auto& vtable = queue_context->device_context.vtable;
if (const auto res = vtable.QueuePresentKHR(queue, present_info);
res != VK_SUCCESS) {
@@ -589,6 +589,16 @@ vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* present_info) {
return res;
}
+ if (present_info) { // might not be needed
+ queue_context->notify_present(*present_info);
+ }
+
+ if (const auto sleep_time = queue_context->get_delay_time();
+ sleep_time.has_value()) {
+
+ std::this_thread::sleep_for(*sleep_time);
+ }
+
return VK_SUCCESS;
}