diff options
| author | Petr Kraus <petr_kraus@email.cz> | 2020-04-08 21:47:25 +0200 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2020-04-10 13:02:51 -0600 |
| commit | 490e39372126a4557712f5ca9ed5e795de3d4ab8 (patch) | |
| tree | e68648a548a3af12c2a9239d326d4cb4f7409a3f /scripts | |
| parent | a7aff240f9ca6fae712139bb11303d5231fd8206 (diff) | |
| download | usermoji-490e39372126a4557712f5ca9ed5e795de3d4ab8.tar.xz | |
icd: Make swapchain images persistent
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/mock_icd_generator.py | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/scripts/mock_icd_generator.py b/scripts/mock_icd_generator.py index 2f33d437..0b1062cf 100644 --- a/scripts/mock_icd_generator.py +++ b/scripts/mock_icd_generator.py @@ -64,6 +64,9 @@ static VkPhysicalDevice physical_device = (VkPhysicalDevice)CreateDispObjHandle( static unordered_map<VkDevice, unordered_map<uint32_t, unordered_map<uint32_t, VkQueue>>> queue_map; static unordered_map<VkDevice, unordered_map<VkBuffer, VkBufferCreateInfo>> buffer_map; +static constexpr uint32_t icd_swapchain_image_count = 1; +static std::unordered_map<VkSwapchainKHR, VkImage[icd_swapchain_image_count]> swapchain_image_map; + // TODO: Would like to codegen this but limits aren't in XML static VkPhysicalDeviceLimits SetLimits(VkPhysicalDeviceLimits *limits) { limits->maxImageDimension1D = 4096; @@ -876,23 +879,32 @@ CUSTOM_C_INTERCEPTS = { mapped_memory_map.erase(memory); ''', 'vkGetImageSubresourceLayout': ''' - // Need safe values. Callers are computing memory offsets from pLayout, with no return code to flag failure. + // Need safe values. Callers are computing memory offsets from pLayout, with no return code to flag failure. *pLayout = VkSubresourceLayout(); // Default constructor zero values. ''', +'vkCreateSwapchainKHR': ''' + unique_lock_t lock(global_lock); + *pSwapchain = (VkSwapchainKHR)global_unique_handle++; + for(uint32_t i = 0; i < icd_swapchain_image_count; ++i){ + swapchain_image_map[*pSwapchain][i] = (VkImage)global_unique_handle++; + } + return VK_SUCCESS; +''', +'vkDestroySwapchainKHR': ''' + unique_lock_t lock(global_lock); + swapchain_image_map.clear(); +''', 'vkGetSwapchainImagesKHR': ''' - constexpr uint32_t icd_image_count = 1; - if (!pSwapchainImages) { - *pSwapchainImageCount = icd_image_count; + *pSwapchainImageCount = icd_swapchain_image_count; } else { unique_lock_t lock(global_lock); - for (uint32_t img_i = 0; img_i < (std::min)(*pSwapchainImageCount, icd_image_count); ++img_i){ - // For simplicity always returns new handles, which is wrong - pSwapchainImages[img_i] = (VkImage)global_unique_handle++; + for (uint32_t img_i = 0; img_i < (std::min)(*pSwapchainImageCount, icd_swapchain_image_count); ++img_i){ + pSwapchainImages[img_i] = swapchain_image_map.at(swapchain)[img_i]; } - if (*pSwapchainImageCount < icd_image_count) return VK_INCOMPLETE; - else if (*pSwapchainImageCount > icd_image_count) *pSwapchainImageCount = icd_image_count; + if (*pSwapchainImageCount < icd_swapchain_image_count) return VK_INCOMPLETE; + else if (*pSwapchainImageCount > icd_swapchain_image_count) *pSwapchainImageCount = icd_swapchain_image_count; } return VK_SUCCESS; ''', |
