aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorPetr Kraus <petr_kraus@email.cz>2020-04-08 21:47:25 +0200
committerMark Lobodzinski <mark@lunarg.com>2020-04-10 13:02:51 -0600
commit490e39372126a4557712f5ca9ed5e795de3d4ab8 (patch)
treee68648a548a3af12c2a9239d326d4cb4f7409a3f /scripts
parenta7aff240f9ca6fae712139bb11303d5231fd8206 (diff)
downloadusermoji-490e39372126a4557712f5ca9ed5e795de3d4ab8.tar.xz
icd: Make swapchain images persistent
Diffstat (limited to 'scripts')
-rw-r--r--scripts/mock_icd_generator.py30
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;
''',