aboutsummaryrefslogtreecommitdiff
path: root/src/strategies/anti_lag/device_strategy.cc
diff options
context:
space:
mode:
authorNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-04-05 22:01:11 +1000
committerNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-04-05 22:01:11 +1000
commitcf0bced6cd86782e9706acda1b3b6ce6b4e98481 (patch)
tree618912ff9025cf0d249e10203b110002a26450f9 /src/strategies/anti_lag/device_strategy.cc
parent21e55ae8a1b3ddd4dff6c24a57bdc7d7272fff16 (diff)
Implement refactored AL2, todo frame limit
Diffstat (limited to 'src/strategies/anti_lag/device_strategy.cc')
-rw-r--r--src/strategies/anti_lag/device_strategy.cc59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/strategies/anti_lag/device_strategy.cc b/src/strategies/anti_lag/device_strategy.cc
index 5032c97..8a32daa 100644
--- a/src/strategies/anti_lag/device_strategy.cc
+++ b/src/strategies/anti_lag/device_strategy.cc
@@ -1,4 +1,9 @@
#include "device_strategy.hh"
+#include "device_context.hh"
+
+#include "queue_strategy.hh"
+
+#include <vulkan/vulkan_core.h>
namespace low_latency {
@@ -7,4 +12,58 @@ AntiLagDeviceStrategy::AntiLagDeviceStrategy(DeviceContext& device)
AntiLagDeviceStrategy::~AntiLagDeviceStrategy() {}
+void AntiLagDeviceStrategy::notify_update(const VkAntiLagDataAMD& data) {
+ const auto lock = std::scoped_lock{this->mutex};
+
+ this->is_enabled = !(data.mode == VK_ANTI_LAG_MODE_OFF_AMD);
+
+ this->delay = [&]() -> std::chrono::microseconds {
+ using namespace std::chrono;
+ if (!data.maxFPS) {
+ return 0us;
+ }
+ return duration_cast<microseconds>(1s / data.maxFPS);
+ }();
+
+ if (!data.pPresentationInfo) {
+ return;
+ }
+
+ // If we're at the input stage, start marking submissions as relevant.
+ // If we're at the present stage, stop collecting submissions by making
+ // our frame_index nullopt.
+ if (data.pPresentationInfo->stage == VK_ANTI_LAG_STAGE_PRESENT_AMD) {
+ this->frame_index.reset();
+ return;
+ }
+ this->frame_index.emplace(data.pPresentationInfo->frameIndex);
+
+ // We're in input now. Wait for all queue submissions to complete.
+ const auto device_lock = std::shared_lock{this->device.mutex};
+ for (const auto& iter : this->device.queues) {
+ const auto& queue = iter.second;
+
+ const auto strategy =
+ dynamic_cast<AntiLagQueueStrategy*>(queue->strategy.get());
+ assert(strategy);
+
+ strategy->await_complete();
+ }
+}
+
+bool AntiLagDeviceStrategy::should_track_submissions() {
+ const auto lock = std::shared_lock{this->mutex};
+
+ if (!this->is_enabled) {
+ return false;
+ }
+
+ // Don't track submissions if our frame index is nullopt!
+ if (!this->frame_index.has_value()) {
+ return false;
+ }
+
+ return true;
+}
+
} // namespace low_latency \ No newline at end of file