VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName) { if (!strcmp("vkGetInstanceProcAddr", pName)) return (PFN_vkVoidFunction)vkGetInstanceProcAddr; if (!strcmp("vkEnumerateDeviceLayerProperties", pName)) return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties; if (!strcmp("vkEnumerateDeviceExtensionProperties", pName)) return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties; if (!strcmp("vkGetPhysicalDeviceFormatProperties", pName)) return (PFN_vkVoidFunction)basic_GetPhysicalDeviceFormatProperties; if (!strcmp("vkCreateInstance", pName)) return (PFN_vkVoidFunction)basic_CreateInstance; if (!strcmp("vkDestroyInstance", pName)) return (PFN_vkVoidFunction)basic_DestroyInstance; if (!strcmp("vkCreateDevice", pName)) return (PFN_vkVoidFunction)basic_CreateDevice; if (!strcmp("vkEnumeratePhysicalDevices", pName)) return (PFN_vkVoidFunction)basic_EnumeratePhysicalDevices; if (instance == NULL) return NULL; if (instance_dispatch_table(instance)->GetInstanceProcAddr == NULL) return NULL; return instance_dispatch_table(instance)->GetInstanceProcAddr(instance, pName); }
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetPhysicalDeviceProcAddr(VkInstance instance, const char *name) { if (!strcmp(name, "vkSetPhysicalDeviceLimitsEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceLimitsEXT; if (!strcmp(name, "vkGetOriginalPhysicalDeviceLimitsEXT")) return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceLimitsEXT; if (!strcmp(name, "vkSetPhysicalDeviceFormatPropertiesEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceFormatPropertiesEXT; if (!strcmp(name, "vkGetOriginalPhysicalDeviceFormatPropertiesEXT")) return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceFormatPropertiesEXT; if (instance_dispatch_table(instance)->GetPhysicalDeviceProcAddr == NULL) return NULL; return instance_dispatch_table(instance)->GetPhysicalDeviceProcAddr(instance, name); }
//----------------------------------------------------------------------------- /// Perform all profiler initialization. /// \param config A pointer to a profiler configuration structure. /// \returns The result code for initialization. //----------------------------------------------------------------------------- VkResult VktCmdBufProfiler::Init(const VktCmdBufProfilerConfig& config) ///< [in] Pointer to profiler configuration { VkResult result = VK_INCOMPLETE; if ((config.physicalDevice != VK_NULL_HANDLE) && (config.device != VK_NULL_HANDLE)) { memcpy(&m_config, &config, sizeof(m_config)); m_pInstanceDT = instance_dispatch_table(config.physicalDevice); m_pDeviceDT = device_dispatch_table(config.device); m_pInstanceDT->GetPhysicalDeviceMemoryProperties(config.physicalDevice, &m_memProps); m_pInstanceDT->GetPhysicalDeviceProperties(config.physicalDevice, &m_physicalDeviceProps); m_gpuTimestampFreq = 1000000000.0f / m_physicalDeviceProps.limits.timestampPeriod; m_maxQueriesPerGroup = m_config.measurementsPerGroup * ProfilerTimestampsPerMeasurement; ClearCmdBufData(); result = VK_SUCCESS; } return result; }
VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL basic_EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) { printf("At start of wrapped vkEnumeratePhysicalDevices() call w/ inst: %p\n", (void *)instance); VkResult result = instance_dispatch_table(instance)->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices); printf("Completed wrapped vkEnumeratePhysicalDevices() call w/ count %u\n", *pPhysicalDeviceCount); return result; }
//----------------------------------------------------------------------------- /// Get the physical device's timestamp frequency. //----------------------------------------------------------------------------- double VktWrappedQueue::GetTimestampFrequency() { VkPhysicalDeviceProperties deviceProps = {}; instance_dispatch_table(m_createInfo.physicalDevice)->GetPhysicalDeviceProperties(m_createInfo.physicalDevice, &deviceProps); return 1000000000.0f / (double)deviceProps.limits.timestampPeriod; }
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *name) { if (!strcmp(name, "vkCreateInstance")) return (PFN_vkVoidFunction)CreateInstance; if (!strcmp(name, "vkGetPhysicalDeviceProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceProperties; if (!strcmp(name, "vkGetPhysicalDeviceFormatProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties; if (!strcmp(name, "vkGetInstanceProcAddr")) return (PFN_vkVoidFunction)GetInstanceProcAddr; if (!strcmp(name, "vkEnumerateInstanceExtensionProperties")) return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties; if (!strcmp(name, "vkEnumerateInstanceLayerProperties")) return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties; if (!strcmp(name, "vkSetPhysicalDeviceLimitsEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceLimitsEXT; if (!strcmp(name, "vkGetOriginalPhysicalDeviceLimitsEXT")) return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceLimitsEXT; if (!strcmp(name, "vkSetPhysicalDeviceFormatPropertiesEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceFormatPropertiesEXT; if (!strcmp(name, "vkGetOriginalPhysicalDeviceFormatPropertiesEXT")) return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceFormatPropertiesEXT; assert(instance); if (instance_dispatch_table(instance)->GetInstanceProcAddr == NULL) return NULL; return instance_dispatch_table(instance)->GetInstanceProcAddr(instance, name); }
//----------------------------------------------------------------------------- /// Constructor /// \param createInfo Creation struct used to construct this wrapper. //----------------------------------------------------------------------------- VktWrappedQueue::VktWrappedQueue(const WrappedQueueCreateInfo& createInfo) { memcpy(&m_createInfo, &createInfo, sizeof(m_createInfo)); UINT queueCount = 1; VkQueueFamilyProperties queueProps = {}; instance_dispatch_table(m_createInfo.physicalDevice)->GetPhysicalDeviceQueueFamilyProperties(m_createInfo.physicalDevice, &queueCount, &queueProps); m_timestampsSupported = (queueProps.timestampValidBits != 0) ? true : false; }
VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { if (pLayerName == NULL) { return instance_dispatch_table(physicalDevice) ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); } else { return util_GetExtensionProperties(ARRAY_SIZE(basic_physicaldevice_extensions), basic_physicaldevice_extensions, pCount, pProperties); } }
VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL basic_GetPhysicalDeviceFormatProperties(VkPhysicalDevice gpu, VkFormat format, VkFormatProperties *pFormatInfo) { printf("At start of wrapped vkGetPhysicalDeviceFormatProperties() call w/ gpu: %p\n", (void *)gpu); instance_dispatch_table(gpu)->GetPhysicalDeviceFormatProperties(gpu, format, pFormatInfo); printf("Completed wrapped vkGetPhysicalDeviceFormatProperties() call w/ gpu: %p\n", (void *)gpu); }
/* hook DestroyInstance to remove tableInstanceMap entry */ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL basic_DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) { dispatch_key key = get_dispatch_key(instance); instance_dispatch_table(instance)->DestroyInstance(instance, pAllocator); destroy_instance_dispatch_table(key); }