/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2019 Danny Robson */ #include #include #include /////////////////////////////////////////////////////////////////////////////// // We need to ensure the tables are loaded before anything much gets called. // // Given we have a global vtable we'll install a default table that hooks the // function(s) that a client will call first off. This function will: // * find the various ICDs on the system, // * install a vtable that forwards calls by default, // * and then forwards the current call on to this newly installed vtable /////////////////////////////////////////////////////////////////////////////// static void setup_tables (void) { static auto libraries = cruft::vk::load::enumerate (); static cruft::vk::load::vendor v (libraries[0]); cruft::vk::load::i_table = &v.itable; cruft::vk::load::v_table = &v.vtable; } /////////////////////////////////////////////////////////////////////////////// static VkResult _vkCreateInstance ( const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance ) { setup_tables (); return cruft::vk::load::i_table->vkCreateInstance (pCreateInfo, pAllocator, pInstance); } //----------------------------------------------------------------------------- static PFN_vkVoidFunction _vkGetInstanceProcAddr (VkInstance instance,const char* pName) { setup_tables (); return cruft::vk::load::i_table->vkGetInstanceProcAddr (instance, pName); } //----------------------------------------------------------------------------- VkResult _vkEnumerateInstanceExtensionProperties ( const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties ) { setup_tables (); return cruft::vk::load::i_table->vkEnumerateInstanceExtensionProperties ( pLayerName, pPropertyCount, pProperties ); } //----------------------------------------------------------------------------- static cruft::vk::load::instance_table const _initialiser { .vkCreateInstance = _vkCreateInstance, .vkGetInstanceProcAddr = _vkGetInstanceProcAddr, .vkEnumerateInstanceExtensionProperties = _vkEnumerateInstanceExtensionProperties, }; cruft::vk::load::instance_table const *cruft::vk::load::i_table = &_initialiser; /////////////////////////////////////////////////////////////////////////////// static void* _vk_icdGetInstanceProcAddr (VkInstance instance, char const *name) { setup_tables (); return cruft::vk::load::v_table->vk_icdGetInstanceProcAddr (instance, name); } /////////////////////////////////////////////////////////////////////////////// static cruft::vk::load::vendor_table const v_initialiser { .vk_icdGetInstanceProcAddr = _vk_icdGetInstanceProcAddr, }; cruft::vk::load::vendor_table const *cruft::vk::load::v_table = &v_initialiser;