aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/layer.cc92
1 files changed, 68 insertions, 24 deletions
diff --git a/src/layer.cc b/src/layer.cc
index 31102e8..b5287f8 100644
--- a/src/layer.cc
+++ b/src/layer.cc
@@ -28,22 +28,42 @@ LayerContext layer_context;
} // namespace
-template <typename T, typename sType, typename fType>
-static T* get_link_info(const void* const head, const sType& stype,
- const fType& ftype) {
- for (auto i = reinterpret_cast<const VkBaseInStructure*>(head); i;
+template <typename T>
+static T* find_next(void* const head, const VkStructureType& stype) {
+ for (auto i = reinterpret_cast<VkBaseOutStructure*>(head); i;
i = i->pNext) {
if (i->sType != stype) {
continue;
}
+ return reinterpret_cast<T*>(i);
+ }
+ return nullptr;
+}
+
+template <typename T>
+static const T* find_next(const void* const head,
+ const VkStructureType& stype) {
+ for (auto i = reinterpret_cast<const VkBaseInStructure*>(head); i;
+ i = i->pNext) {
- const auto info = reinterpret_cast<const T*>(i);
- if (info->function != ftype) {
+ if (i->sType != stype) {
continue;
}
+ return reinterpret_cast<const T*>(i);
+ }
+ return nullptr;
+}
- return const_cast<T*>(info);
+template <typename T>
+static const T* find_link(const void* head, const VkStructureType& stype) {
+ for (auto info = find_next<T>(head, stype); info;
+ info = find_next<T>(info->pNext, stype)) {
+
+ if (info->function != VK_LAYER_LINK_INFO) {
+ continue;
+ }
+ return reinterpret_cast<const T*>(info);
}
return nullptr;
}
@@ -52,9 +72,8 @@ static VKAPI_ATTR VkResult VKAPI_CALL
CreateInstance(const VkInstanceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkInstance* pInstance) {
- const auto link_info = get_link_info<VkLayerInstanceCreateInfo>(
- pCreateInfo->pNext, VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO,
- VK_LAYER_LINK_INFO);
+ const auto link_info = find_link<VkLayerInstanceCreateInfo>(
+ pCreateInfo->pNext, VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO);
if (!link_info || !link_info->u.pLayerInfo) {
return VK_ERROR_INITIALIZATION_FAILED;
@@ -66,7 +85,8 @@ CreateInstance(const VkInstanceCreateInfo* pCreateInfo,
if (!gipa) {
return VK_ERROR_INITIALIZATION_FAILED;
}
- link_info->u.pLayerInfo = link_info->u.pLayerInfo->pNext;
+ const_cast<VkLayerInstanceCreateInfo*>(link_info)->u.pLayerInfo =
+ link_info->u.pLayerInfo->pNext;
// Call our create instance func, and store vkDestroyInstance, and
// vkCreateDevice as well.
@@ -94,6 +114,7 @@ CreateInstance(const VkInstanceCreateInfo* pCreateInfo,
INSTANCE_VTABLE_LOAD(CreateDevice);
INSTANCE_VTABLE_LOAD(EnumerateDeviceExtensionProperties);
INSTANCE_VTABLE_LOAD(GetPhysicalDeviceQueueFamilyProperties2);
+ INSTANCE_VTABLE_LOAD(GetPhysicalDeviceFeatures2);
#undef INSTANCE_VTABLE_LOAD
const auto lock = std::scoped_lock{layer_context.mutex};
@@ -160,26 +181,19 @@ static VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(
VkPhysicalDevice physical_device, const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkDevice* pDevice) {
- const auto create_info = get_link_info<VkLayerDeviceCreateInfo>(
- pCreateInfo->pNext, VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO,
- VK_LAYER_LINK_INFO);
+ const auto create_info = find_link<VkLayerDeviceCreateInfo>(
+ pCreateInfo->pNext, VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO);
if (!create_info || !create_info->u.pLayerInfo) {
return VK_ERROR_INITIALIZATION_FAILED;
}
- const auto callback_info = get_link_info<VkLayerDeviceCreateInfo>(
- pCreateInfo->pNext, VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO,
- VK_LOADER_DATA_CALLBACK);
- if (!callback_info || !callback_info->u.pLayerInfo) {
- return VK_ERROR_INITIALIZATION_FAILED;
- }
-
const auto gipa = create_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
const auto gdpa = create_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
if (!gipa || !gdpa) {
return VK_ERROR_INITIALIZATION_FAILED;
}
- create_info->u.pLayerInfo = create_info->u.pLayerInfo->pNext;
+ const_cast<VkLayerDeviceCreateInfo*>(create_info)->u.pLayerInfo =
+ create_info->u.pLayerInfo->pNext;
const auto physical_device_context =
layer_context.get_context(physical_device);
@@ -639,13 +653,38 @@ static VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(
return VK_SUCCESS;
}
+static VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures2(
+ VkPhysicalDevice physical_device, VkPhysicalDeviceFeatures2* pFeatures) {
+
+ const auto physical_context = layer_context.get_context(physical_device);
+ const auto& vtable = physical_context->instance.vtable;
+
+ vtable.GetPhysicalDeviceFeatures2(physical_device, pFeatures);
+
+ if (const auto feature = find_next<VkPhysicalDeviceAntiLagFeaturesAMD>(
+ pFeatures->pNext,
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD);
+ feature) {
+
+ feature->antiLag = true;
+ }
+}
+
+static VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures2KHR(
+ VkPhysicalDevice physical_device, VkPhysicalDeviceFeatures2KHR* pFeatures) {
+ // forward
+ return low_latency::GetPhysicalDeviceFeatures2(physical_device, pFeatures);
+}
+
static VKAPI_ATTR void VKAPI_CALL
AntiLagUpdateAMD(VkDevice device, const VkAntiLagDataAMD* pData) {
std::cerr << "low_latency::AntiLagUpdateAMD\n";
std::cerr << " maxFPS: " << pData->maxFPS << '\n';
std::cerr << " mode: " << pData->mode << '\n';
- std::cerr << " pPresentInfo: " << pData->pPresentationInfo->frameIndex << '\n';
- std::cerr << " frameIndex: " << pData->pPresentationInfo->frameIndex << '\n';
+ std::cerr << " pPresentInfo: " << pData->pPresentationInfo->frameIndex
+ << '\n';
+ std::cerr << " frameIndex: " << pData->pPresentationInfo->frameIndex
+ << '\n';
std::cerr << " stage: " << pData->pPresentationInfo->stage << '\n';
}
@@ -668,6 +707,11 @@ static const auto instance_functions = func_map_t{
HOOK_ENTRY("vkEnumerateDeviceExtensionProperties",
low_latency::EnumerateDeviceExtensionProperties),
+
+ HOOK_ENTRY("vkGetPhysicalDeviceFeatures2",
+ low_latency::GetPhysicalDeviceFeatures2),
+ HOOK_ENTRY("vkGetPhysicalDeviceFeatures2KHR",
+ low_latency::GetPhysicalDeviceFeatures2KHR),
};
static const auto device_functions = func_map_t{