void VKAPI_CALL vkFreeCommandBuffers( VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers) { dispatch_key key = get_dispatch_key(device); layer_data *my_data = get_my_data_ptr(key, layer_data_map); VkLayerDispatchTable *pTable = my_data->device_dispatch_table; const bool lockCommandPool = false; // pool is already directly locked startReadObject(my_data, device); startWriteObject(my_data, commandPool); for (int index=0;index<commandBufferCount;index++) { startWriteObject(my_data, pCommandBuffers[index], lockCommandPool); } pTable->FreeCommandBuffers(device,commandPool,commandBufferCount,pCommandBuffers); finishReadObject(my_data, device); finishWriteObject(my_data, commandPool); for (int index=0;index<commandBufferCount;index++) { finishWriteObject(my_data, pCommandBuffers[index], lockCommandPool); loader_platform_thread_lock_mutex(&threadingLock); command_pool_map.erase(pCommandBuffers[index]); loader_platform_thread_unlock_mutex(&threadingLock); } }
VkResult VKAPI_CALL vkAllocateCommandBuffers( VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers) { dispatch_key key = get_dispatch_key(device); layer_data *my_data = get_my_data_ptr(key, layer_data_map); VkLayerDispatchTable *pTable = my_data->device_dispatch_table; VkResult result; startReadObject(my_data, device); startWriteObject(my_data, pAllocateInfo->commandPool); result = pTable->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers); finishReadObject(my_data, device); finishWriteObject(my_data, pAllocateInfo->commandPool); // Record mapping from command buffer to command pool if (VK_SUCCESS == result) { for (int index=0;index<pAllocateInfo->commandBufferCount;index++) { loader_platform_thread_lock_mutex(&threadingLock); command_pool_map[pCommandBuffers[index]] = pAllocateInfo->commandPool; loader_platform_thread_unlock_mutex(&threadingLock); } } return result; }
VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDeviceGroupsKHX( VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupPropertiesKHX *pPhysicalDeviceGroupProperties) { VkResult res = VK_SUCCESS; uint32_t count; uint32_t i; struct loader_instance *inst = NULL; loader_platform_thread_lock_mutex(&loader_lock); inst = loader_get_instance(instance); if (NULL == inst) { res = VK_ERROR_INITIALIZATION_FAILED; goto out; } if (NULL == pPhysicalDeviceGroupCount) { loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "vkEnumeratePhysicalDeviceGroupsKHX: Received NULL pointer for physical " "device group count return value."); res = VK_ERROR_INITIALIZATION_FAILED; goto out; } VkResult setup_res = setupLoaderTrampPhysDevGroups(instance); if (VK_SUCCESS != setup_res) { res = setup_res; goto out; } count = inst->phys_dev_group_count_tramp; // Wrap the PhysDev object for loader usage, return wrapped objects if (NULL != pPhysicalDeviceGroupProperties) { if (inst->phys_dev_group_count_tramp > *pPhysicalDeviceGroupCount) { loader_log(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, "vkEnumeratePhysicalDeviceGroupsKHX: Trimming device group count down" " by application request from %d to %d physical device groups", inst->phys_dev_group_count_tramp, *pPhysicalDeviceGroupCount); count = *pPhysicalDeviceGroupCount; res = VK_INCOMPLETE; } for (i = 0; i < count; i++) { memcpy(&pPhysicalDeviceGroupProperties[i], inst->phys_dev_groups_tramp[i], sizeof(VkPhysicalDeviceGroupPropertiesKHX)); } } *pPhysicalDeviceGroupCount = count; out: loader_platform_thread_unlock_mutex(&loader_lock); return res; }