Browse Source

proper usage of instance extension VK_KHR_get_physical_device_properties2, check fp16 and int8 feature

tags/20190611
nihuini 7 years ago
parent
commit
e59dc6fafe
2 changed files with 201 additions and 57 deletions
  1. +182
    -56
      src/gpu.cpp
  2. +19
    -1
      src/gpu.h

+ 182
- 56
src/gpu.cpp View File

@@ -43,6 +43,45 @@ static int g_default_gpu_index = -1;
// NOTE 8 is large enough i think ...
static GpuInfo g_gpu_infos[8];

int support_VK_KHR_get_physical_device_properties2 = 0;
int support_VK_EXT_debug_utils = 0;

// VK_KHR_get_physical_device_properties2
PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR = 0;
PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR = 0;
PFN_vkGetPhysicalDeviceFormatProperties2KHR vkGetPhysicalDeviceFormatProperties2KHR = 0;
PFN_vkGetPhysicalDeviceImageFormatProperties2KHR vkGetPhysicalDeviceImageFormatProperties2KHR = 0;
PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR = 0;
PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR = 0;
PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR = 0;

// compile with old vulkan sdk
#if VK_HEADER_VERSION < 95
#define VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR (VkStructureType)1000082000
typedef struct VkPhysicalDeviceFloat16Int8FeaturesKHR {
VkStructureType sType;
void* pNext;
VkBool32 shaderFloat16;
VkBool32 shaderInt8;
} VkPhysicalDeviceFloat16Int8FeaturesKHR;
#endif // VK_HEADER_VERSION < 95

static int init_instance_extension()
{
if (support_VK_KHR_get_physical_device_properties2)
{
vkGetPhysicalDeviceFeatures2KHR = (PFN_vkGetPhysicalDeviceFeatures2KHR)vkGetInstanceProcAddr(g_instance, "vkGetPhysicalDeviceFeatures2KHR");
vkGetPhysicalDeviceProperties2KHR = (PFN_vkGetPhysicalDeviceProperties2KHR)vkGetInstanceProcAddr(g_instance, "vkGetPhysicalDeviceProperties2KHR");
vkGetPhysicalDeviceFormatProperties2KHR = (PFN_vkGetPhysicalDeviceFormatProperties2KHR)vkGetInstanceProcAddr(g_instance, "vkGetPhysicalDeviceFormatProperties2KHR");
vkGetPhysicalDeviceImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR)vkGetInstanceProcAddr(g_instance, "vkGetPhysicalDeviceImageFormatProperties2KHR");
vkGetPhysicalDeviceQueueFamilyProperties2KHR = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR)vkGetInstanceProcAddr(g_instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR");
vkGetPhysicalDeviceMemoryProperties2KHR = (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vkGetInstanceProcAddr(g_instance, "vkGetPhysicalDeviceMemoryProperties2KHR");
vkGetPhysicalDeviceSparseImageFormatProperties2KHR = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)vkGetInstanceProcAddr(g_instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
}

return 0;
}

#if ENABLE_VALIDATION_LAYER
static VkDebugUtilsMessengerEXT callback;

@@ -319,23 +358,26 @@ int create_gpu_instance()
return -1;
}

support_VK_KHR_get_physical_device_properties2 = 0;
support_VK_EXT_debug_utils = 0;
for (uint32_t j=0; j<instanceExtensionPropertyCount; j++)
{
const VkExtensionProperties& exp = instanceExtensionProperties[j];
// fprintf(stderr, "instance extension %s = %u\n", exp.extensionName, exp.specVersion);

if (strcmp(exp.extensionName, "VK_KHR_get_physical_device_properties2") == 0)
{
enabledExtensions.push_back("VK_KHR_get_physical_device_properties2");
}
#if ENABLE_VALIDATION_LAYER
support_VK_KHR_get_physical_device_properties2 = exp.specVersion;
if (strcmp(exp.extensionName, "VK_EXT_debug_utils") == 0)
{
enabledExtensions.push_back("VK_EXT_debug_utils");
}
#endif // ENABLE_VALIDATION_LAYER
support_VK_EXT_debug_utils = exp.specVersion;
}

if (support_VK_KHR_get_physical_device_properties2)
enabledExtensions.push_back("VK_KHR_get_physical_device_properties2");
#if ENABLE_VALIDATION_LAYER
if (support_VK_EXT_debug_utils)
enabledExtensions.push_back("VK_EXT_debug_utils");
#endif // ENABLE_VALIDATION_LAYER

VkApplicationInfo applicationInfo;
applicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
applicationInfo.pNext = 0;
@@ -363,20 +405,25 @@ int create_gpu_instance()
}

#if ENABLE_VALIDATION_LAYER
VkDebugUtilsMessengerCreateInfoEXT createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
createInfo.pfnUserCallback = debugCallback;
createInfo.pUserData = 0;
ret = CreateDebugUtilsMessengerEXT(g_instance, &createInfo, nullptr, &callback);
if (ret != VK_SUCCESS)
{
fprintf(stderr, "CreateDebugUtilsMessengerEXT failed %d\n", ret);
return -1;
if (support_VK_EXT_debug_utils)
{
VkDebugUtilsMessengerCreateInfoEXT createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
createInfo.pfnUserCallback = debugCallback;
createInfo.pUserData = 0;
ret = CreateDebugUtilsMessengerEXT(g_instance, &createInfo, NULL, &callback);
if (ret != VK_SUCCESS)
{
fprintf(stderr, "CreateDebugUtilsMessengerEXT failed %d\n", ret);
return -1;
}
}
#endif // ENABLE_VALIDATION_LAYER

init_instance_extension();

uint32_t physicalDeviceCount = 0;
ret = vkEnumeratePhysicalDevices(g_instance, &physicalDeviceCount, 0);
if (ret != VK_SUCCESS)
@@ -476,15 +523,6 @@ int create_gpu_instance()
// fprintf(stderr, "[%u] memory_map_alignment = %lu\n", i, gpu_info.memory_map_alignment);
// fprintf(stderr, "[%u] buffer_offset_alignment = %lu\n", i, gpu_info.buffer_offset_alignment);

// // TODO check features
// VkPhysicalDeviceFeatures features;
// vkGetPhysicalDeviceFeatures(physicalDevice, &features);
//
// // TODO check formatProperties
// VkFormat format = VK_FORMAT_R32_SFLOAT;
// VkFormatProperties formatProperties;
// vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &formatProperties);

// find compute queue
uint32_t queueFamilyPropertiesCount;
vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamilyPropertiesCount, 0);
@@ -552,7 +590,6 @@ int create_gpu_instance()
gpu_info.support_VK_KHR_dedicated_allocation = 0;
gpu_info.support_VK_KHR_descriptor_update_template = 0;
gpu_info.support_VK_KHR_get_memory_requirements2 = 0;
gpu_info.support_VK_KHR_get_physical_device_properties2 = 0;
gpu_info.support_VK_KHR_push_descriptor = 0;
gpu_info.support_VK_KHR_shader_float16_int8 = 0;
gpu_info.support_VK_KHR_shader_float_controls = 0;
@@ -574,8 +611,6 @@ int create_gpu_instance()
gpu_info.support_VK_KHR_descriptor_update_template = exp.specVersion;
else if (strcmp(exp.extensionName, "VK_KHR_get_memory_requirements2") == 0)
gpu_info.support_VK_KHR_get_memory_requirements2 = exp.specVersion;
else if (strcmp(exp.extensionName, "VK_KHR_get_physical_device_properties2") == 0)
gpu_info.support_VK_KHR_get_physical_device_properties2 = exp.specVersion;
else if (strcmp(exp.extensionName, "VK_KHR_push_descriptor") == 0)
gpu_info.support_VK_KHR_push_descriptor = exp.specVersion;
else if (strcmp(exp.extensionName, "VK_KHR_shader_float16_int8") == 0)
@@ -586,22 +621,79 @@ int create_gpu_instance()
gpu_info.support_VK_KHR_storage_buffer_storage_class = exp.specVersion;
}

// fprintf(stderr, "[%u] VK_KHR_8bit_storage = %d\n", i, gpu_info.support_VK_KHR_8bit_storage);
// fprintf(stderr, "[%u] VK_KHR_16bit_storage = %d\n", i, gpu_info.support_VK_KHR_16bit_storage);
// fprintf(stderr, "[%u] VK_KHR_bind_memory2 = %d\n", i, gpu_info.support_VK_KHR_bind_memory2);
// fprintf(stderr, "[%u] VK_KHR_dedicated_allocation = %d\n", i, gpu_info.support_VK_KHR_dedicated_allocation);
// fprintf(stderr, "[%u] VK_KHR_descriptor_update_template = %d\n", i, gpu_info.support_VK_KHR_descriptor_update_template);
// fprintf(stderr, "[%u] VK_KHR_get_memory_requirements2 = %d\n", i, gpu_info.support_VK_KHR_get_memory_requirements2);
// fprintf(stderr, "[%u] VK_KHR_get_physical_device_properties2 = %d\n", i, gpu_info.support_VK_KHR_get_physical_device_properties2);
// fprintf(stderr, "[%u] VK_KHR_push_descriptor = %d\n", i, gpu_info.support_VK_KHR_push_descriptor);
// fprintf(stderr, "[%u] VK_KHR_shader_float16_int8 = %d\n", i, gpu_info.support_VK_KHR_shader_float16_int8);
// fprintf(stderr, "[%u] VK_KHR_shader_float_controls = %d\n", i, gpu_info.support_VK_KHR_shader_float_controls);
// fprintf(stderr, "[%u] VK_KHR_storage_buffer_storage_class = %d\n", i, gpu_info.support_VK_KHR_storage_buffer_storage_class);
// check features
gpu_info.fp16_storage = false;
gpu_info.fp16_arithmetic = false;
gpu_info.int8_storage = false;
gpu_info.int8_arithmetic = false;
if (support_VK_KHR_get_physical_device_properties2)
{
void* queryExtensionFeatures = 0;

// query int8 storage
VkPhysicalDevice8BitStorageFeaturesKHR query8BitStorageFeatures;
query8BitStorageFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR;
query8BitStorageFeatures.pNext = 0;
if (gpu_info.support_VK_KHR_8bit_storage)
{
query8BitStorageFeatures.pNext = queryExtensionFeatures;
queryExtensionFeatures = &query8BitStorageFeatures;
}

// query fp16/int16 storage
VkPhysicalDevice16BitStorageFeaturesKHR query16BitStorageFeatures;
query16BitStorageFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR;
query16BitStorageFeatures.pNext = 0;
if (gpu_info.support_VK_KHR_16bit_storage)
{
query16BitStorageFeatures.pNext = queryExtensionFeatures;
queryExtensionFeatures = &query16BitStorageFeatures;
}

// query fp16/int8 arithmetic
VkPhysicalDeviceFloat16Int8FeaturesKHR queryFloat16Int8Features;
queryFloat16Int8Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR;
queryFloat16Int8Features.pNext = 0;
if (gpu_info.support_VK_KHR_shader_float16_int8)
{
queryFloat16Int8Features.pNext = queryExtensionFeatures;
queryExtensionFeatures = &queryFloat16Int8Features;
}

VkPhysicalDeviceFeatures2KHR queryFeatures;
queryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR,
queryFeatures.pNext = queryExtensionFeatures;

vkGetPhysicalDeviceFeatures2KHR(physicalDevice, &queryFeatures);

if (gpu_info.support_VK_KHR_8bit_storage)
{
gpu_info.int8_storage = query8BitStorageFeatures.storageBuffer8BitAccess;
}
if (gpu_info.support_VK_KHR_16bit_storage)
{
gpu_info.fp16_storage = query16BitStorageFeatures.storageBuffer16BitAccess;
}
if (gpu_info.support_VK_KHR_shader_float16_int8)
{
gpu_info.int8_arithmetic = queryFloat16Int8Features.shaderFloat16;
gpu_info.fp16_arithmetic = queryFloat16Int8Features.shaderInt8;
}
}
else
{
// // TODO
// VkPhysicalDeviceFeatures features;
// vkGetPhysicalDeviceFeatures(physicalDevice, &features);
}

fprintf(stderr, "[%u %s] queueC=%u queueT=%u memU=%u memDL=%u memHV=%u\n", i, physicalDeviceProperties.deviceName,
gpu_info.compute_queue_index, gpu_info.transfer_queue_index,
gpu_info.unified_memory_index, gpu_info.device_local_memory_index, gpu_info.host_visible_memory_index);

fprintf(stderr, "[%u %s] fp16s=%d fp16a=%d int8s=%d int8a=%d\n", i, physicalDeviceProperties.deviceName,
gpu_info.fp16_storage, gpu_info.fp16_arithmetic, gpu_info.int8_storage, gpu_info.int8_arithmetic);

gpu_info_index++;
}

@@ -616,7 +708,10 @@ int create_gpu_instance()
void destroy_gpu_instance()
{
#if ENABLE_VALIDATION_LAYER
DestroyDebugUtilsMessengerEXT(g_instance, callback, NULL);
if (support_VK_EXT_debug_utils)
{
DestroyDebugUtilsMessengerEXT(g_instance, callback, NULL);
}
#endif // ENABLE_VALIDATION_LAYER

vkDestroyInstance(g_instance, 0);
@@ -670,8 +765,6 @@ VulkanDevice::VulkanDevice(int device_index) : info(g_gpu_infos[device_index])
enabledExtensions.push_back("VK_KHR_descriptor_update_template");
if (info.support_VK_KHR_get_memory_requirements2)
enabledExtensions.push_back("VK_KHR_get_memory_requirements2");
if (info.support_VK_KHR_get_physical_device_properties2)
enabledExtensions.push_back("VK_KHR_get_physical_device_properties2");
if (info.support_VK_KHR_push_descriptor)
enabledExtensions.push_back("VK_KHR_push_descriptor");
if (info.support_VK_KHR_shader_float16_int8)
@@ -681,6 +774,49 @@ VulkanDevice::VulkanDevice(int device_index) : info(g_gpu_infos[device_index])
if (info.support_VK_KHR_storage_buffer_storage_class)
enabledExtensions.push_back("VK_KHR_storage_buffer_storage_class");

void* enabledExtensionFeatures = 0;
if (support_VK_KHR_get_physical_device_properties2)
{
// enable int8 storage
VkPhysicalDevice8BitStorageFeaturesKHR enabled8BitStorageFeatures;
enabled8BitStorageFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR;
enabled8BitStorageFeatures.pNext = 0;
enabled8BitStorageFeatures.storageBuffer8BitAccess = info.int8_storage;
enabled8BitStorageFeatures.uniformAndStorageBuffer8BitAccess = VK_FALSE;
enabled8BitStorageFeatures.storagePushConstant8 = VK_FALSE;
if (info.support_VK_KHR_8bit_storage)
{
enabled8BitStorageFeatures.pNext = enabledExtensionFeatures;
enabledExtensionFeatures = &enabled8BitStorageFeatures;
}

// enable fp16/int16 storage
VkPhysicalDevice16BitStorageFeaturesKHR enabled16BitStorageFeatures;
enabled16BitStorageFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR;
enabled16BitStorageFeatures.pNext = 0;
enabled16BitStorageFeatures.storageBuffer16BitAccess = info.fp16_storage;
enabled16BitStorageFeatures.uniformAndStorageBuffer16BitAccess = VK_FALSE;
enabled16BitStorageFeatures.storagePushConstant16 = VK_FALSE;
enabled16BitStorageFeatures.storageInputOutput16 = VK_FALSE;
if (info.support_VK_KHR_16bit_storage)
{
enabled16BitStorageFeatures.pNext = enabledExtensionFeatures;
enabledExtensionFeatures = &enabled16BitStorageFeatures;
}

// enable fp16/int8 arithmetic
VkPhysicalDeviceFloat16Int8FeaturesKHR enabledFloat16Int8Features;
enabledFloat16Int8Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR;
enabledFloat16Int8Features.pNext = 0;
enabledFloat16Int8Features.shaderFloat16 = info.fp16_arithmetic;
enabledFloat16Int8Features.shaderInt8 = info.int8_arithmetic;
if (info.support_VK_KHR_shader_float16_int8)
{
enabledFloat16Int8Features.pNext = enabledExtensionFeatures;
enabledExtensionFeatures = &enabledFloat16Int8Features;
}
}

VkDeviceQueueCreateInfo deviceQueueCreateInfos[2];
deviceQueueCreateInfos[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
deviceQueueCreateInfos[0].pNext = 0;
@@ -697,7 +833,7 @@ VulkanDevice::VulkanDevice(int device_index) : info(g_gpu_infos[device_index])

VkDeviceCreateInfo deviceCreateInfo;
deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
deviceCreateInfo.pNext = 0;
deviceCreateInfo.pNext = enabledExtensionFeatures;
deviceCreateInfo.flags = 0;
if (info.compute_queue_index == info.transfer_queue_index)
{
@@ -803,10 +939,6 @@ int VulkanDevice::init_device_extension()
vkCreateDescriptorUpdateTemplateKHR = (PFN_vkCreateDescriptorUpdateTemplateKHR)vkGetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplateKHR");
vkDestroyDescriptorUpdateTemplateKHR = (PFN_vkDestroyDescriptorUpdateTemplateKHR)vkGetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplateKHR");
vkUpdateDescriptorSetWithTemplateKHR = (PFN_vkUpdateDescriptorSetWithTemplateKHR)vkGetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplateKHR");

// fprintf(stderr, "vkCreateDescriptorUpdateTemplateKHR = %p\n", vkCreateDescriptorUpdateTemplateKHR);
// fprintf(stderr, "vkDestroyDescriptorUpdateTemplateKHR = %p\n", vkDestroyDescriptorUpdateTemplateKHR);
// fprintf(stderr, "vkUpdateDescriptorSetWithTemplateKHR = %p\n", vkUpdateDescriptorSetWithTemplateKHR);
}

if (info.support_VK_KHR_get_memory_requirements2)
@@ -814,10 +946,6 @@ int VulkanDevice::init_device_extension()
vkGetImageMemoryRequirements2KHR = (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(device, "vkGetImageMemoryRequirements2KHR");
vkGetBufferMemoryRequirements2KHR = (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(device, "vkGetBufferMemoryRequirements2KHR");
vkGetImageSparseMemoryRequirements2KHR = (PFN_vkGetImageSparseMemoryRequirements2KHR)vkGetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2KHR");

// fprintf(stderr, "vkGetImageMemoryRequirements2KHR = %p\n", vkGetImageMemoryRequirements2KHR);
// fprintf(stderr, "vkGetBufferMemoryRequirements2KHR = %p\n", vkGetBufferMemoryRequirements2KHR);
// fprintf(stderr, "vkGetImageSparseMemoryRequirements2KHR = %p\n", vkGetImageSparseMemoryRequirements2KHR);
}

if (info.support_VK_KHR_push_descriptor)
@@ -825,11 +953,9 @@ int VulkanDevice::init_device_extension()
if (info.support_VK_KHR_descriptor_update_template)
{
vkCmdPushDescriptorSetWithTemplateKHR = (PFN_vkCmdPushDescriptorSetWithTemplateKHR)vkGetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplateKHR");
// fprintf(stderr, "vkCmdPushDescriptorSetWithTemplateKHR = %p\n", vkCmdPushDescriptorSetWithTemplateKHR);
}

vkCmdPushDescriptorSetKHR = (PFN_vkCmdPushDescriptorSetKHR)vkGetDeviceProcAddr(device, "vkCmdPushDescriptorSetKHR");
// fprintf(stderr, "vkCmdPushDescriptorSetKHR = %p\n", vkCmdPushDescriptorSetKHR);
}

return 0;


+ 19
- 1
src/gpu.h View File

@@ -28,6 +28,19 @@ namespace ncnn {
int create_gpu_instance();
void destroy_gpu_instance();

// instance extension capability
extern int support_VK_KHR_get_physical_device_properties2;
extern int support_VK_EXT_debug_utils;

// VK_KHR_get_physical_device_properties2
extern PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR;
extern PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR;
extern PFN_vkGetPhysicalDeviceFormatProperties2KHR vkGetPhysicalDeviceFormatProperties2KHR;
extern PFN_vkGetPhysicalDeviceImageFormatProperties2KHR vkGetPhysicalDeviceImageFormatProperties2KHR;
extern PFN_vkGetPhysicalDeviceQueueFamilyProperties2KHR vkGetPhysicalDeviceQueueFamilyProperties2KHR;
extern PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR;
extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR vkGetPhysicalDeviceSparseImageFormatProperties2KHR;

// get info
int get_gpu_count();
int get_default_gpu_index();
@@ -67,6 +80,12 @@ public:
uint32_t device_local_memory_index;
uint32_t host_visible_memory_index;

// fp16 and int8 feature
bool fp16_storage;
bool fp16_arithmetic;
bool int8_storage;
bool int8_arithmetic;

// extension capability
int support_VK_KHR_8bit_storage;
int support_VK_KHR_16bit_storage;
@@ -74,7 +93,6 @@ public:
int support_VK_KHR_dedicated_allocation;
int support_VK_KHR_descriptor_update_template;
int support_VK_KHR_get_memory_requirements2;
int support_VK_KHR_get_physical_device_properties2;
int support_VK_KHR_push_descriptor;
int support_VK_KHR_shader_float16_int8;
int support_VK_KHR_shader_float_controls;


Loading…
Cancel
Save