// 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.

#include "VkInstance.hpp"
#include "VkDestroy.hpp"

namespace vk {

Instance::Instance(const VkInstanceCreateInfo *pCreateInfo, void *mem, VkPhysicalDevice physicalDevice)
    : physicalDevice(physicalDevice)
{
}

void Instance::destroy(const VkAllocationCallbacks *pAllocator)
{
	vk::destroy(physicalDevice, pAllocator);
}

VkResult Instance::getPhysicalDevices(uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) const
{
	if(!pPhysicalDevices)
	{
		*pPhysicalDeviceCount = 1;
		return VK_SUCCESS;
	}

	if(*pPhysicalDeviceCount < 1)
	{
		return VK_INCOMPLETE;
	}

	pPhysicalDevices[0] = physicalDevice;
	*pPhysicalDeviceCount = 1;

	return VK_SUCCESS;
}

VkResult Instance::getPhysicalDeviceGroups(uint32_t *pPhysicalDeviceGroupCount,
                                           VkPhysicalDeviceGroupProperties *pPhysicalDeviceGroupProperties) const
{
	if(!pPhysicalDeviceGroupProperties)
	{
		*pPhysicalDeviceGroupCount = 1;
		return VK_SUCCESS;
	}

	if(*pPhysicalDeviceGroupCount < 1)
	{
		return VK_INCOMPLETE;
	}

	pPhysicalDeviceGroupProperties[0].physicalDeviceCount = 1;
	pPhysicalDeviceGroupProperties[0].physicalDevices[0] = physicalDevice;
	pPhysicalDeviceGroupProperties[0].subsetAllocation = VK_FALSE;
	*pPhysicalDeviceGroupCount = 1;

	return VK_SUCCESS;
}

}  // namespace vk
