// Copyright 2021 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 "VkDeviceMemoryExternalHost.hpp"

ExternalMemoryHost::AllocateInfo::AllocateInfo(const vk::DeviceMemory::ExtendedAllocationInfo &extendedAllocationInfo)
{
	if(extendedAllocationInfo.importMemoryHostPointerInfo)
	{
		if((extendedAllocationInfo.importMemoryHostPointerInfo->handleType != VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT) &&
		   (extendedAllocationInfo.importMemoryHostPointerInfo->handleType != VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT))
		{
			UNSUPPORTED("extendedAllocationInfo.importMemoryHostPointerInfo->handleType, %d",
			            int(extendedAllocationInfo.importMemoryHostPointerInfo->handleType));
		}
		hostPointer = extendedAllocationInfo.importMemoryHostPointerInfo->pHostPointer;
		supported = true;
	}
}

bool ExternalMemoryHost::SupportsAllocateInfo(const vk::DeviceMemory::ExtendedAllocationInfo &extendedAllocationInfo)
{
	AllocateInfo info(extendedAllocationInfo);
	return info.supported;
}

ExternalMemoryHost::ExternalMemoryHost(const VkMemoryAllocateInfo *pCreateInfo, void *mem, const DeviceMemory::ExtendedAllocationInfo &extendedAllocationInfo, vk::Device *pDevice)
    : vk::DeviceMemory(pCreateInfo, pDevice)
    , allocateInfo(extendedAllocationInfo)
{}

VkResult ExternalMemoryHost::allocateBuffer()
{
	if(allocateInfo.supported)
	{
		buffer = allocateInfo.hostPointer;
		return VK_SUCCESS;
	}
	return VK_ERROR_INVALID_EXTERNAL_HANDLE;
}

void ExternalMemoryHost::freeBuffer()
{}

VkExternalMemoryHandleTypeFlagBits ExternalMemoryHost::getFlagBit() const
{
	return typeFlagBit;
}