// Copyright 2018 The SwiftShader Authors. All Rights Reserved.
//
// 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.

#ifndef VK_PHYSICAL_DEVICE_HPP_
#define VK_PHYSICAL_DEVICE_HPP_

#include "VkObject.hpp"
#include "VkFormat.h"

#ifdef VK_USE_PLATFORM_ANDROID_KHR
#include <vulkan/vk_android_native_buffer.h>
#endif

namespace vk
{

class PhysicalDevice
{
public:
	static constexpr VkSystemAllocationScope GetAllocationScope() { return VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE; }

	PhysicalDevice(const void*, void* mem);
	void destroy(const VkAllocationCallbacks* pAllocator) {}

	static size_t ComputeRequiredAllocationSize(const void*) { return 0; }

	const VkPhysicalDeviceFeatures& getFeatures() const;
	void getFeatures(VkPhysicalDeviceSamplerYcbcrConversionFeatures* features) const;
	void getFeatures(VkPhysicalDevice16BitStorageFeatures* features) const;
	void getFeatures(VkPhysicalDeviceVariablePointerFeatures* features) const;
	void getFeatures(VkPhysicalDevice8BitStorageFeaturesKHR* features) const;
	void getFeatures(VkPhysicalDeviceMultiviewFeatures* features) const;
	void getFeatures(VkPhysicalDeviceProtectedMemoryFeatures* features) const;
	void getFeatures(VkPhysicalDeviceShaderDrawParameterFeatures* features) const;
	bool hasFeatures(const VkPhysicalDeviceFeatures& requestedFeatures) const;

	const VkPhysicalDeviceProperties& getProperties() const;
	void getProperties(VkPhysicalDeviceIDProperties* properties) const;
	void getProperties(VkPhysicalDeviceMaintenance3Properties* properties) const;
	void getProperties(VkPhysicalDeviceMultiviewProperties* properties) const;
	void getProperties(VkPhysicalDevicePointClippingProperties* properties) const;
	void getProperties(VkPhysicalDeviceProtectedMemoryProperties* properties) const;
	void getProperties(VkPhysicalDeviceSubgroupProperties* properties) const;
	void getProperties(const VkExternalMemoryHandleTypeFlagBits* handleType, VkExternalImageFormatProperties* properties) const;
	void getProperties(VkSamplerYcbcrConversionImageFormatProperties* properties) const;
#ifdef __ANDROID__
	void getProperties(VkPhysicalDevicePresentationPropertiesANDROID* properties) const;
#endif
	void getProperties(const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, VkExternalBufferProperties* pExternalBufferProperties) const;
	void getProperties(const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, VkExternalFenceProperties* pExternalFenceProperties) const;
	void getProperties(const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, VkExternalSemaphoreProperties* pExternalSemaphoreProperties) const;
	void getProperties(VkPhysicalDeviceDriverPropertiesKHR* properties) const;

	void getFormatProperties(Format format, VkFormatProperties* pFormatProperties) const;
	void getImageFormatProperties(Format format, VkImageType type, VkImageTiling tiling,
	                              VkImageUsageFlags usage, VkImageCreateFlags flags,
	                              VkImageFormatProperties* pImageFormatProperties) const;
	uint32_t getQueueFamilyPropertyCount() const;
	void getQueueFamilyProperties(uint32_t pQueueFamilyPropertyCount,
	                              VkQueueFamilyProperties* pQueueFamilyProperties) const;
	const VkPhysicalDeviceMemoryProperties& getMemoryProperties() const;

private:
	const VkPhysicalDeviceLimits& getLimits() const;
	VkSampleCountFlags getSampleCounts() const;
};

using DispatchablePhysicalDevice = DispatchableObject<PhysicalDevice, VkPhysicalDevice>;

static inline PhysicalDevice* Cast(VkPhysicalDevice object)
{
	return DispatchablePhysicalDevice::Cast(object);
}

} // namespace vk

#endif // VK_PHYSICAL_DEVICE_HPP_
