@@ -235,12 +235,6 @@ bool Context::init_device()
235235 VK_KHR_SWAPCHAIN_EXTENSION_NAME,
236236 };
237237
238- std::vector<const char *> present_wait_extensions =
239- {
240- VK_KHR_PRESENT_ID_EXTENSION_NAME,
241- VK_KHR_PRESENT_WAIT_EXTENSION_NAME
242- };
243-
244238 auto device_list = instance->enumeratePhysicalDevices ().value ;
245239 bool device_chosen = false ;
246240 physical_device = vk::PhysicalDevice ();
@@ -269,15 +263,36 @@ bool Context::init_device()
269263 if (!device_chosen)
270264 return false ;
271265
272- if (check_extensions (present_wait_extensions, physical_device))
266+ auto chain = physical_device.getFeatures2 <vk::PhysicalDeviceFeatures2,
267+ vk::PhysicalDeviceAntiLagFeaturesAMD,
268+ vk::PhysicalDevicePresentWaitFeaturesKHR>();
269+
270+ if (chain.isLinked <vk::PhysicalDevicePresentWaitFeaturesKHR>())
273271 {
274- for (auto &ext : present_wait_extensions)
275- required_extensions.push_back (ext);
276- have_present_wait = true ;
272+ std::vector<const char *> present_wait_extensions = {
273+ VK_KHR_PRESENT_ID_EXTENSION_NAME,
274+ VK_KHR_PRESENT_WAIT_EXTENSION_NAME
275+ };
276+
277+ if (chain.get <vk::PhysicalDevicePresentWaitFeaturesKHR>().presentWait &&
278+ check_extensions (present_wait_extensions, physical_device))
279+ {
280+ for (auto &ext : present_wait_extensions)
281+ required_extensions.push_back (ext);
282+ have_present_wait = true ;
283+ }
277284 }
278- else
285+
286+ if (chain.isLinked <vk::PhysicalDeviceAntiLagFeaturesAMD>())
279287 {
280- have_present_wait = false ;
288+ std::vector<const char *> anti_lag_extensions = { VK_AMD_ANTI_LAG_EXTENSION_NAME };
289+
290+ if (chain.get <vk::PhysicalDeviceAntiLagFeaturesAMD>().antiLag &&
291+ check_extensions (anti_lag_extensions, physical_device))
292+ {
293+ required_extensions.push_back (anti_lag_extensions[0 ]);
294+ have_anti_lag = true ;
295+ }
281296 }
282297
283298 if (auto index = find_graphics_queue (physical_device))
@@ -289,13 +304,12 @@ bool Context::init_device()
289304 vk::DeviceQueueCreateInfo dqci ({}, graphics_queue_family_index, priorities);
290305 vk::DeviceCreateInfo dci ({}, dqci, {}, required_extensions);
291306
292- vk::PhysicalDevicePresentWaitFeaturesKHR physical_device_present_wait_feature (true );
293- vk::PhysicalDevicePresentIdFeaturesKHR physical_device_present_id_feature (true );
294- if (have_present_wait)
295- {
296- dci.setPNext (&physical_device_present_wait_feature);
297- physical_device_present_wait_feature.setPNext (&physical_device_present_id_feature);
298- }
307+ vk::PhysicalDevicePresentWaitFeaturesKHR physical_device_present_wait_feature (have_present_wait);
308+ dci.setPNext (&physical_device_present_wait_feature);
309+ vk::PhysicalDevicePresentIdFeaturesKHR physical_device_present_id_feature (have_present_wait);
310+ physical_device_present_wait_feature.setPNext (&physical_device_present_id_feature);
311+ vk::PhysicalDeviceAntiLagFeaturesAMD physical_device_anti_lag_feature (have_anti_lag);
312+ physical_device_present_id_feature.setPNext (&physical_device_anti_lag_feature);
299313
300314 device = physical_device.createDevice (dci).value ;
301315 queue = device.getQueue (graphics_queue_family_index, 0 );
@@ -319,6 +333,37 @@ bool Context::init_vma()
319333 return true ;
320334}
321335
336+ bool Context::update_anti_lag_stage (vk::AntiLagStageAMD stage)
337+ {
338+ if (!have_anti_lag || !device)
339+ return false ;
340+
341+ vk::AntiLagPresentationInfoAMD pinfo;
342+ vk::AntiLagDataAMD data;
343+
344+ pinfo.setFrameIndex (anti_lag_frame_index);
345+ pinfo.setStage (stage);
346+ data.setPPresentationInfo (&pinfo);
347+ data.setMaxFPS (0 );
348+ data.setMode (vk::AntiLagModeAMD::eOn);
349+ device.antiLagUpdateAMD (data);
350+
351+ if (stage == vk::AntiLagStageAMD::ePresent)
352+ anti_lag_frame_index++;
353+
354+ return true ;
355+ }
356+
357+ bool Context::update_anti_lag_input ()
358+ {
359+ return update_anti_lag_stage (vk::AntiLagStageAMD::eInput);
360+ }
361+
362+ bool Context::update_anti_lag_present ()
363+ {
364+ return update_anti_lag_stage (vk::AntiLagStageAMD::ePresent);
365+ }
366+
322367bool Context::create_swapchain ()
323368{
324369 wait_idle ();
0 commit comments