Minor SDK-0.2 fixes for "tri"
Changes to "tri" are similar to the fixes for "cube":
1) WSI function were being called with an uninitialized pPlatformWindow.
Fixed by splitting demo_init_vk into two functions.
2) VkAttachmentViewCreateInfo.format wasn't being set.
3) VkShaderCreateInfo.pName wasn't being set.
4) demo->cmdPool was being leaked.
diff --git a/demos/cube.c b/demos/cube.c
index 3b41804..73562ec 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -1426,6 +1426,7 @@
shaderCreateInfo.flags = 0;
shaderCreateInfo.module = shaderModule;
+ shaderCreateInfo.pName = "main";
err = vkCreateShader(demo->device, &shaderCreateInfo, &shader);
} else {
// Create fake SPV structure to feed GLSL
@@ -1447,6 +1448,7 @@
shaderCreateInfo.flags = 0;
shaderCreateInfo.module = shaderModule;
+ shaderCreateInfo.pName = "main";
err = vkCreateShader(demo->device, &shaderCreateInfo, &shader);
}
return shader;
diff --git a/demos/tri.c b/demos/tri.c
index 8d40bc4..2154420 100644
--- a/demos/tri.c
+++ b/demos/tri.c
@@ -237,6 +237,7 @@
bool quit;
uint32_t current_buffer;
+ uint32_t queue_count;
};
static VkResult memory_type_from_properties(struct demo *demo, uint32_t typeBits, VkFlags properties, uint32_t *typeIndex)
@@ -616,6 +617,7 @@
.sType = VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO,
.pNext = NULL,
.image.handle = VK_NULL_HANDLE,
+ .format = depth_format,
.mipLevel = 0,
.baseArraySlice = 0,
.arraySize = 1,
@@ -1073,6 +1075,7 @@
shaderCreateInfo.flags = 0;
shaderCreateInfo.module = shaderModule;
+ shaderCreateInfo.pName = "main";
err = vkCreateShader(demo->device, &shaderCreateInfo, &shader);
} else {
// Create fake SPV structure to feed GLSL
@@ -1094,6 +1097,7 @@
shaderCreateInfo.flags = 0;
shaderCreateInfo.module = shaderModule;
+ shaderCreateInfo.pName = "main";
err = vkCreateShader(demo->device, &shaderCreateInfo, &shader);
}
return shader;
@@ -1744,8 +1748,6 @@
.queueCount = 1,
};
uint32_t gpu_count;
- uint32_t i;
- uint32_t queue_count;
err = vkCreateInstance(&inst_info, &demo->inst);
if (err == VK_ERROR_INCOMPATIBLE_DRIVER) {
@@ -1881,17 +1883,23 @@
err = vkGetPhysicalDeviceProperties(demo->gpu, &demo->gpu_props);
- err = vkGetPhysicalDeviceQueueCount(demo->gpu, &queue_count);
+ err = vkGetPhysicalDeviceQueueCount(demo->gpu, &demo->queue_count);
assert(!err);
- demo->queue_props = (VkPhysicalDeviceQueueProperties *) malloc(queue_count * sizeof(VkPhysicalDeviceQueueProperties));
- err = vkGetPhysicalDeviceQueueProperties(demo->gpu, queue_count, demo->queue_props);
+ demo->queue_props = (VkPhysicalDeviceQueueProperties *) malloc(demo->queue_count * sizeof(VkPhysicalDeviceQueueProperties));
+ err = vkGetPhysicalDeviceQueueProperties(demo->gpu, demo->queue_count, demo->queue_props);
assert(!err);
- assert(queue_count >= 1);
+ assert(demo->queue_count >= 1);
// Graphics queue and MemMgr queue can be separate.
// TODO: Add support for separate queues, including synchronization,
// and appropriate tracking for QueueSubmit
+}
+
+static void demo_init_vk_wsi(struct demo *demo)
+{
+ VkResult err;
+ uint32_t i;
// Construct the WSI surface description:
demo->surface_description.sType = VK_STRUCTURE_TYPE_SURFACE_DESCRIPTION_WINDOW_WSI;
@@ -1909,8 +1917,8 @@
#endif // _WIN32
// Iterate over each queue to learn whether it supports presenting to WSI:
- VkBool32* supportsPresent = (VkBool32 *)malloc(queue_count * sizeof(VkBool32));
- for (i = 0; i < queue_count; i++) {
+ VkBool32* supportsPresent = (VkBool32 *)malloc(demo->queue_count * sizeof(VkBool32));
+ for (i = 0; i < demo->queue_count; i++) {
demo->fpGetPhysicalDeviceSurfaceSupportWSI(demo->gpu, i,
(VkSurfaceDescriptionWSI *) &demo->surface_description,
&supportsPresent[i]);
@@ -1920,7 +1928,7 @@
// families, try to find one that supports both
uint32_t graphicsQueueNodeIndex = UINT32_MAX;
uint32_t presentQueueNodeIndex = UINT32_MAX;
- for (i = 0; i < queue_count; i++) {
+ for (i = 0; i < demo->queue_count; i++) {
if ((demo->queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) {
if (graphicsQueueNodeIndex == UINT32_MAX) {
graphicsQueueNodeIndex = i;
@@ -1936,7 +1944,7 @@
if (presentQueueNodeIndex == UINT32_MAX) {
// If didn't find a queue that supports both graphics and present, then
// find a separate present queue.
- for (size_t i = 0; i < queue_count; ++i) {
+ for (uint32_t i = 0; i < demo->queue_count; ++i) {
if (supportsPresent[i] == VK_TRUE) {
presentQueueNodeIndex = i;
break;
@@ -2079,6 +2087,7 @@
vkDestroyCommandBuffer(demo->device, demo->setup_cmd);
}
vkDestroyCommandBuffer(demo->device, demo->draw_cmd);
+ vkDestroyCommandPool(demo->device, demo->cmd_pool);
vkDestroyDynamicViewportState(demo->device, demo->viewport);
vkDestroyDynamicRasterState(demo->device, demo->raster);
@@ -2131,6 +2140,7 @@
demo_init(&demo, hInstance, pCmdLine);
demo_create_window(&demo);
+ demo_init_vk_wsi(&demo);
demo_prepare(&demo);
@@ -2162,6 +2172,7 @@
demo_init(&demo, argc, argv);
demo_create_window(&demo);
+ demo_init_vk_wsi(&demo);
demo_prepare(&demo);
demo_run(&demo);