// 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_CONFIG_HPP_
#define VK_CONFIG_HPP_

#include "Version.hpp"

#include "Vulkan/VulkanPlatform.hpp"
#include "spirv-tools/libspirv.h"

namespace vk {

// Note: Constant array initialization requires a string literal.
//       constexpr char* or char[] does not work for that purpose.
#define SWIFTSHADER_DEVICE_NAME "SwiftShader Device"  // Max length: VK_MAX_PHYSICAL_DEVICE_NAME_SIZE
#define SWIFTSHADER_UUID "SwiftShaderUUID"            // Max length: VK_UUID_SIZE (16)

const spv_target_env SPIRV_VERSION = SPV_ENV_VULKAN_1_2;

enum
{
	API_VERSION = VK_API_VERSION_1_2,
	DRIVER_VERSION = VK_MAKE_VERSION(MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION),
	VENDOR_ID = 0x1AE0,  // Google, Inc.: https://pcisig.com/google-inc-1
	DEVICE_ID = 0xC0DE,  // SwiftShader (placeholder)
};

enum
{
	// Alignment of all Vulkan objects, pools, device memory, images, buffers, descriptors.
	REQUIRED_MEMORY_ALIGNMENT = 16,  // 16 bytes for 128-bit vector types.

	MIN_TEXEL_BUFFER_OFFSET_ALIGNMENT = 256,
	MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 256,
	MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT = 256,

	MEMORY_TYPE_GENERIC_BIT = 0x1,  // Generic system memory.
};

enum
{
	MAX_IMAGE_LEVELS_1D = 14,
	MAX_IMAGE_LEVELS_2D = 14,
	MAX_IMAGE_LEVELS_3D = 12,
	MAX_IMAGE_LEVELS_CUBE = 14,
	MAX_IMAGE_ARRAY_LAYERS = 2048,
	MAX_SAMPLER_LOD_BIAS = 15,
};

enum
{
	MAX_BOUND_DESCRIPTOR_SETS = 4,
	MAX_VERTEX_INPUT_BINDINGS = 16,
	MAX_PUSH_CONSTANT_SIZE = 128,
};

enum
{
	MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC = 8,
	MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC = 4,
	MAX_DESCRIPTOR_SET_COMBINED_BUFFERS_DYNAMIC =
	    MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC +
	    MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC,
};

enum
{
	MAX_POINT_SIZE = 1023,
};

constexpr int MAX_SAMPLER_ALLOCATION_COUNT = 4000;

constexpr int SUBPIXEL_PRECISION_BITS = 4;
constexpr float SUBPIXEL_PRECISION_FACTOR = static_cast<float>(1 << SUBPIXEL_PRECISION_BITS);
constexpr int SUBPIXEL_PRECISION_MASK = 0xFFFFFFFF >> (32 - SUBPIXEL_PRECISION_BITS);

}  // namespace vk

#if defined(__linux__) && !defined(__ANDROID__)
#	define SWIFTSHADER_EXTERNAL_MEMORY_OPAQUE_FD 1
#	define SWIFTSHADER_EXTERNAL_SEMAPHORE_OPAQUE_FD 1
#elif defined(__ANDROID__)
#	define SWIFTSHADER_EXTERNAL_SEMAPHORE_OPAQUE_FD 1
#endif
#if defined(__APPLE__)
#	define SWIFTSHADER_EXTERNAL_MEMORY_OPAQUE_FD 1
#endif

constexpr VkDeviceSize MAX_MEMORY_ALLOCATION_SIZE = 0x40000000ull;  // 0x40000000 = 1 GiB

// Memory offset calculations in 32-bit SIMD elements limit us to addressing at most 4 GiB.
// Signed arithmetic further restricts it to 2 GiB.
static_assert(MAX_MEMORY_ALLOCATION_SIZE <= 0x80000000ull, "maxMemoryAllocationSize must not exceed 2 GiB");

#endif  // VK_CONFIG_HPP_
