| // Copyright 2018 The SwiftShader Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| // Vulkan unit tests that provide coverage for functionality not tested by |
| // the dEQP test suite. Also used as a smoke test. |
| |
| #include "Device.hpp" |
| #include "Driver.hpp" |
| |
| #include "gmock/gmock.h" |
| #include "gtest/gtest.h" |
| |
| class BasicTest : public testing::Test |
| { |
| protected: |
| static Driver driver; |
| |
| void SetUp() override |
| { |
| ASSERT_TRUE(driver.loadSwiftShader()); |
| } |
| |
| void TearDown() override |
| { |
| driver.unload(); |
| } |
| }; |
| |
| Driver BasicTest::driver; |
| |
| TEST_F(BasicTest, ICD_Check) |
| { |
| auto createInstance = driver.vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkCreateInstance"); |
| EXPECT_NE(createInstance, nullptr); |
| |
| auto enumerateInstanceExtensionProperties = |
| driver.vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkEnumerateInstanceExtensionProperties"); |
| EXPECT_NE(enumerateInstanceExtensionProperties, nullptr); |
| |
| auto enumerateInstanceLayerProperties = |
| driver.vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkEnumerateInstanceLayerProperties"); |
| EXPECT_NE(enumerateInstanceLayerProperties, nullptr); |
| |
| auto enumerateInstanceVersion = driver.vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "vkEnumerateInstanceVersion"); |
| EXPECT_NE(enumerateInstanceVersion, nullptr); |
| |
| auto bad_function = driver.vk_icdGetInstanceProcAddr(VK_NULL_HANDLE, "bad_function"); |
| EXPECT_EQ(bad_function, nullptr); |
| } |
| |
| TEST_F(BasicTest, Version) |
| { |
| uint32_t apiVersion = 0; |
| uint32_t expectedVersion = static_cast<uint32_t>(VK_API_VERSION_1_2); |
| VkResult result = driver.vkEnumerateInstanceVersion(&apiVersion); |
| EXPECT_EQ(apiVersion, expectedVersion); |
| |
| const VkInstanceCreateInfo createInfo = { |
| VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType |
| nullptr, // pNext |
| 0, // flags |
| nullptr, // pApplicationInfo |
| 0, // enabledLayerCount |
| nullptr, // ppEnabledLayerNames |
| 0, // enabledExtensionCount |
| nullptr, // ppEnabledExtensionNames |
| }; |
| VkInstance instance = VK_NULL_HANDLE; |
| result = driver.vkCreateInstance(&createInfo, nullptr, &instance); |
| EXPECT_EQ(result, VK_SUCCESS); |
| |
| ASSERT_TRUE(driver.resolve(instance)); |
| |
| uint32_t pPhysicalDeviceCount = 0; |
| result = driver.vkEnumeratePhysicalDevices(instance, &pPhysicalDeviceCount, nullptr); |
| EXPECT_EQ(result, VK_SUCCESS); |
| EXPECT_EQ(pPhysicalDeviceCount, 1U); |
| |
| VkPhysicalDevice pPhysicalDevice = VK_NULL_HANDLE; |
| result = driver.vkEnumeratePhysicalDevices(instance, &pPhysicalDeviceCount, &pPhysicalDevice); |
| EXPECT_EQ(result, VK_SUCCESS); |
| EXPECT_NE(pPhysicalDevice, (VkPhysicalDevice)VK_NULL_HANDLE); |
| |
| VkPhysicalDeviceProperties physicalDeviceProperties; |
| driver.vkGetPhysicalDeviceProperties(pPhysicalDevice, &physicalDeviceProperties); |
| EXPECT_EQ(physicalDeviceProperties.apiVersion, expectedVersion); |
| EXPECT_EQ(physicalDeviceProperties.deviceID, 0xC0DEU); |
| EXPECT_EQ(physicalDeviceProperties.deviceType, VK_PHYSICAL_DEVICE_TYPE_CPU); |
| |
| EXPECT_NE(strstr(physicalDeviceProperties.deviceName, "SwiftShader Device"), nullptr); |
| |
| VkPhysicalDeviceProperties2 physicalDeviceProperties2; |
| VkPhysicalDeviceDriverPropertiesKHR physicalDeviceDriverProperties; |
| physicalDeviceProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; |
| physicalDeviceProperties2.pNext = &physicalDeviceDriverProperties; |
| physicalDeviceDriverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR; |
| physicalDeviceDriverProperties.pNext = nullptr; |
| physicalDeviceDriverProperties.driverID = (VkDriverIdKHR)0; |
| driver.vkGetPhysicalDeviceProperties2(pPhysicalDevice, &physicalDeviceProperties2); |
| EXPECT_EQ(physicalDeviceDriverProperties.driverID, VK_DRIVER_ID_GOOGLE_SWIFTSHADER_KHR); |
| |
| driver.vkDestroyInstance(instance, nullptr); |
| } |
| /* |
| TEST_F(BasicTest, UnsupportedDeviceExtension_DISABLED) |
| { |
| uint32_t apiVersion = 0; |
| VkResult result = driver.vkEnumerateInstanceVersion(&apiVersion); |
| |
| const VkInstanceCreateInfo createInfo = { |
| VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType |
| nullptr, // pNext |
| 0, // flags |
| nullptr, // pApplicationInfo |
| 0, // enabledLayerCount |
| nullptr, // ppEnabledLayerNames |
| 0, // enabledExtensionCount |
| nullptr, // ppEnabledExtensionNames |
| }; |
| VkInstance instance = VK_NULL_HANDLE; |
| result = driver.vkCreateInstance(&createInfo, nullptr, &instance); |
| EXPECT_EQ(result, VK_SUCCESS); |
| |
| ASSERT_TRUE(driver.resolve(instance)); |
| |
| VkBaseInStructure unsupportedExt = { VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT, nullptr }; |
| |
| // Gather all physical devices |
| std::vector<VkPhysicalDevice> physicalDevices; |
| result = Device::GetPhysicalDevices(&driver, instance, physicalDevices); |
| EXPECT_EQ(result, VK_SUCCESS); |
| |
| // Inspect each physical device's queue families for compute support. |
| for(auto physicalDevice : physicalDevices) |
| { |
| int queueFamilyIndex = Device::GetComputeQueueFamilyIndex(&driver, physicalDevice); |
| if(queueFamilyIndex < 0) |
| { |
| continue; |
| } |
| |
| const float queuePrioritory = 1.0f; |
| const VkDeviceQueueCreateInfo deviceQueueCreateInfo = { |
| VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, // sType |
| nullptr, // pNext |
| 0, // flags |
| (uint32_t)queueFamilyIndex, // queueFamilyIndex |
| 1, // queueCount |
| &queuePrioritory, // pQueuePriorities |
| }; |
| |
| const VkDeviceCreateInfo deviceCreateInfo = { |
| VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, // sType |
| &unsupportedExt, // pNext |
| 0, // flags |
| 1, // queueCreateInfoCount |
| &deviceQueueCreateInfo, // pQueueCreateInfos |
| 0, // enabledLayerCount |
| nullptr, // ppEnabledLayerNames |
| 0, // enabledExtensionCount |
| nullptr, // ppEnabledExtensionNames |
| nullptr, // pEnabledFeatures |
| }; |
| |
| VkDevice device; |
| result = driver.vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device); |
| EXPECT_EQ(result, VK_SUCCESS); |
| driver.vkDestroyDevice(device, nullptr); |
| } |
| |
| driver.vkDestroyInstance(instance, nullptr); |
| } |
| */ |