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

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
