bug 12921: Memory callback (WIP)

The per-object allocator is ignored for now.

https://cvs.khronos.org/bugzilla/show_bug.cgi?id=12921
diff --git a/demos/cube.c b/demos/cube.c
index 77a9410..2880cf9 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -637,6 +637,7 @@
 
     err = vkCreateSemaphore(demo->device,
                             &presentCompleteSemaphoreCreateInfo,
+                            NULL,
                             &presentCompleteSemaphore);
     assert(!err);
 
@@ -650,7 +651,7 @@
         // must be recreated:
         demo_resize(demo);
         demo_draw(demo);
-        vkDestroySemaphore(demo->device, presentCompleteSemaphore);
+        vkDestroySemaphore(demo->device, presentCompleteSemaphore, NULL);
         return;
     } else if (err == VK_SUBOPTIMAL_KHR) {
         // demo->swapchain is not as optimal as it could be, but the platform's
@@ -711,7 +712,7 @@
     err = vkQueueWaitIdle(demo->queue);
     assert(err == VK_SUCCESS);
 
-    vkDestroySemaphore(demo->device, presentCompleteSemaphore);
+    vkDestroySemaphore(demo->device, presentCompleteSemaphore, NULL);
 }
 
 static void demo_prepare_buffers(struct demo *demo)
@@ -873,7 +874,7 @@
         color_image_view.image = demo->buffers[i].image;
 
         err = vkCreateImageView(demo->device,
-                &color_image_view, &demo->buffers[i].view);
+                &color_image_view, NULL, &demo->buffers[i].view);
         assert(!err);
     }
 }
@@ -918,7 +919,7 @@
     demo->depth.format = depth_format;
 
     /* create image */
-    err = vkCreateImage(demo->device, &image,
+    err = vkCreateImage(demo->device, &image, NULL,
             &demo->depth.image);
     assert(!err);
 
@@ -938,7 +939,8 @@
     assert(pass);
 
     /* allocate memory */
-    err = vkAllocMemory(demo->device, &demo->depth.mem_alloc, &demo->depth.mem);
+    err = vkAllocMemory(demo->device, &demo->depth.mem_alloc,
+            NULL, &demo->depth.mem);
     assert(!err);
 
     /* bind memory */
@@ -953,7 +955,7 @@
 
     /* create image view */
     view.image = demo->depth.image;
-    err = vkCreateImageView(demo->device, &view, &demo->depth.view);
+    err = vkCreateImageView(demo->device, &view, NULL, &demo->depth.view);
     assert(!err);
 }
 
@@ -1047,7 +1049,7 @@
 
     VkMemoryRequirements mem_reqs;
 
-    err = vkCreateImage(demo->device, &image_create_info,
+    err = vkCreateImage(demo->device, &image_create_info, NULL,
             &tex_obj->image);
     assert(!err);
 
@@ -1062,7 +1064,7 @@
     assert(pass);
 
     /* allocate memory */
-    err = vkAllocMemory(demo->device, &tex_obj->mem_alloc,
+    err = vkAllocMemory(demo->device, &tex_obj->mem_alloc, NULL,
                 &(tex_obj->mem));
     assert(!err);
 
@@ -1103,8 +1105,8 @@
 static void demo_destroy_texture_image(struct demo *demo, struct texture_object *tex_objs)
 {
     /* clean up staging resources */
-    vkFreeMemory(demo->device, tex_objs->mem);
-    vkDestroyImage(demo->device, tex_objs->image);
+    vkFreeMemory(demo->device, tex_objs->mem, NULL);
+    vkDestroyImage(demo->device, tex_objs->image, NULL);
 }
 
 static void demo_prepare_textures(struct demo *demo)
@@ -1203,13 +1205,13 @@
         };
 
         /* create sampler */
-        err = vkCreateSampler(demo->device, &sampler,
+        err = vkCreateSampler(demo->device, &sampler, NULL,
                 &demo->textures[i].sampler);
         assert(!err);
 
         /* create image view */
         view.image = demo->textures[i].image;
-        err = vkCreateImageView(demo->device, &view,
+        err = vkCreateImageView(demo->device, &view, NULL,
                 &demo->textures[i].view);
         assert(!err);
     }
@@ -1246,7 +1248,8 @@
     buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
     buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
     buf_info.size = sizeof(data);
-    err = vkCreateBuffer(demo->device, &buf_info, &demo->uniform_data.buf);
+    err = vkCreateBuffer(demo->device, &buf_info, NULL,
+            &demo->uniform_data.buf);
     assert(!err);
 
     vkGetBufferMemoryRequirements(demo->device, demo->uniform_data.buf, &mem_reqs);
@@ -1262,7 +1265,8 @@
                                       &demo->uniform_data.mem_alloc.memoryTypeIndex);
     assert(pass);
 
-    err = vkAllocMemory(demo->device, &demo->uniform_data.mem_alloc, &(demo->uniform_data.mem));
+    err = vkAllocMemory(demo->device, &demo->uniform_data.mem_alloc,
+            NULL, &(demo->uniform_data.mem));
     assert(!err);
 
     err = vkMapMemory(demo->device, demo->uniform_data.mem, 0, demo->uniform_data.mem_alloc.allocationSize, 0, (void **) &pData);
@@ -1307,7 +1311,7 @@
     VkResult U_ASSERT_ONLY err;
 
     err = vkCreateDescriptorSetLayout(demo->device,
-            &descriptor_layout, &demo->desc_layout);
+            &descriptor_layout, NULL, &demo->desc_layout);
     assert(!err);
 
     const VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {
@@ -1319,6 +1323,7 @@
 
     err = vkCreatePipelineLayout(demo->device,
                                  &pPipelineLayoutCreateInfo,
+                                 NULL,
                                  &demo->pipeline_layout);
     assert(!err);
 }
@@ -1384,7 +1389,7 @@
     };
     VkResult U_ASSERT_ONLY err;
 
-    err = vkCreateRenderPass(demo->device, &rp_info, &demo->render_pass);
+    err = vkCreateRenderPass(demo->device, &rp_info, NULL, &demo->render_pass);
     assert(!err);
 }
 
@@ -1411,14 +1416,14 @@
         moduleCreateInfo.codeSize = size;
         moduleCreateInfo.pCode = code;
         moduleCreateInfo.flags = 0;
-        err = vkCreateShaderModule(demo->device, &moduleCreateInfo, pShaderModule);
+        err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, pShaderModule);
         assert(!err);
 
         shaderCreateInfo.flags = 0;
         shaderCreateInfo.module = *pShaderModule;
         shaderCreateInfo.pName = "main";
         shaderCreateInfo.stage = stage;
-        err = vkCreateShader(demo->device, &shaderCreateInfo, &shader);
+        err = vkCreateShader(demo->device, &shaderCreateInfo, NULL, &shader);
         assert(!err);
     } else {
         // Create fake SPV structure to feed GLSL
@@ -1433,7 +1438,7 @@
         ((uint32_t *) moduleCreateInfo.pCode)[2] = stage;
         memcpy(((uint32_t *) moduleCreateInfo.pCode + 3), code, size + 1);
 
-        err = vkCreateShaderModule(demo->device, &moduleCreateInfo, pShaderModule);
+        err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, pShaderModule);
         if (err) {
             free((void *) moduleCreateInfo.pCode);
         }
@@ -1442,7 +1447,7 @@
         shaderCreateInfo.module = *pShaderModule;
         shaderCreateInfo.pName = "main";
         shaderCreateInfo.stage = stage;
-        err = vkCreateShader(demo->device, &shaderCreateInfo, &shader);
+        err = vkCreateShader(demo->device, &shaderCreateInfo, NULL, &shader);
         assert(!err);
         free((void *) moduleCreateInfo.pCode);
     }
@@ -1635,7 +1640,7 @@
     memset(&pipelineCache, 0, sizeof(pipelineCache));
     pipelineCache.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
 
-    err = vkCreatePipelineCache(demo->device, &pipelineCache, &demo->pipelineCache);
+    err = vkCreatePipelineCache(demo->device, &pipelineCache, NULL, &demo->pipelineCache);
     assert(!err);
 
     pipeline.pVertexInputState   = &vi;
@@ -1651,14 +1656,15 @@
 
     pipeline.renderPass = demo->render_pass;
 
-    err = vkCreateGraphicsPipelines(demo->device, demo->pipelineCache, 1, &pipeline, &demo->pipeline);
+    err = vkCreateGraphicsPipelines(demo->device, demo->pipelineCache,
+            1, &pipeline, NULL, &demo->pipeline);
     assert(!err);
 
     for (uint32_t i = 0; i < pipeline.stageCount; i++) {
-        vkDestroyShader(demo->device, shaderStages[i].shader);
+        vkDestroyShader(demo->device, shaderStages[i].shader, NULL);
     }
-    vkDestroyShaderModule(demo->device, demo->frag_shader_module);
-    vkDestroyShaderModule(demo->device, demo->vert_shader_module);
+    vkDestroyShaderModule(demo->device, demo->frag_shader_module, NULL);
+    vkDestroyShaderModule(demo->device, demo->vert_shader_module, NULL);
 }
 
 static void demo_prepare_descriptor_pool(struct demo *demo)
@@ -1683,7 +1689,7 @@
     VkResult U_ASSERT_ONLY err;
 
     err = vkCreateDescriptorPool(demo->device,
-            &descriptor_pool, &demo->desc_pool);
+            &descriptor_pool, NULL, &demo->desc_pool);
     assert(!err);
 }
 
@@ -1752,7 +1758,7 @@
 
     for (i = 0; i < demo->swapchainImageCount; i++) {
         attachments[0] = demo->buffers[i].view;
-        err = vkCreateFramebuffer(demo->device, &fb_info, &demo->framebuffers[i]);
+        err = vkCreateFramebuffer(demo->device, &fb_info, NULL, &demo->framebuffers[i]);
         assert(!err);
     }
 }
@@ -1767,7 +1773,7 @@
         .queueFamilyIndex = demo->graphics_queue_node_index,
         .flags = 0,
     };
-    err = vkCreateCommandPool(demo->device, &cmd_pool_info, &demo->cmd_pool);
+    err = vkCreateCommandPool(demo->device, &cmd_pool_info, NULL, &demo->cmd_pool);
     assert(!err);
 
     const VkCmdBufferAllocInfo cmd = {
@@ -1819,46 +1825,46 @@
     demo->prepared = false;
 
     for (i = 0; i < demo->swapchainImageCount; i++) {
-        vkDestroyFramebuffer(demo->device, demo->framebuffers[i]);
+        vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL);
     }
     free(demo->framebuffers);
-    vkDestroyDescriptorPool(demo->device, demo->desc_pool);
+    vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL);
 
-    vkDestroyPipeline(demo->device, demo->pipeline);
-    vkDestroyPipelineCache(demo->device, demo->pipelineCache);
-    vkDestroyRenderPass(demo->device, demo->render_pass);
-    vkDestroyPipelineLayout(demo->device, demo->pipeline_layout);
-    vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout);
+    vkDestroyPipeline(demo->device, demo->pipeline, NULL);
+    vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL);
+    vkDestroyRenderPass(demo->device, demo->render_pass, NULL);
+    vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL);
+    vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL);
 
     for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
-        vkDestroyImageView(demo->device, demo->textures[i].view);
-        vkDestroyImage(demo->device, demo->textures[i].image);
-        vkFreeMemory(demo->device, demo->textures[i].mem);
-        vkDestroySampler(demo->device, demo->textures[i].sampler);
+        vkDestroyImageView(demo->device, demo->textures[i].view, NULL);
+        vkDestroyImage(demo->device, demo->textures[i].image, NULL);
+        vkFreeMemory(demo->device, demo->textures[i].mem, NULL);
+        vkDestroySampler(demo->device, demo->textures[i].sampler, NULL);
     }
     demo->fpDestroySwapchainKHR(demo->device, demo->swapchain);
 
-    vkDestroyImageView(demo->device, demo->depth.view);
-    vkDestroyImage(demo->device, demo->depth.image);
-    vkFreeMemory(demo->device, demo->depth.mem);
+    vkDestroyImageView(demo->device, demo->depth.view, NULL);
+    vkDestroyImage(demo->device, demo->depth.image, NULL);
+    vkFreeMemory(demo->device, demo->depth.mem, NULL);
 
-    vkDestroyBuffer(demo->device, demo->uniform_data.buf);
-    vkFreeMemory(demo->device, demo->uniform_data.mem);
+    vkDestroyBuffer(demo->device, demo->uniform_data.buf, NULL);
+    vkFreeMemory(demo->device, demo->uniform_data.mem, NULL);
 
     for (i = 0; i < demo->swapchainImageCount; i++) {
-        vkDestroyImageView(demo->device, demo->buffers[i].view);
+        vkDestroyImageView(demo->device, demo->buffers[i].view, NULL);
         vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->buffers[i].cmd);
     }
     free(demo->buffers);
 
     free(demo->queue_props);
 
-    vkDestroyCommandPool(demo->device, demo->cmd_pool);
-    vkDestroyDevice(demo->device);
+    vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);
+    vkDestroyDevice(demo->device, NULL);
     if (demo->validate) {
         demo->dbgDestroyMsgCallback(demo->inst, demo->msg_callback);
     }
-    vkDestroyInstance(demo->inst);
+    vkDestroyInstance(demo->inst, NULL);
 
 #ifndef _WIN32
     xcb_destroy_window(demo->connection, demo->window);
@@ -1882,39 +1888,39 @@
     demo->prepared = false;
 
     for (i = 0; i < demo->swapchainImageCount; i++) {
-        vkDestroyFramebuffer(demo->device, demo->framebuffers[i]);
+        vkDestroyFramebuffer(demo->device, demo->framebuffers[i], NULL);
     }
     free(demo->framebuffers);
-    vkDestroyDescriptorPool(demo->device, demo->desc_pool);
+    vkDestroyDescriptorPool(demo->device, demo->desc_pool, NULL);
 
-    vkDestroyPipeline(demo->device, demo->pipeline);
-    vkDestroyPipelineCache(demo->device, demo->pipelineCache);
-    vkDestroyRenderPass(demo->device, demo->render_pass);
-    vkDestroyPipelineLayout(demo->device, demo->pipeline_layout);
-    vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout);
+    vkDestroyPipeline(demo->device, demo->pipeline, NULL);
+    vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL);
+    vkDestroyRenderPass(demo->device, demo->render_pass, NULL);
+    vkDestroyPipelineLayout(demo->device, demo->pipeline_layout, NULL);
+    vkDestroyDescriptorSetLayout(demo->device, demo->desc_layout, NULL);
 
     for (i = 0; i < DEMO_TEXTURE_COUNT; i++) {
-        vkDestroyImageView(demo->device, demo->textures[i].view);
-        vkDestroyImage(demo->device, demo->textures[i].image);
-        vkFreeMemory(demo->device, demo->textures[i].mem);
-        vkDestroySampler(demo->device, demo->textures[i].sampler);
+        vkDestroyImageView(demo->device, demo->textures[i].view, NULL);
+        vkDestroyImage(demo->device, demo->textures[i].image, NULL);
+        vkFreeMemory(demo->device, demo->textures[i].mem, NULL);
+        vkDestroySampler(demo->device, demo->textures[i].sampler, NULL);
     }
 
-    vkDestroyImageView(demo->device, demo->depth.view);
-    vkDestroyImage(demo->device, demo->depth.image);
-    vkFreeMemory(demo->device, demo->depth.mem);
+    vkDestroyImageView(demo->device, demo->depth.view, NULL);
+    vkDestroyImage(demo->device, demo->depth.image, NULL);
+    vkFreeMemory(demo->device, demo->depth.mem, NULL);
 
-    vkDestroyBuffer(demo->device, demo->uniform_data.buf);
-    vkFreeMemory(demo->device, demo->uniform_data.mem);
+    vkDestroyBuffer(demo->device, demo->uniform_data.buf, NULL);
+    vkFreeMemory(demo->device, demo->uniform_data.mem, NULL);
 
     for (i = 0; i < demo->swapchainImageCount; i++) {
-        vkDestroyImageView(demo->device, demo->buffers[i].view);
+        vkDestroyImageView(demo->device, demo->buffers[i].view, NULL);
         vkFreeCommandBuffers(demo->device, demo->cmd_pool, 1, &demo->buffers[i].cmd);
     }
-    vkDestroyCommandPool(demo->device, demo->cmd_pool);
+    vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);
     free(demo->buffers);
 
-    vkDestroyCommandPool(demo->device, demo->cmd_pool);
+    vkDestroyCommandPool(demo->device, demo->cmd_pool, NULL);
 
 
     // Second, re-perform the demo_prepare() function, which will re-create the
@@ -2268,7 +2274,6 @@
         .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
         .pNext = NULL,
         .pAppInfo = &app,
-        .pAllocCb = NULL,
         .enabledLayerNameCount = enabled_layer_count,
         .ppEnabledLayerNames = (const char *const*) ((demo->validate) ? instance_validation_layers : NULL),
         .enabledExtensionNameCount = enabled_extension_count,
@@ -2277,7 +2282,7 @@
 
     uint32_t gpu_count;
 
-    err = vkCreateInstance(&inst_info, &demo->inst);
+    err = vkCreateInstance(&inst_info, NULL, &demo->inst);
     if (err == VK_ERROR_INCOMPATIBLE_DRIVER) {
         ERR_EXIT("Cannot find a compatible Vulkan installable client driver "
                  "(ICD).\n\nPlease look at the Getting Started guide for "
@@ -2444,7 +2449,7 @@
         .pEnabledFeatures = NULL, // If specific features are required, pass them in here
     };
 
-    err = vkCreateDevice(demo->gpu, &device, &demo->device);
+    err = vkCreateDevice(demo->gpu, &device, NULL, &demo->device);
     assert(!err);
 
     free(device_layers);