1 // Copyright (C) 2018 The Android Open Source Project
2 // Copyright (C) 2018 Google Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 #pragma once
16
17 #include <vulkan/vulkan.h>
18
19 #ifdef __cplusplus
20 #include <algorithm>
21 extern "C" {
22 #endif
23
24 #define VK_ANDROID_native_buffer 1
25 #define VK_ANDROID_NATIVE_BUFFER_EXTENSION_NUMBER 11
26
27 /* NOTE ON VK_ANDROID_NATIVE_BUFFER_SPEC_VERSION 6
28 *
29 * This version of the extension transitions from gralloc0 to gralloc1 usage
30 * flags (int -> 2x uint64_t). The WSI implementation will temporarily continue
31 * to fill out deprecated fields in VkNativeBufferANDROID, and will call the
32 * deprecated vkGetSwapchainGrallocUsageANDROID if the new
33 * vkGetSwapchainGrallocUsage2ANDROID is not supported. This transitionary
34 * backwards-compatibility support is temporary, and will likely be removed in
35 * (along with all gralloc0 support) in a future release.
36 */
37 #define VK_ANDROID_NATIVE_BUFFER_SPEC_VERSION 7
38 #define VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME "VK_ANDROID_native_buffer"
39
40 #define VK_ANDROID_NATIVE_BUFFER_ENUM(type,id) ((type)(1000000000 + (1000 * (VK_ANDROID_NATIVE_BUFFER_EXTENSION_NUMBER - 1)) + (id)))
41 #define VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID VK_ANDROID_NATIVE_BUFFER_ENUM(VkStructureType, 0)
42 #define VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID VK_ANDROID_NATIVE_BUFFER_ENUM(VkStructureType, 1)
43 #define VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID VK_ANDROID_NATIVE_BUFFER_ENUM(VkStructureType, 2)
44
45 typedef enum VkSwapchainImageUsageFlagBitsANDROID {
46 VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID = 0x00000001,
47 VK_SWAPCHAIN_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
48 } VkSwapchainImageUsageFlagBitsANDROID;
49 typedef VkFlags VkSwapchainImageUsageFlagsANDROID;
50
51 typedef struct {
52 VkStructureType sType; // must be VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID
53 const void* pNext;
54
55 // Buffer handle and stride returned from gralloc alloc()
56 const uint32_t* handle;
57 int stride;
58
59 // Gralloc format and usage requested when the buffer was allocated.
60 int format;
61 int usage; // DEPRECATED in SPEC_VERSION 6
62 // -- Added in SPEC_VERSION 6 --
63 uint64_t consumer;
64 uint64_t producer;
65 } VkNativeBufferANDROID;
66
67 typedef struct {
68 VkStructureType sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID
69 const void* pNext;
70
71 VkSwapchainImageUsageFlagsANDROID usage;
72 } VkSwapchainImageCreateInfoANDROID;
73
74 typedef struct {
75 VkStructureType sType; // must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID
76 const void* pNext;
77
78 VkBool32 sharedImage;
79 } VkPhysicalDevicePresentationPropertiesANDROID;
80
81 // -- DEPRECATED in SPEC_VERSION 6 --
82 typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainGrallocUsageANDROID)(VkDevice device, VkFormat format, VkImageUsageFlags imageUsage, int* grallocUsage);
83 // -- ADDED in SPEC_VERSION 6 --
84 typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainGrallocUsage2ANDROID)(VkDevice device, VkFormat format, VkImageUsageFlags imageUsage, VkSwapchainImageUsageFlagsANDROID swapchainImageUsage, uint64_t* grallocConsumerUsage, uint64_t* grallocProducerUsage);
85 typedef VkResult (VKAPI_PTR *PFN_vkAcquireImageANDROID)(VkDevice device, VkImage image, int nativeFenceFd, VkSemaphore semaphore, VkFence fence);
86 typedef VkResult (VKAPI_PTR *PFN_vkQueueSignalReleaseImageANDROID)(VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image, int* pNativeFenceFd);
87
88 #define VK_GOOGLE_address_space 1
89
90 typedef VkResult (VKAPI_PTR *PFN_vkMapMemoryIntoAddressSpaceGOOGLE)(VkDevice device, VkDeviceMemory memory, uint64_t* pAddress);
91
92 #define VK_GOOGLE_gfxstream 1
93 #define VK_GOOGLE_GFXSTREAM_EXTENSION_NUMBER 386
94
95 #define VK_GOOGLE_GFXSTREAM_ENUM(type,id) ((type)(1000000000 + (1000 * (VK_GOOGLE_GFXSTREAM_EXTENSION_NUMBER - 1)) + (id)))
96 #define VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE VK_GOOGLE_GFXSTREAM_ENUM(VkStructureType, 0)
97 #define VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE VK_GOOGLE_GFXSTREAM_ENUM(VkStructureType, 1)
98 #define VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE VK_GOOGLE_GFXSTREAM_ENUM(VkStructureType, 2)
99
100 typedef struct {
101 VkStructureType sType; // must be VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE
102 const void* pNext;
103 uint32_t colorBuffer;
104 } VkImportColorBufferGOOGLE;
105
106 typedef struct {
107 VkStructureType sType; // must be VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE
108 const void* pNext;
109 uint64_t physicalAddress;
110 VkDeviceSize size;
111 VkFormat format;
112 VkImageTiling tiling;
113 uint32_t tilingParameter;
114 } VkImportPhysicalAddressGOOGLE;
115
116 typedef struct {
117 VkStructureType sType; // must be VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE
118 const void* pNext;
119 uint32_t buffer;
120 } VkImportBufferGOOGLE;
121
122 typedef VkResult (VKAPI_PTR *PFN_vkRegisterImageColorBufferGOOGLE)(VkDevice device, VkImage image, uint32_t colorBuffer);
123 typedef VkResult (VKAPI_PTR *PFN_vkRegisterBufferColorBufferGOOGLE)(VkDevice device, VkBuffer image, uint32_t colorBuffer);
124
125 #define VK_GOOGLE_sized_descriptor_update_template 1
126
127 typedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSetWithTemplateSizedGOOGLE)(
128 VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate,
129 uint32_t imageInfoCount,
130 uint32_t bufferInfoCount,
131 uint32_t bufferViewCount,
132 const uint32_t* pImageInfoEntryIndices,
133 const uint32_t* pBufferInfoEntryIndices,
134 const uint32_t* pBufferViewEntryIndices,
135 const VkDescriptorImageInfo* pImageInfos,
136 const VkDescriptorBufferInfo* pBufferInfos,
137 const VkBufferView* pBufferViews);
138
139 #define VK_GOOGLE_async_command_buffers 1
140
141 typedef void (VKAPI_PTR *PFN_vkBeginCommandBufferAsyncGOOGLE)(
142 VkCommandBuffer commandBuffer,
143 const VkCommandBufferBeginInfo* pBeginInfo);
144 typedef void (VKAPI_PTR *PFN_vkEndCommandBufferAsyncGOOGLE)(
145 VkCommandBuffer commandBuffer);
146 typedef void (VKAPI_PTR *PFN_vkResetCommandBufferAsyncGOOGLE)(
147 VkCommandBuffer commandBuffer,
148 VkCommandBufferResetFlags flags);
149 typedef void (VKAPI_PTR *PFN_vkCommandBufferHostSyncGOOGLE)(
150 VkCommandBuffer commandBuffer,
151 uint32_t needHostSync,
152 uint32_t sequenceNumber);
153
154 #define VK_GOOGLE_create_resources_with_requirements 1
155
156 typedef void (VKAPI_PTR *PFN_vkCreateImageWithRequirementsGOOGLE)(
157 VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage, VkMemoryRequirements* pMemoryRequirements);
158 typedef void (VKAPI_PTR *PFN_vkCreateBufferWithRequirementsGOOGLE)(
159 VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer, VkMemoryRequirements* pMemoryRequirements);
160
161 #define VK_GOOGLE_address_space_info 1
162
163 typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryHostAddressInfoGOOGLE)(VkDevice device, VkDeviceMemory memory, uint64_t* pAddress, uint64_t* pSize);
164
165 #define VK_GOOGLE_free_memory_sync 1
166
167 typedef VkResult (VKAPI_PTR *PFN_vkFreeMemorySyncGOOGLE)(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator);
168
169 #ifndef VK_FUCHSIA_external_memory
170 #define VK_FUCHSIA_external_memory 1
171 #define VK_FUCHSIA_EXTERNAL_MEMORY_SPEC_VERSION 1
172 #define VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME "VK_FUCHSIA_external_memory"
173
174 typedef struct VkImportMemoryZirconHandleInfoFUCHSIA {
175 VkStructureType sType;
176 const void* pNext;
177 VkExternalMemoryHandleTypeFlagBits handleType;
178 uint32_t handle;
179 } VkImportMemoryZirconHandleInfoFUCHSIA;
180
181 typedef struct VkMemoryZirconHandlePropertiesFUCHSIA {
182 VkStructureType sType;
183 void* pNext;
184 uint32_t memoryTypeBits;
185 } VkMemoryZirconHandlePropertiesFUCHSIA;
186
187 typedef struct VkMemoryGetZirconHandleInfoFUCHSIA {
188 VkStructureType sType;
189 const void* pNext;
190 VkDeviceMemory memory;
191 VkExternalMemoryHandleTypeFlagBits handleType;
192 } VkMemoryGetZirconHandleInfoFUCHSIA;
193
194 // Deprecated
195 #define VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA \
196 ((VkStructureType)1001005000)
197 #define VK_STRUCTURE_TYPE_TEMP_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA \
198 ((VkStructureType)1001005001)
199 #define VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA \
200 ((VkExternalMemoryHandleTypeFlagBits)0x00100000)
201 #endif // VK_FUCHSIA_external_memory
202
203 // To be moved inside the ifdef above once spec is updated
204 #define VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA \
205 ((VkStructureType)1000364000)
206 #define VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA \
207 ((VkExternalMemoryHandleTypeFlagBits)0x00000800)
208
209 #ifndef VK_MVK_moltenvk
210 #define VK_MVK_moltenvk 1
211 #define VK_MVK_MOLTENVK_SPEC_VERSION 3
212 #define VK_MVK_MOLTENVK_EXTENSION_NAME "VK_MVK_moltenvk"
213
214 typedef void* MTLTextureRef;
215 typedef void* MTLBufferRef;
216
217 typedef void (VKAPI_PTR *PFN_vkGetMTLDeviceMVK)(VkPhysicalDevice physicalDevice, void** pMTLDevice);
218 typedef VkResult (VKAPI_PTR *PFN_vkSetMTLTextureMVK)(VkImage image, MTLTextureRef mtlTexture);
219 typedef void (VKAPI_PTR *PFN_vkGetMTLTextureMVK)(VkImage image, MTLTextureRef* pMTLTexture);
220 typedef void (VKAPI_PTR *PFN_vkGetMTLBufferMVK)(VkBuffer buffer, void** pMTLBuffer);
221 typedef VkResult (VKAPI_PTR *PFN_vkUseIOSurfaceMVK)(VkImage image, void* ioSurface);
222 typedef void (VKAPI_PTR *PFN_vkGetIOSurfaceMVK)(VkImage image, void** pIOSurface);
223
224 #endif // VK_MVK_moltenvk
225
226 // VulkanStream features
227 #define VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT (1 << 0)
228 #define VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT (1 << 1)
229 #define VULKAN_STREAM_FEATURE_SHADER_FLOAT16_INT8_BIT (1 << 2)
230
231 #ifndef VK_KHR_shader_float16_int8
232 // Stuff we advertised but didn't define the structs for it yet because
233 // we also needed to update our vulkan headers and xml
234 typedef struct VkPhysicalDeviceShaderFloat16Int8Features {
235 VkStructureType sType;
236 void* pNext;
237 VkBool32 shaderFloat16;
238 VkBool32 shaderInt8;
239 } VkPhysicalDeviceShaderFloat16Int8Features;
240
241 #define VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES \
242 ((VkStructureType)1000082000)
243
244 #define VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR \
245 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES
246
247 #define VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR \
248 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES
249
250 #define VK_KHR_shader_float16_int8 1
251 #define VK_KHR_SHADER_FLOAT16_INT8_SPEC_VERSION 1
252 #define VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME "VK_KHR_shader_float16_int8"
253 typedef VkPhysicalDeviceShaderFloat16Int8Features VkPhysicalDeviceShaderFloat16Int8FeaturesKHR;
254 typedef VkPhysicalDeviceShaderFloat16Int8Features VkPhysicalDeviceFloat16Int8FeaturesKHR;
255 #endif // VK_KHR_shader_float16_int8
256
257 #define VK_GOOGLE_gfxstream 1
258
259 #define VK_GOOGLE_async_queue_submit 1
260
261 typedef void (VKAPI_PTR *PFN_vkQueueHostSyncGOOGLE)(
262 VkQueue queue, uint32_t needHostSync, uint32_t sequenceNumber);
263 typedef void (VKAPI_PTR *PFN_vkQueueSubmitAsyncGOOGLE)(
264 VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
265 typedef void (VKAPI_PTR *PFN_vkQueueWaitIdleAsyncGOOGLE)(VkQueue queue);
266 typedef void (VKAPI_PTR *PFN_vkQueueBindSparseAsyncGOOGLE)(
267 VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence);
268
269 #define VK_GOOGLE_linear_image_layout 1
270
271 typedef VkResult (VKAPI_PTR *PFN_vkGetLinearImageLayoutGOOGLE)(VkDevice device, VkFormat format, VkDeviceSize* pOffset, VkDeviceSize* pRowPitchAlignment);
272
273 #define VK_GOOGLE_queue_submit_with_commands 1
274 typedef void (VKAPI_PTR *PFN_vkQueueFlushCommandsGOOGLE)(VkQueue queue, VkDeviceSize dataSize, const void* pData);
275 typedef void (VKAPI_PTR *PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)(VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools, uint32_t descriptorSetCount, const VkDescriptorSetLayout* pDescriptorSetLayouts, const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool, const uint32_t* pDescriptorSetPendingAllocation, const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount, const VkWriteDescriptorSet* pPendingDescriptorWrites);
276 typedef void (VKAPI_PTR *PFN_vkCollectDescriptorPoolIdsGOOGLE)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t* pPoolIdCount, uint64_t* pPoolIds);
277
278 #ifdef __cplusplus
279 } // extern "C"
280 #endif
281
282 #ifdef __cplusplus
283
284 template<class T, typename F>
arrayany(const T * arr,uint32_t begin,uint32_t end,const F & func)285 bool arrayany(const T* arr, uint32_t begin, uint32_t end, const F& func) {
286 const T* e = arr + end;
287 return std::find_if(arr + begin, e, func) != e;
288 }
289
290 #define DEFINE_ALIAS_FUNCTION(ORIGINAL_FN, ALIAS_FN) \
291 template <typename... Args> \
292 inline auto ALIAS_FN(Args&&... args) -> decltype(ORIGINAL_FN(std::forward<Args>(args)...)) { \
293 return ORIGINAL_FN(std::forward<Args>(args)...); \
294 }
295
296 #endif
297