diff --git a/test_conformance/common/vulkan_wrapper/vulkan_api_list.hpp b/test_conformance/common/vulkan_wrapper/vulkan_api_list.hpp index a474102d..b1f1b8c9 100644 --- a/test_conformance/common/vulkan_wrapper/vulkan_api_list.hpp +++ b/test_conformance/common/vulkan_wrapper/vulkan_api_list.hpp @@ -104,7 +104,8 @@ VK_FUNC_DECL(vkGetImageSubresourceLayout) \ VK_FUNC_DECL(vkCreateDebugUtilsMessengerEXT) \ VK_FUNC_DECL(vkDestroyDebugUtilsMessengerEXT) \ - VK_FUNC_DECL(vkGetPhysicalDeviceExternalBufferProperties) + VK_FUNC_DECL(vkGetPhysicalDeviceExternalBufferProperties) \ + VK_FUNC_DECL(vkGetPhysicalDeviceFeatures2) #define VK_WINDOWS_FUNC_LIST \ VK_FUNC_DECL(vkGetMemoryWin32HandleKHR) \ VK_FUNC_DECL(vkGetSemaphoreWin32HandleKHR) \ @@ -209,5 +210,6 @@ #define vkDestroyDebugUtilsMessengerEXT _vkDestroyDebugUtilsMessengerEXT #define vkGetPhysicalDeviceExternalBufferProperties \ _vkGetPhysicalDeviceExternalBufferProperties +#define vkGetPhysicalDeviceFeatures2 _vkGetPhysicalDeviceFeatures2 #endif //_vulkan_api_list_hpp_ diff --git a/test_conformance/common/vulkan_wrapper/vulkan_wrapper.cpp b/test_conformance/common/vulkan_wrapper/vulkan_wrapper.cpp index 7254742d..e1c81086 100644 --- a/test_conformance/common/vulkan_wrapper/vulkan_wrapper.cpp +++ b/test_conformance/common/vulkan_wrapper/vulkan_wrapper.cpp @@ -147,6 +147,7 @@ VulkanInstance::VulkanInstance(bool useValidationLayers) // return WAIVED; } + VK_GET_NULL_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceFeatures2); VK_GET_NULL_INSTANCE_PROC_ADDR(vkEnumerateInstanceVersion); VK_GET_NULL_INSTANCE_PROC_ADDR(vkEnumerateInstanceLayerProperties); VK_GET_NULL_INSTANCE_PROC_ADDR(vkCreateInstance); @@ -612,7 +613,8 @@ VulkanDevice::VulkanDevice(const VulkanDevice &device) VulkanDevice::VulkanDevice( const VulkanPhysicalDevice &physicalDevice, - const VulkanQueueFamilyToQueueCountMap &queueFamilyToQueueCountMap) + const VulkanQueueFamilyToQueueCountMap &queueFamilyToQueueCountMap, + bool useShaderInt8) : m_physicalDevice(physicalDevice), m_vkDevice(NULL) { uint32_t maxQueueCount = 0; @@ -676,7 +678,55 @@ VulkanDevice::VulkanDevice( enabledExtensionNameList.data(); vkDeviceCreateInfo.pEnabledFeatures = NULL; - vkCreateDevice(physicalDevice, &vkDeviceCreateInfo, NULL, &m_vkDevice); + if (useShaderInt8) + { + VkPhysicalDeviceShaderFloat16Int8Features int8Features{}; + int8Features.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES; + + VkPhysicalDevice8BitStorageFeatures storage8Features{}; + storage8Features.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES; + + int8Features.pNext = &storage8Features; + + VkPhysicalDeviceFeatures2 features2{}; + features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; + features2.pNext = &int8Features; + + vkGetPhysicalDeviceFeatures2(physicalDevice, &features2); + + if (!int8Features.shaderInt8 + || !storage8Features.storageBuffer8BitAccess) + { + throw std::runtime_error("shaderInt8 not supported!\n"); + } + + VkPhysicalDevice8BitStorageFeatures storage8Enable{}; + storage8Enable.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES; + storage8Enable.storageBuffer8BitAccess = VK_TRUE; + + VkPhysicalDeviceShaderFloat16Int8Features int8Enable{}; + int8Enable.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES; + int8Enable.shaderInt8 = VK_TRUE; + int8Enable.pNext = &storage8Enable; + + vkDeviceCreateInfo.pNext = &int8Enable; + + enabledExtensionNameList.push_back(VK_KHR_8BIT_STORAGE_EXTENSION_NAME); + vkDeviceCreateInfo.ppEnabledExtensionNames = + enabledExtensionNameList.data(); + vkDeviceCreateInfo.enabledExtensionCount = + (uint32_t)enabledExtensionNameList.size(); + + vkCreateDevice(physicalDevice, &vkDeviceCreateInfo, NULL, &m_vkDevice); + } + else + { + vkCreateDevice(physicalDevice, &vkDeviceCreateInfo, NULL, &m_vkDevice); + } for (uint32_t qfIdx = 0; qfIdx < (uint32_t)m_physicalDevice.getQueueFamilyList().size(); diff --git a/test_conformance/common/vulkan_wrapper/vulkan_wrapper.hpp b/test_conformance/common/vulkan_wrapper/vulkan_wrapper.hpp index 9cb031f5..fb707963 100644 --- a/test_conformance/common/vulkan_wrapper/vulkan_wrapper.hpp +++ b/test_conformance/common/vulkan_wrapper/vulkan_wrapper.hpp @@ -148,7 +148,8 @@ public: VulkanDevice( const VulkanPhysicalDevice &physicalDevice = getVulkanPhysicalDevice(), const VulkanQueueFamilyToQueueCountMap &queueFamilyToQueueCountMap = - getDefaultVulkanQueueFamilyToQueueCountMap()); + getDefaultVulkanQueueFamilyToQueueCountMap(), + bool useShaderInt8 = false); virtual ~VulkanDevice(); const VulkanPhysicalDevice &getPhysicalDevice() const; VulkanQueue & diff --git a/test_conformance/vulkan/test_vulkan_interop_buffer.cpp b/test_conformance/vulkan/test_vulkan_interop_buffer.cpp index e39641f1..23578e06 100644 --- a/test_conformance/vulkan/test_vulkan_interop_buffer.cpp +++ b/test_conformance/vulkan/test_vulkan_interop_buffer.cpp @@ -1586,7 +1586,7 @@ struct BufferTestBase : public VulkanTestBase { BufferTestBase(cl_device_id device, cl_context context, cl_command_queue queue, cl_int nelems) - : VulkanTestBase(device, context, queue, nelems) + : VulkanTestBase(device, context, queue, nelems, true) {} int test_buffer_common(bool use_fence) diff --git a/test_conformance/vulkan/vulkan_test_base.h b/test_conformance/vulkan/vulkan_test_base.h index 8c7b07cc..1e3f8e2f 100644 --- a/test_conformance/vulkan/vulkan_test_base.h +++ b/test_conformance/vulkan/vulkan_test_base.h @@ -37,11 +37,13 @@ inline void params_reset() struct VulkanTestBase { VulkanTestBase(cl_device_id device, cl_context context, - cl_command_queue queue, cl_int nelems) + cl_command_queue queue, cl_int nelems, + bool useShaderInt8 = false) : device(device), context(context), num_elems(nelems) { vkDevice.reset(new VulkanDevice( - getAssociatedVulkanPhysicalDevice(device, useValidationLayers))); + getAssociatedVulkanPhysicalDevice(device, useValidationLayers), + getDefaultVulkanQueueFamilyToQueueCountMap(), useShaderInt8)); cl_platform_id platform; cl_int error = clGetDeviceInfo(device, CL_DEVICE_PLATFORM,