1 // Copyright 2018 The SwiftShader Authors. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef VK_CONFIG_HPP_
16 #define VK_CONFIG_HPP_
17 
18 #include "Version.hpp"
19 
20 #include "Vulkan/VulkanPlatform.hpp"
21 #include "spirv-tools/libspirv.h"
22 
23 namespace vk {
24 
25 // Note: Constant array initialization requires a string literal.
26 //       constexpr char* or char[] does not work for that purpose.
27 #define SWIFTSHADER_DEVICE_NAME "SwiftShader Device"  // Max length: VK_MAX_PHYSICAL_DEVICE_NAME_SIZE
28 #define SWIFTSHADER_UUID "SwiftShaderUUID"            // Max length: VK_UUID_SIZE (16)
29 
30 const spv_target_env SPIRV_VERSION = SPV_ENV_VULKAN_1_2;
31 
32 enum
33 {
34 	API_VERSION = VK_API_VERSION_1_2,
35 	DRIVER_VERSION = VK_MAKE_VERSION(MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION),
36 	VENDOR_ID = 0x1AE0,  // Google, Inc.: https://pcisig.com/google-inc-1
37 	DEVICE_ID = 0xC0DE,  // SwiftShader (placeholder)
38 };
39 
40 enum
41 {
42 	// Alignment of all Vulkan objects, pools, device memory, images, buffers, descriptors.
43 	REQUIRED_MEMORY_ALIGNMENT = 16,  // 16 bytes for 128-bit vector types.
44 
45 	MIN_TEXEL_BUFFER_OFFSET_ALIGNMENT = 256,
46 	MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 256,
47 	MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT = 256,
48 
49 	MEMORY_TYPE_GENERIC_BIT = 0x1,  // Generic system memory.
50 };
51 
52 enum
53 {
54 	MAX_IMAGE_LEVELS_1D = 14,
55 	MAX_IMAGE_LEVELS_2D = 14,
56 	MAX_IMAGE_LEVELS_3D = 11,
57 	MAX_IMAGE_LEVELS_CUBE = 14,
58 	MAX_IMAGE_ARRAY_LAYERS = 2048,
59 	MAX_SAMPLER_LOD_BIAS = 15,
60 };
61 
62 enum
63 {
64 	MAX_BOUND_DESCRIPTOR_SETS = 4,
65 	MAX_VERTEX_INPUT_BINDINGS = 16,
66 	MAX_PUSH_CONSTANT_SIZE = 128,
67 };
68 
69 enum
70 {
71 	MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC = 8,
72 	MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC = 4,
73 	MAX_DESCRIPTOR_SET_COMBINED_BUFFERS_DYNAMIC =
74 	    MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC +
75 	    MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC,
76 };
77 
78 enum
79 {
80 	MAX_POINT_SIZE = 1023,
81 };
82 
83 constexpr int SUBPIXEL_PRECISION_BITS = 4;
84 constexpr float SUBPIXEL_PRECISION_FACTOR = static_cast<float>(1 << SUBPIXEL_PRECISION_BITS);
85 constexpr int SUBPIXEL_PRECISION_MASK = 0xFFFFFFFF >> (32 - SUBPIXEL_PRECISION_BITS);
86 
87 }  // namespace vk
88 
89 #if defined(__linux__) && !defined(__ANDROID__)
90 #	define SWIFTSHADER_EXTERNAL_MEMORY_OPAQUE_FD 1
91 #	define SWIFTSHADER_EXTERNAL_SEMAPHORE_OPAQUE_FD 1
92 #elif defined(__ANDROID__)
93 #	define SWIFTSHADER_EXTERNAL_SEMAPHORE_OPAQUE_FD 1
94 #endif
95 #if defined(__APPLE__)
96 #	define SWIFTSHADER_EXTERNAL_MEMORY_OPAQUE_FD 1
97 #endif
98 
99 constexpr VkDeviceSize MAX_MEMORY_ALLOCATION_SIZE = 0x40000000ull;  // 0x40000000 = 1 GiB
100 
101 // Memory offset calculations in 32-bit SIMD elements limit us to addressing at most 4 GiB.
102 // Signed arithmetic further restricts it to 2 GiB.
103 static_assert(MAX_MEMORY_ALLOCATION_SIZE <= 0x80000000ull, "maxMemoryAllocationSize must not exceed 2 GiB");
104 
105 #endif  // VK_CONFIG_HPP_
106