Handle extension promotion to core when detecting enabled extensions

This commit is contained in:
baldurk
2018-04-24 14:41:59 +01:00
parent 94548886eb
commit 8b2d943556
3 changed files with 77 additions and 52 deletions
+4 -2
View File
@@ -39,7 +39,7 @@ void InitReplayTables(void *vulkanModule);
struct InstanceDeviceInfo
{
#undef CheckExt
#define CheckExt(name) ext_##name = false;
#define CheckExt(name, ver) ext_##name = false;
InstanceDeviceInfo()
{
CheckDeviceExts();
@@ -47,7 +47,9 @@ struct InstanceDeviceInfo
}
#undef CheckExt
#define CheckExt(name) bool ext_##name;
#define CheckExt(name, ver) bool ext_##name;
int vulkanVersion = VK_API_VERSION_1_0;
CheckDeviceExts();
CheckInstanceExts();
+39 -33
View File
@@ -26,6 +26,12 @@
#include "official/vk_layer.h"
// extensions made core in 1.1
#define VK11 VK_MAKE_VERSION(1, 1, 0)
// extensions that are not core in any version
#define VKXX VK_MAKE_VERSION(999, 999, 0)
#if defined(VK_USE_PLATFORM_WIN32_KHR)
#define HookInitInstance_PlatformSpecific() \
@@ -268,40 +274,40 @@
// for simplicity and since the check itself is platform agnostic,
// these aren't protected in platform defines
#define CheckInstanceExts() \
CheckExt(VK_KHR_xlib_surface); \
CheckExt(VK_KHR_xcb_surface); \
CheckExt(VK_KHR_win32_surface); \
CheckExt(VK_KHR_android_surface); \
CheckExt(VK_KHR_surface); \
CheckExt(VK_EXT_debug_report); \
CheckExt(VK_KHR_display); \
CheckExt(VK_NV_external_memory_capabilities); \
CheckExt(VK_KHR_get_physical_device_properties2); \
CheckExt(VK_EXT_display_surface_counter); \
CheckExt(VK_EXT_direct_mode_display); \
CheckExt(VK_EXT_acquire_xlib_display); \
CheckExt(VK_KHR_external_memory_capabilities); \
CheckExt(VK_KHR_external_semaphore_capabilities);
#define CheckInstanceExts() \
CheckExt(VK_KHR_xlib_surface, VKXX); \
CheckExt(VK_KHR_xcb_surface, VKXX); \
CheckExt(VK_KHR_win32_surface, VKXX); \
CheckExt(VK_KHR_android_surface, VKXX); \
CheckExt(VK_KHR_surface, VKXX); \
CheckExt(VK_EXT_debug_report, VKXX); \
CheckExt(VK_KHR_display, VKXX); \
CheckExt(VK_NV_external_memory_capabilities, VKXX); \
CheckExt(VK_KHR_get_physical_device_properties2, VK11); \
CheckExt(VK_EXT_display_surface_counter, VKXX); \
CheckExt(VK_EXT_direct_mode_display, VKXX); \
CheckExt(VK_EXT_acquire_xlib_display, VKXX); \
CheckExt(VK_KHR_external_memory_capabilities, VK11); \
CheckExt(VK_KHR_external_semaphore_capabilities, VK11);
#define CheckDeviceExts() \
CheckExt(VK_EXT_debug_marker); \
CheckExt(VK_KHR_swapchain); \
CheckExt(VK_KHR_display_swapchain); \
CheckExt(VK_NV_external_memory); \
CheckExt(VK_NV_external_memory_win32); \
CheckExt(VK_NV_win32_keyed_mutex); \
CheckExt(VK_KHR_maintenance1); \
CheckExt(VK_EXT_display_control); \
CheckExt(VK_KHR_external_memory); \
CheckExt(VK_KHR_external_memory_win32); \
CheckExt(VK_KHR_external_memory_fd); \
CheckExt(VK_KHR_external_semaphore); \
CheckExt(VK_KHR_external_semaphore_win32); \
CheckExt(VK_KHR_external_semaphore_fd); \
CheckExt(VK_KHR_get_memory_requirements2); \
CheckExt(VK_AMD_shader_info); \
CheckExt(VK_KHR_push_descriptor);
#define CheckDeviceExts() \
CheckExt(VK_EXT_debug_marker, VKXX); \
CheckExt(VK_KHR_swapchain, VKXX); \
CheckExt(VK_KHR_display_swapchain, VKXX); \
CheckExt(VK_NV_external_memory, VKXX); \
CheckExt(VK_NV_external_memory_win32, VKXX); \
CheckExt(VK_NV_win32_keyed_mutex, VKXX); \
CheckExt(VK_KHR_maintenance1, VK11); \
CheckExt(VK_EXT_display_control, VKXX); \
CheckExt(VK_KHR_external_memory, VK11); \
CheckExt(VK_KHR_external_memory_win32, VKXX); \
CheckExt(VK_KHR_external_memory_fd, VKXX); \
CheckExt(VK_KHR_external_semaphore, VK11); \
CheckExt(VK_KHR_external_semaphore_win32, VKXX); \
CheckExt(VK_KHR_external_semaphore_fd, VKXX); \
CheckExt(VK_KHR_get_memory_requirements2, VK11); \
CheckExt(VK_AMD_shader_info, VKXX); \
CheckExt(VK_KHR_push_descriptor, VKXX);
#define HookInitVulkanInstanceExts() \
HookInitExtension(VK_KHR_surface, DestroySurfaceKHR); \
@@ -234,6 +234,9 @@ ReplayStatus WrappedVulkan::Initialise(VkInitParams &params, uint64_t sectionVer
extscstr,
};
if(params.APIVersion >= VK_API_VERSION_1_0)
renderdocAppInfo.apiVersion = params.APIVersion;
m_Instance = VK_NULL_HANDLE;
VkResult ret = GetInstanceDispatchTable(NULL)->CreateInstance(&instinfo, NULL, &m_Instance);
@@ -241,10 +244,10 @@ ReplayStatus WrappedVulkan::Initialise(VkInitParams &params, uint64_t sectionVer
InstanceDeviceInfo extInfo;
#undef CheckExt
#define CheckExt(name) \
if(!strcmp(instinfo.ppEnabledExtensionNames[i], #name)) \
{ \
extInfo.ext_##name = true; \
#define CheckExt(name, ver) \
if(!strcmp(instinfo.ppEnabledExtensionNames[i], #name) || (int)renderdocAppInfo.apiVersion >= ver) \
{ \
extInfo.ext_##name = true; \
}
for(uint32_t i = 0; i < instinfo.enabledExtensionCount; i++)
@@ -409,9 +412,15 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo
modifiedCreateInfo.ppEnabledExtensionNames = addedExts;
// override applicationInfo with RenderDoc's, but preserve apiVersion
if(modifiedCreateInfo.pApplicationInfo)
{
modifiedCreateInfo.pApplicationInfo = &renderdocAppInfo;
if(modifiedCreateInfo.pApplicationInfo->apiVersion >= VK_API_VERSION_1_0)
renderdocAppInfo.apiVersion = modifiedCreateInfo.pApplicationInfo->apiVersion;
}
VkResult ret = createFunc(&modifiedCreateInfo, pAllocator, pInstance);
m_Instance = *pInstance;
@@ -430,11 +439,17 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo
record->instDevInfo = new InstanceDeviceInfo();
record->instDevInfo->vulkanVersion = VK_API_VERSION_1_0;
if(renderdocAppInfo.apiVersion > VK_API_VERSION_1_0)
record->instDevInfo->vulkanVersion = renderdocAppInfo.apiVersion;
#undef CheckExt
#define CheckExt(name) \
if(!strcmp(modifiedCreateInfo.ppEnabledExtensionNames[i], #name)) \
{ \
record->instDevInfo->ext_##name = true; \
#define CheckExt(name, ver) \
if(!strcmp(modifiedCreateInfo.ppEnabledExtensionNames[i], #name) || \
record->instDevInfo->vulkanVersion >= ver) \
{ \
record->instDevInfo->ext_##name = true; \
}
for(uint32_t i = 0; i < modifiedCreateInfo.enabledExtensionCount; i++)
@@ -1207,10 +1222,11 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi
InstanceDeviceInfo extInfo;
#undef CheckExt
#define CheckExt(name) \
if(!strcmp(createInfo.ppEnabledExtensionNames[i], #name)) \
{ \
extInfo.ext_##name = true; \
#define CheckExt(name, ver) \
if(!strcmp(createInfo.ppEnabledExtensionNames[i], #name) || \
(int)renderdocAppInfo.apiVersion >= ver) \
{ \
extInfo.ext_##name = true; \
}
for(uint32_t i = 0; i < createInfo.enabledExtensionCount; i++)
@@ -1507,7 +1523,7 @@ VkResult WrappedVulkan::vkCreateDevice(VkPhysicalDevice physicalDevice,
record->instDevInfo = new InstanceDeviceInfo();
#undef CheckExt
#define CheckExt(name) \
#define CheckExt(name, ver) \
record->instDevInfo->ext_##name = GetRecord(m_Instance)->instDevInfo->ext_##name;
// inherit extension enablement from instance, that way GetDeviceProcAddress can check
@@ -1515,10 +1531,11 @@ VkResult WrappedVulkan::vkCreateDevice(VkPhysicalDevice physicalDevice,
CheckInstanceExts();
#undef CheckExt
#define CheckExt(name) \
if(!strcmp(createInfo.ppEnabledExtensionNames[i], #name)) \
{ \
record->instDevInfo->ext_##name = true; \
#define CheckExt(name, ver) \
if(!strcmp(createInfo.ppEnabledExtensionNames[i], #name) || \
GetRecord(m_Instance)->instDevInfo->vulkanVersion >= ver) \
{ \
record->instDevInfo->ext_##name = true; \
}
for(uint32_t i = 0; i < createInfo.enabledExtensionCount; i++)