+ VkPipelineVertexInputStateCreateInfo verti;
+ memset(&verti, 0, sizeof verti);
+ verti.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
+ verti.vertexBindingDescriptionCount = bind_descriptions.size();
+ verti.pVertexBindingDescriptions = bind_descriptions.data();
+ verti.vertexAttributeDescriptionCount = attr_descriptions.size();
+ verti.pVertexAttributeDescriptions = attr_descriptions.data();
+
+ VkPipelineLayoutCreateInfo linf;
+ memset(&linf, 0, sizeof linf);
+ linf.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+ linf.setLayoutCount = dset_layouts.size();
+ linf.pSetLayouts = dset_layouts.data();
+ //TODO find max num dsets vkGetPhysicalDeviceProperties
+ //maxBoundDescriptorSets of VkPhysicalDeviceLimits
+ linf.pushConstantRangeCount = push_const_ranges.size();
+ linf.pPushConstantRanges = push_const_ranges.data();
+ //maxPushConstantsSize from VkPhysicalDeviceLimits
+
+ VkPipelineLayout layout;
+ if(vkCreatePipelineLayout(vk_device, &linf, 0, &layout) != VK_SUCCESS) {
+ fprintf(stderr, "Failed to create pipeline layout.\n");
+ return 0;
+ }
+