diff --git a/icd/generated/function_definitions.h b/icd/generated/function_definitions.h index c080684e6..4e07c6258 100644 --- a/icd/generated/function_definitions.h +++ b/icd/generated/function_definitions.h @@ -2571,8 +2571,13 @@ static VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineBinariesKHR(VkDevice device, const VkAllocationCallbacks* pAllocator, VkPipelineBinaryHandlesInfoKHR* pBinaries) { unique_lock_t lock(global_lock); - for (uint32_t i = 0; i < pBinaries->pipelineBinaryCount; ++i) { - pBinaries->pPipelineBinaries[i] = (VkPipelineBinaryKHR)global_unique_handle++; + if (pBinaries->pPipelineBinaries != nullptr) { + for (uint32_t i = 0; i < pBinaries->pipelineBinaryCount; ++i) { + pBinaries->pPipelineBinaries[i] = (VkPipelineBinaryKHR)global_unique_handle++; + } + } else { + // In this case, we need to return a return count, let's set it to 3 + pBinaries->pipelineBinaryCount = 3; } return VK_SUCCESS; } @@ -2582,13 +2587,23 @@ static VKAPI_ATTR void VKAPI_CALL DestroyPipelineBinaryKHR(VkDevice device, VkPi } static VKAPI_ATTR VkResult VKAPI_CALL GetPipelineKeyKHR(VkDevice device, const VkPipelineCreateInfoKHR* pPipelineCreateInfo, VkPipelineBinaryKeyKHR* pPipelineKey) { - // Not a CREATE or DESTROY function + if (pPipelineKey != nullptr) { + pPipelineKey->keySize = 16; + std::memset(pPipelineKey->key, 0x12, pPipelineKey->keySize); + } return VK_SUCCESS; } static VKAPI_ATTR VkResult VKAPI_CALL GetPipelineBinaryDataKHR(VkDevice device, const VkPipelineBinaryDataInfoKHR* pInfo, VkPipelineBinaryKeyKHR* pPipelineBinaryKey, size_t* pPipelineBinaryDataSize, void* pPipelineBinaryData) { - // Not a CREATE or DESTROY function + static uint32_t fake_size = 64; + if (pPipelineBinaryDataSize != nullptr) { + if (pPipelineBinaryData == nullptr) { + *pPipelineBinaryDataSize = fake_size; + } else { + std::memset(pPipelineBinaryData, 0xABCD, fake_size); + } + } return VK_SUCCESS; } static VKAPI_ATTR VkResult VKAPI_CALL ReleaseCapturedPipelineDataKHR(VkDevice device, diff --git a/scripts/generators/mock_icd_generator.py b/scripts/generators/mock_icd_generator.py index c78253cef..b1d81c42b 100644 --- a/scripts/generators/mock_icd_generator.py +++ b/scripts/generators/mock_icd_generator.py @@ -1191,8 +1191,39 @@ ''', 'vkCreatePipelineBinariesKHR': ''' unique_lock_t lock(global_lock); - for (uint32_t i = 0; i < pBinaries->pipelineBinaryCount; ++i) { - pBinaries->pPipelineBinaries[i] = (VkPipelineBinaryKHR)global_unique_handle++; + if (pBinaries->pPipelineBinaries != nullptr) + { + for (uint32_t i = 0; i < pBinaries->pipelineBinaryCount; ++i) { + pBinaries->pPipelineBinaries[i] = (VkPipelineBinaryKHR)global_unique_handle++; + } + } + else + { + // In this case, we need to return a return count, let's set it to 3 + pBinaries->pipelineBinaryCount = 3; + } + return VK_SUCCESS; +''', +'vkGetPipelineKeyKHR': ''' + if (pPipelineKey != nullptr) + { + pPipelineKey->keySize = 16; + std::memset(pPipelineKey->key, 0x12, pPipelineKey->keySize); + } + return VK_SUCCESS; +''', +'vkGetPipelineBinaryDataKHR': ''' + static uint32_t fake_size = 64; + if (pPipelineBinaryDataSize != nullptr) + { + if (pPipelineBinaryData == nullptr) + { + *pPipelineBinaryDataSize = fake_size; + } + else + { + std::memset(pPipelineBinaryData, 0xABCD, fake_size); + } } return VK_SUCCESS; ''' @@ -1291,7 +1322,10 @@ def generate_function_definitions(self, out): 'vkEnumerateInstanceExtensionProperties', 'vkEnumerateDeviceLayerProperties', 'vkEnumerateDeviceExtensionProperties', + 'vkGetPipelineKeyKHR', + 'vkGetPipelineBinaryDataKHR', ] + current_protect = None for name, cmd in self.vk.commands.items(): if cmd.protect != current_protect: