/*
 * MVKExtensions.h
 *
 * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include "MVKBaseObject.h"
#include <string>


#pragma mark -
#pragma mark MVKExtension

/** Describes a Vulkan extension and whether or not it is enabled or supported. */
struct MVKExtension {
	bool enabled = false;
	VkExtensionProperties* pProperties;

	MVKExtension(VkExtensionProperties* pProperties, bool enableForPlatform = false);
};


#pragma mark -
#pragma mark MVKExtensionList

/**
 * A fixed list of the Vulkan extensions known to MoltenVK, with
 * an indication of whether each extension is supported/enabled.
 *
 * To add support for a Vulkan extension, add a variable to this list.
 */
class MVKExtensionList : public MVKBaseObject {

public:

	/** Returns the Vulkan API opaque object controlling this object. */
	MVKVulkanAPIObject* getVulkanAPIObject() override { return _apiObject; };

	union {
		struct {
#define MVK_EXTENSION(var, EXT) MVKExtension vk_ ##var;
#include "MVKExtensions.def"
		};
		MVKExtension extensionArray;
	};

	/** Returns the total number of extensions that are tracked by this object. */
	uint32_t getCount() const { return _count; }

	/** Returns the number of extensions that are enabled. */
	uint32_t getEnabledCount() const;

	/** Returns whether the named extension is enabled. */
	bool isEnabled(const char* extnName) const;

	/** Enables the named extension. */
	void enable(const char* extnName);

	/**
	 * Enables the named extensions.
	 *
	 * If parent is non null, the extension must also be enabled in the parent in order
	 * for it to be enabled here. If it is not enabled in the parent, an error is logged
	 * and returned. Returns VK_SUCCESS if all requested extensions were able to be enabled.
	 */
	VkResult enable(uint32_t count, const char* const* names, MVKExtensionList* parent = nullptr);

	/**
	 * Returns a string containing the names of the enabled extensions, separated by the separator string.
	 * If prefixFirstWithSeparator is true the separator will also appear before the first extension name.
	 */
	std::string enabledNamesString(const char* separator = " ", bool prefixFirstWithSeparator = false) const;

	/**
	 * If pProperties is null, the value of pCount is updated with the number of extensions
	 * enabled in this list.
	 *
	 * If pProperties is not null, then pCount extension properties are copied into the array.
	 * If the number of available extensions is less than pCount, the value of pCount is updated
	 * to indicate the number of extension properties actually returned in the array.
	 *
	 * Returns VK_SUCCESS if successful. Returns VK_INCOMPLETE if the number of extensions
	 * enabled in this list is larger than the specified pCount. Returns other values
	 * if an error occurs.
	 */
	VkResult getProperties(uint32_t* pCount, VkExtensionProperties* pProperties);

	MVKExtensionList(MVKVulkanAPIObject* apiObject, bool enableForPlatform = false);

protected:
	void initCount();

	MVKVulkanAPIObject* _apiObject;
	uint32_t _count;

};

