/* * Copyright (c) 2021 The Khronos Group Inc. * Copyright (c) 2021 Valve Corporation * Copyright (c) 2021 LunarG, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and/or associated documentation files (the "Materials"), to * deal in the Materials without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Materials, and to permit persons to whom the Materials are * furnished to do so, subject to the following conditions: * * The above copyright notice(s) and this permission notice shall be included in * all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE * USE OR OTHER DEALINGS IN THE MATERIALS. * * Author: Charles Giessen */ #include "test_environment.h" class UnknownExtension : public ::testing::Test { protected: virtual void SetUp() { env = std::unique_ptr(new FrameworkEnvironment()); env->add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)); } virtual void TearDown() { env.reset(); } std::unique_ptr env; }; /* Creates a TestICD with a function unknown to the loader called vkNotRealFuncTEST. The TestICD, when vk_icdGetPhysicalDeviceProcAddr is called, will return the custom_physical_device_function if the function name matches vkNotRealFuncTEST. The test then calls the function to verify that the unknown physical device function dispatching is working correctly. */ VkResult custom_physical_device_function(VkPhysicalDevice device, int foo, int bar) { return VK_SUCCESS; } using PFN_custom_physical_device_function = decltype(&custom_physical_device_function); TEST_F(UnknownExtension, ICDKnownExtension) { auto& driver = env->get_test_icd(); const char* fake_function_name = "vkNotRealFuncTEST"; driver.physical_devices.emplace_back("physical_device_0"); driver.custom_physical_device_functions.push_back( VulkanFunction{fake_function_name, reinterpret_cast(custom_physical_device_function)}); InstWrapper inst{env->vulkan_functions}; inst.CheckCreate(); VkPhysicalDevice phys_dev = inst.GetPhysDev(); PFN_custom_physical_device_function returned_func = reinterpret_cast( env->vulkan_functions.vkGetInstanceProcAddr(inst.inst, fake_function_name)); ASSERT_NE(returned_func, nullptr); ASSERT_EQ(returned_func(phys_dev, 42, 58008), VK_SUCCESS); }