// 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(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 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); } */