{
	search = (
		VkAttachmentDescription,
		VkDebugUtilsMessageSeverityFlagBitsEXT,
		VkSubpassDescription,
		VkSubpassDependency,
		VkSpecializationInfo,
		VkPipelineShaderStageCreateInfo,
		VkPipelineVertexInputStateCreateInfo,
		VkPipelineInputAssemblyStateCreateInfo,
		VkPipelineViewportStateCreateInfo,
		VkPipelineRasterizationStateCreateInfo,
		VkPipelineMultisampleStateCreateInfo,
		VkPipelineDepthStencilStateCreateInfo,
		VkPipelineColorBlendStateCreateInfo,
		VkPipelineDynamicStateCreateInfo,
		VkDescriptorSetLayoutBinding,
		VkDescriptorSetLayoutCreateInfo,
		VkPushConstantRange,
		VkPipelineLayoutCreateInfo,
		VkGraphicsPipelineCreateInfo,
		VkComputePipelineCreateInfo,
		VkDescriptorPoolCreateInfo,
		VkSamplerCreateInfo,
		VkImageCreateInfo,
		VkImageViewCreateInfo,
		VkFramebufferCreateInfo,
		VkClearValue,
		VkPhysicalDeviceLimits,
	);
	parse = {
		VkSubpassDescription = {
			flags = auto;
			pipelineBindPoint = auto;
			inputAttachments = {
				type = (array, VkAttachmentReference);
				size = inputAttachmentCount;
				values = pInputAttachments;
			};
			colorAttachments = {
				type = (array, VkAttachmentReference);
				size = colorAttachmentCount;
				values = pColorAttachments;
			};
			resolveAttachments = {
				type = (array, VkAttachmentReference);
				values = pResolveAttachments;
				matchSize = colorAttachments;
			};
			depthStencilAttachment = {
				type = (single, VkAttachmentReference);
				value = pDepthStencilAttachment;
			};
			preserveAttachments = {
				type = (array, uint32_t);
				size = preserveAttachmentCount;
				values = pPreserveAttachments;
			};
		};
		VkRenderPassCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			attachments = {
				type = (array, VkAttachmentDescription);
				size = attachmentCount;
				values = pAttachments;
			};
			subpasses = {
				type = (array, VkSubpassDescription);
				size = subpassCount;
				values = pSubpasses;
			};
			dependencies = {
				type = (array, VkSubpassDependency);
				size = dependencyCount;
				values = pDependencies;
			};
		};
		VkSpecializationInfo = {
			mapEntries = {
				type = (array, VkSpecializationMapEntry);
				size = mapEntryCount;
				values = pMapEntries;
			};
			data = {
				type = (custom,	(QFBinary, QFString),
						parse_specialization_data);
				fields = (dataSize, pData);
			};
		};
		VkPipelineShaderStageCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			stage = auto;
			name = {
				type = string;
				string = pName;
			};
			module = {
				type = (custom,	QFString, parse_VkShaderModule);
				fields = (module);
			};
			specializationInfo = {
				type = (single, VkSpecializationInfo);
				value = pSpecializationInfo;
			};
		};
		VkShaderModuleCreateInfo = skip;
		VkDescriptorSetLayoutBinding = {
			binding = auto;
			descriptorType = auto;
			descriptorCount = auto;
			stageFlags = auto;
			// skip pImmutableSamplers (default to 0) until I know how it works
		};
		VkDescriptorSetLayoutCreateInfo = {
			flags = auto;
			bindings = {
				type = (array, VkDescriptorSetLayoutBinding);
				size = bindingCount;
				values = pBindings;
			};
		};
		VkDescriptorPoolCreateInfo = {
			flags = auto;
			maxSets = auto;
			bindings = {
				type = (array, VkDescriptorPoolSize);
				size = poolSizeCount;
				values = pPoolSizes;
			};
		};
		VkPipelineVertexInputStateCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			bindings = {
				type = (array, VkVertexInputBindingDescription);
				size = vertexBindingDescriptionCount;
				values = pVertexBindingDescriptions;
			};
			attributes = {
				type = (array, VkVertexInputAttributeDescription);
				size = vertexAttributeDescriptionCount;
				values = pVertexAttributeDescriptions;
			};
		};
		VkPipelineInputAssemblyStateCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			topology = auto;
			primitiveRestartEnable = auto;
		};
		VkPipelineViewportStateCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			//FIXME redo as one array
			viewports = {
				type = (array, VkViewport);
				size = viewportCount;
				values = pViewports;
			};
			scissors = {
				type = (array, VkRect2D);
				size = scissorCount;
				values = pScissors;
			};
		};
		VkPipelineRasterizationStateCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			depthClampEnable = auto;
			rasterizerDiscardEnable = auto;
			polygonMode = auto;
			cullMode = auto;
			frontFace = auto;
			depthBiasEnable = auto;
			depthBiasConstantFactor = auto;
			depthBiasClamp = auto;
			depthBiasSlopeFactor = auto;
			lineWidth = auto;
		};
		VkPipelineMultisampleStateCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			rasterizationSamples = auto;
			sampleShadingEnable = auto;
			minSampleShading = auto;
			//pSampleMask = auto; FIXME disabled until correct size is known
			alphaToCoverageEnable = auto;
			alphaToOneEnable = auto;
		};
		VkPipelineDepthStencilStateCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			depthTestEnable = auto;
			depthWriteEnable = auto;
			depthCompareOp = auto;
			depthBoundsTestEnable = auto;
			stencilTestEnable = auto;
			front = auto;
			back = auto;
			minDepthBounds = auto;
			maxDepthBounds = auto;
		};
		VkPipelineColorBlendStateCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			logicOpEnable = auto;
			logicOp = auto;
			attachments = {
				type = (array, VkPipelineColorBlendAttachmentState);
				size = attachmentCount;
				values = pAttachments;
			};
			blendConstants = {
				type = (custom, QFString, parse_RGBA);
				fields = (blendConstants);
			};
		};
		VkPipelineDynamicStateCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			dynamicState = {
				type = (array, VkDynamicState);
				size = dynamicStateCount;
				values = pDynamicStates;
			};
		};
		VkPipelineLayoutCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			setLayouts = {
				type = (array,	{
									parse_type = (QFDictionary, QFString);
									type = VkDescriptorSetLayout;
									parser = parse_VkDescriptorSetLayout;
								});
				size = setLayoutCount;
				values = pSetLayouts;
			};
			pushConstantRanges = {
				type = (array, VkPushConstantRange);
				size = pushConstantRangeCount;
				values = pPushConstantRanges;
			};
		};
		VkPipelineTessellationStateCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			patchControlPoints = auto;
		};
		VkGraphicsPipelineCreateInfo = {
			flags = auto;
			stages = {
				type = (array, VkPipelineShaderStageCreateInfo);
				size = stageCount;
				values = pStages;
			};
			vertexInput = {
				type = (single, VkPipelineVertexInputStateCreateInfo);
				value = pVertexInputState;
			};
			inputAssembly = {
				type = (single, VkPipelineInputAssemblyStateCreateInfo);
				value = pInputAssemblyState;
			};
			tessellation = {
				type = (single, VkPipelineTessellationStateCreateInfo);
				value = pTessellationState;
			};
			viewport = {
				type = (single, VkPipelineViewportStateCreateInfo);
				value = pViewportState;
			};
			rasterization = {
				type = (single, VkPipelineRasterizationStateCreateInfo);
				value = pRasterizationState;
			};
			multisample = {
				type = (single, VkPipelineMultisampleStateCreateInfo);
				value = pMultisampleState;
			};
			depthStencil = {
				type = (single, VkPipelineDepthStencilStateCreateInfo);
				value = pDepthStencilState;
			};
			colorBlend = {
				type = (single, VkPipelineColorBlendStateCreateInfo);
				value = pColorBlendState;
			};
			dynamic = {
				type = (single, VkPipelineDynamicStateCreateInfo);
				value = pDynamicState;
			};
			layout = {
				type = (custom,	QFString, parse_VkPipelineLayout);
				fields = (layout);
			};
			renderPass = {
				type = (custom,	QFString, parse_VkRenderPass);
				fields = (renderPass);
			};
			subpass = auto;
			basePipelineHandle = {
				type = (custom, QFString, parse_BasePipeline);
				fields = (basePipelineHandle);
			};
			basePipelineIndex = auto;
		};
		VkComputePipelineCreateInfo = {
			flags = auto;
			stage = auto;
			layout = {
				type = (custom,	QFString, parse_VkPipelineLayout);
				fields = (layout);
			};
			basePipelineHandle = {
				type = (custom, QFString, parse_BasePipeline);
				fields = (basePipelineHandle);
			};
			basePipelineIndex = auto;
		};
		VkImageCreateInfo = {
			flags = auto;
			imageType = auto;
			format = auto;
			extent = auto;
			mipLevels = auto;
			arrayLayers = auto;
			samples = auto;
			tiling = auto;
			usage = auto;
			sharingMode = skip;	// FIXME for now
			queueFamilyIndexCount = skip;	// FIXME for now
			pQueueFamilyIndices = skip;	// FIXME for now
			initialLayout = auto;
		};
		VkImageViewCreateInfo = {
			flags = auto;
			image = {
				type = (custom,	(QFDictionary, QFString),
						parse_VkImage);
				fields = (image);
			};
			viewType = auto;
			format = auto;
			components = auto;
			subresourceRange = auto;
		};
		VkFramebufferCreateInfo = {
			//flags = auto; reserved for future use (Bits enum does not exist)
			renderPass = {
				type = (custom,	QFString, parse_VkRenderPass);
				fields = (renderPass);
			};
			attachments = {
				type = (array, VkImageView);
				size = attachmentCount;
				values = pAttachments;
			};
			width = auto;
			height = auto;
			layers = auto;
		};
		VkClearColorValue = skip;
		VkClearValue = {
			color = {
				type = (custom, QFString, parse_RGBA);
				fields = (color);
			};
			depthStencil = auto;
		};
	}
}
