blob: fcaec61227e24227d99c9b2d835009a4a10aa1d5 [file] [log] [blame]
Jesse Halld02edcb2015-09-08 07:44:48 -07001/*
2 * Copyright 2015 The Android Open Source Project
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 */
16
Jesse Hall04f4f472015-08-16 19:51:04 -070017#ifndef LIBVULKAN_LOADER_H
18#define LIBVULKAN_LOADER_H 1
19
20#define VK_PROTOTYPES
21#include <vulkan/vulkan.h>
Jesse Hallb1352bc2015-09-04 16:12:33 -070022#include <vulkan/vk_ext_khr_swapchain.h>
23#include <vulkan/vk_ext_khr_device_swapchain.h>
24#include <vulkan/vk_ext_android_native_buffer.h>
Jesse Hall04f4f472015-08-16 19:51:04 -070025
26namespace vulkan {
27
Jesse Hallb1352bc2015-09-04 16:12:33 -070028// TODO(jessehall): The InstanceVtbl and DeviceVtbl both have a set of
29// functions used in the app->layers/loader interface, and a different set of
30// functions used only in the loader->driver interface. We should probably
31// split them into two structures: one used for dispatch of application calls,
32// and one to hold the driver entry points.
33
Jesse Hall04f4f472015-08-16 19:51:04 -070034struct InstanceVtbl {
35 // clang-format off
36 VkInstance instance;
37
38 PFN_vkCreateInstance CreateInstance;
39 PFN_vkDestroyInstance DestroyInstance;
40 PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
41 PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices;
42
43 PFN_vkGetPhysicalDeviceFeatures GetPhysicalDeviceFeatures;
44 PFN_vkGetPhysicalDeviceFormatProperties GetPhysicalDeviceFormatProperties;
45 PFN_vkGetPhysicalDeviceImageFormatProperties GetPhysicalDeviceImageFormatProperties;
Jesse Hall04f4f472015-08-16 19:51:04 -070046 PFN_vkGetPhysicalDeviceProperties GetPhysicalDeviceProperties;
Jesse Hall5ae3abb2015-10-08 14:00:22 -070047 PFN_vkGetPhysicalDeviceQueueFamilyProperties GetPhysicalDeviceQueueFamilyProperties;
Jesse Hall04f4f472015-08-16 19:51:04 -070048 PFN_vkGetPhysicalDeviceMemoryProperties GetPhysicalDeviceMemoryProperties;
49 PFN_vkCreateDevice CreateDevice;
Jesse Hall5ae3abb2015-10-08 14:00:22 -070050 PFN_vkEnumerateDeviceExtensionProperties EnumerateDeviceExtensionProperties;
51 PFN_vkEnumerateDeviceLayerProperties EnumerateDeviceLayerProperties;
Jesse Hall04f4f472015-08-16 19:51:04 -070052 PFN_vkGetPhysicalDeviceSparseImageFormatProperties GetPhysicalDeviceSparseImageFormatProperties;
Jesse Hallb1352bc2015-09-04 16:12:33 -070053
54 // Layers and loader only, not implemented by drivers
55 PFN_vkGetPhysicalDeviceSurfaceSupportKHR GetPhysicalDeviceSurfaceSupportKHR;
Jesse Hall04f4f472015-08-16 19:51:04 -070056 // clang-format on
57};
58
59struct DeviceVtbl {
60 void* device;
61
62 PFN_vkGetDeviceProcAddr GetDeviceProcAddr;
63 PFN_vkDestroyDevice DestroyDevice;
64 PFN_vkGetDeviceQueue GetDeviceQueue;
65 PFN_vkDeviceWaitIdle DeviceWaitIdle;
66 PFN_vkAllocMemory AllocMemory;
67 PFN_vkFreeMemory FreeMemory;
68 PFN_vkMapMemory MapMemory;
69 PFN_vkUnmapMemory UnmapMemory;
70 PFN_vkFlushMappedMemoryRanges FlushMappedMemoryRanges;
71 PFN_vkInvalidateMappedMemoryRanges InvalidateMappedMemoryRanges;
72 PFN_vkGetDeviceMemoryCommitment GetDeviceMemoryCommitment;
73 PFN_vkBindBufferMemory BindBufferMemory;
74 PFN_vkBindImageMemory BindImageMemory;
75 PFN_vkGetBufferMemoryRequirements GetBufferMemoryRequirements;
76 PFN_vkGetImageMemoryRequirements GetImageMemoryRequirements;
77 PFN_vkGetImageSparseMemoryRequirements GetImageSparseMemoryRequirements;
78 PFN_vkCreateFence CreateFence;
79 PFN_vkDestroyFence DestroyFence;
80 PFN_vkResetFences ResetFences;
81 PFN_vkGetFenceStatus GetFenceStatus;
82 PFN_vkWaitForFences WaitForFences;
83 PFN_vkCreateSemaphore CreateSemaphore;
84 PFN_vkDestroySemaphore DestroySemaphore;
85 PFN_vkCreateEvent CreateEvent;
86 PFN_vkDestroyEvent DestroyEvent;
87 PFN_vkGetEventStatus GetEventStatus;
88 PFN_vkSetEvent SetEvent;
89 PFN_vkResetEvent ResetEvent;
90 PFN_vkCreateQueryPool CreateQueryPool;
91 PFN_vkDestroyQueryPool DestroyQueryPool;
92 PFN_vkGetQueryPoolResults GetQueryPoolResults;
93 PFN_vkCreateBuffer CreateBuffer;
94 PFN_vkDestroyBuffer DestroyBuffer;
95 PFN_vkCreateBufferView CreateBufferView;
96 PFN_vkDestroyBufferView DestroyBufferView;
97 PFN_vkCreateImage CreateImage;
98 PFN_vkDestroyImage DestroyImage;
99 PFN_vkGetImageSubresourceLayout GetImageSubresourceLayout;
100 PFN_vkCreateImageView CreateImageView;
101 PFN_vkDestroyImageView DestroyImageView;
Jesse Hall04f4f472015-08-16 19:51:04 -0700102 PFN_vkCreateShaderModule CreateShaderModule;
103 PFN_vkDestroyShaderModule DestroyShaderModule;
104 PFN_vkCreateShader CreateShader;
105 PFN_vkDestroyShader DestroyShader;
106 PFN_vkCreatePipelineCache CreatePipelineCache;
107 PFN_vkDestroyPipelineCache DestroyPipelineCache;
108 PFN_vkGetPipelineCacheSize GetPipelineCacheSize;
109 PFN_vkGetPipelineCacheData GetPipelineCacheData;
110 PFN_vkMergePipelineCaches MergePipelineCaches;
111 PFN_vkCreateGraphicsPipelines CreateGraphicsPipelines;
112 PFN_vkCreateComputePipelines CreateComputePipelines;
113 PFN_vkDestroyPipeline DestroyPipeline;
114 PFN_vkCreatePipelineLayout CreatePipelineLayout;
115 PFN_vkDestroyPipelineLayout DestroyPipelineLayout;
116 PFN_vkCreateSampler CreateSampler;
117 PFN_vkDestroySampler DestroySampler;
118 PFN_vkCreateDescriptorSetLayout CreateDescriptorSetLayout;
119 PFN_vkDestroyDescriptorSetLayout DestroyDescriptorSetLayout;
120 PFN_vkCreateDescriptorPool CreateDescriptorPool;
121 PFN_vkDestroyDescriptorPool DestroyDescriptorPool;
122 PFN_vkResetDescriptorPool ResetDescriptorPool;
123 PFN_vkAllocDescriptorSets AllocDescriptorSets;
124 PFN_vkFreeDescriptorSets FreeDescriptorSets;
125 PFN_vkUpdateDescriptorSets UpdateDescriptorSets;
Jesse Hall04f4f472015-08-16 19:51:04 -0700126 PFN_vkCreateFramebuffer CreateFramebuffer;
127 PFN_vkDestroyFramebuffer DestroyFramebuffer;
128 PFN_vkCreateRenderPass CreateRenderPass;
129 PFN_vkDestroyRenderPass DestroyRenderPass;
130 PFN_vkGetRenderAreaGranularity GetRenderAreaGranularity;
131 PFN_vkCreateCommandPool CreateCommandPool;
132 PFN_vkDestroyCommandPool DestroyCommandPool;
133 PFN_vkResetCommandPool ResetCommandPool;
134 PFN_vkCreateCommandBuffer CreateCommandBuffer;
135 PFN_vkDestroyCommandBuffer DestroyCommandBuffer;
136
137 PFN_vkQueueSubmit QueueSubmit;
138 PFN_vkQueueWaitIdle QueueWaitIdle;
139 PFN_vkQueueBindSparseBufferMemory QueueBindSparseBufferMemory;
140 PFN_vkQueueBindSparseImageOpaqueMemory QueueBindSparseImageOpaqueMemory;
141 PFN_vkQueueBindSparseImageMemory QueueBindSparseImageMemory;
142 PFN_vkQueueSignalSemaphore QueueSignalSemaphore;
143 PFN_vkQueueWaitSemaphore QueueWaitSemaphore;
144
145 PFN_vkBeginCommandBuffer BeginCommandBuffer;
146 PFN_vkEndCommandBuffer EndCommandBuffer;
147 PFN_vkResetCommandBuffer ResetCommandBuffer;
148 PFN_vkCmdBindPipeline CmdBindPipeline;
Jesse Hall5ae3abb2015-10-08 14:00:22 -0700149 PFN_vkCmdSetViewport CmdSetViewport;
150 PFN_vkCmdSetScissor CmdSetScissor;
151 PFN_vkCmdSetLineWidth CmdSetLineWidth;
152 PFN_vkCmdSetDepthBias CmdSetDepthBias;
153 PFN_vkCmdSetBlendConstants CmdSetBlendConstants;
154 PFN_vkCmdSetDepthBounds CmdSetDepthBounds;
155 PFN_vkCmdSetStencilCompareMask CmdSetStencilCompareMask;
156 PFN_vkCmdSetStencilWriteMask CmdSetStencilWriteMask;
157 PFN_vkCmdSetStencilReference CmdSetStencilReference;
Jesse Hall04f4f472015-08-16 19:51:04 -0700158 PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets;
159 PFN_vkCmdBindIndexBuffer CmdBindIndexBuffer;
160 PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers;
161 PFN_vkCmdDraw CmdDraw;
162 PFN_vkCmdDrawIndexed CmdDrawIndexed;
163 PFN_vkCmdDrawIndirect CmdDrawIndirect;
164 PFN_vkCmdDrawIndexedIndirect CmdDrawIndexedIndirect;
165 PFN_vkCmdDispatch CmdDispatch;
166 PFN_vkCmdDispatchIndirect CmdDispatchIndirect;
167 PFN_vkCmdCopyBuffer CmdCopyBuffer;
168 PFN_vkCmdCopyImage CmdCopyImage;
169 PFN_vkCmdBlitImage CmdBlitImage;
170 PFN_vkCmdCopyBufferToImage CmdCopyBufferToImage;
171 PFN_vkCmdCopyImageToBuffer CmdCopyImageToBuffer;
172 PFN_vkCmdUpdateBuffer CmdUpdateBuffer;
173 PFN_vkCmdFillBuffer CmdFillBuffer;
174 PFN_vkCmdClearColorImage CmdClearColorImage;
175 PFN_vkCmdClearDepthStencilImage CmdClearDepthStencilImage;
Jesse Hallae38f732015-11-19 21:32:50 -0800176 PFN_vkCmdClearAttachments CmdClearAttachments;
Jesse Hall04f4f472015-08-16 19:51:04 -0700177 PFN_vkCmdResolveImage CmdResolveImage;
178 PFN_vkCmdSetEvent CmdSetEvent;
179 PFN_vkCmdResetEvent CmdResetEvent;
180 PFN_vkCmdWaitEvents CmdWaitEvents;
181 PFN_vkCmdPipelineBarrier CmdPipelineBarrier;
182 PFN_vkCmdBeginQuery CmdBeginQuery;
183 PFN_vkCmdEndQuery CmdEndQuery;
184 PFN_vkCmdResetQueryPool CmdResetQueryPool;
185 PFN_vkCmdWriteTimestamp CmdWriteTimestamp;
186 PFN_vkCmdCopyQueryPoolResults CmdCopyQueryPoolResults;
187 PFN_vkCmdPushConstants CmdPushConstants;
188 PFN_vkCmdBeginRenderPass CmdBeginRenderPass;
189 PFN_vkCmdNextSubpass CmdNextSubpass;
190 PFN_vkCmdEndRenderPass CmdEndRenderPass;
191 PFN_vkCmdExecuteCommands CmdExecuteCommands;
Jesse Hallb1352bc2015-09-04 16:12:33 -0700192
193 // Layers and loader only, not implemented by drivers
194 PFN_vkGetSurfacePropertiesKHR GetSurfacePropertiesKHR;
195 PFN_vkGetSurfaceFormatsKHR GetSurfaceFormatsKHR;
196 PFN_vkGetSurfacePresentModesKHR GetSurfacePresentModesKHR;
197 PFN_vkCreateSwapchainKHR CreateSwapchainKHR;
198 PFN_vkDestroySwapchainKHR DestroySwapchainKHR;
199 PFN_vkGetSwapchainImagesKHR GetSwapchainImagesKHR;
200 PFN_vkAcquireNextImageKHR AcquireNextImageKHR;
201 PFN_vkQueuePresentKHR QueuePresentKHR;
202
203 // Implemented only by drivers, not by layers or the loader
Jesse Hall70f93352015-11-04 09:41:31 -0800204 PFN_vkGetSwapchainGrallocUsageANDROID GetSwapchainGrallocUsageANDROID;
Jesse Hallab9aeef2015-11-04 10:56:20 -0800205 PFN_vkAcquireImageANDROID AcquireImageANDROID;
206 PFN_vkQueueSignalReleaseImageANDROID QueueSignalReleaseImageANDROID;
Jesse Hallb1352bc2015-09-04 16:12:33 -0700207 PFN_vkImportNativeFenceANDROID ImportNativeFenceANDROID;
208 PFN_vkQueueSignalNativeFenceANDROID QueueSignalNativeFenceANDROID;
Jesse Hall04f4f472015-08-16 19:51:04 -0700209};
210
211// -----------------------------------------------------------------------------
212// loader.cpp
213
Jesse Hall5ae3abb2015-10-08 14:00:22 -0700214VkResult EnumerateInstanceExtensionProperties(
215 const char* layer_name,
216 uint32_t* count,
217 VkExtensionProperties* properties);
218VkResult EnumerateInstanceLayerProperties(uint32_t* count,
219 VkLayerProperties* properties);
Jesse Hall04f4f472015-08-16 19:51:04 -0700220VkResult CreateInstance(const VkInstanceCreateInfo* create_info,
221 VkInstance* instance);
222PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* name);
223PFN_vkVoidFunction GetDeviceProcAddr(VkDevice drv_device, const char* name);
Jesse Hall606a54e2015-11-19 22:17:28 -0800224void GetDeviceQueue(VkDevice drv_device,
225 uint32_t family,
226 uint32_t index,
227 VkQueue* out_queue);
Jesse Hallc7a6eb52015-08-31 12:52:03 -0700228VkResult CreateCommandBuffer(VkDevice device,
229 const VkCmdBufferCreateInfo* create_info,
230 VkCmdBuffer* out_cmdbuf);
Jesse Hall04f4f472015-08-16 19:51:04 -0700231VkResult DestroyDevice(VkDevice drv_device);
232
Jesse Halld7b994a2015-09-07 14:17:37 -0700233void* AllocDeviceMem(VkDevice device,
234 size_t size,
235 size_t align,
236 VkSystemAllocType type);
237void FreeDeviceMem(VkDevice device, void* ptr);
238const DeviceVtbl& GetDriverVtbl(VkDevice device);
239const DeviceVtbl& GetDriverVtbl(VkQueue queue);
240
Jesse Hall04f4f472015-08-16 19:51:04 -0700241// -----------------------------------------------------------------------------
242// get_proc_addr.cpp
243
244PFN_vkVoidFunction GetGlobalInstanceProcAddr(const char* name);
245PFN_vkVoidFunction GetGlobalDeviceProcAddr(const char* name);
246PFN_vkVoidFunction GetSpecificInstanceProcAddr(const InstanceVtbl* vtbl,
247 const char* name);
248PFN_vkVoidFunction GetSpecificDeviceProcAddr(const DeviceVtbl* vtbl,
249 const char* name);
250
251bool LoadInstanceVtbl(VkInstance instance,
Michael Lentine03c64b02015-08-26 18:27:26 -0500252 VkInstance next_instance,
Jesse Hall04f4f472015-08-16 19:51:04 -0700253 PFN_vkGetInstanceProcAddr get_proc_addr,
254 InstanceVtbl& vtbl);
255bool LoadDeviceVtbl(VkDevice device,
Michael Lentine03c64b02015-08-26 18:27:26 -0500256 VkDevice next_device,
Jesse Hall04f4f472015-08-16 19:51:04 -0700257 PFN_vkGetDeviceProcAddr get_proc_addr,
258 DeviceVtbl& vtbl);
259
Jesse Hallb1352bc2015-09-04 16:12:33 -0700260// -----------------------------------------------------------------------------
261// swapchain.cpp
262
263VkResult GetPhysicalDeviceSurfaceSupportKHR(
264 VkPhysicalDevice pdev,
265 uint32_t queue_family,
266 const VkSurfaceDescriptionKHR* surface_desc,
267 VkBool32* supported);
268VkResult GetSurfacePropertiesKHR(VkDevice device,
269 const VkSurfaceDescriptionKHR* surface_desc,
270 VkSurfacePropertiesKHR* properties);
271VkResult GetSurfaceFormatsKHR(VkDevice device,
272 const VkSurfaceDescriptionKHR* surface_desc,
273 uint32_t* count,
274 VkSurfaceFormatKHR* formats);
275VkResult GetSurfacePresentModesKHR(VkDevice device,
276 const VkSurfaceDescriptionKHR* surface_desc,
277 uint32_t* count,
278 VkPresentModeKHR* modes);
279VkResult CreateSwapchainKHR(VkDevice device,
280 const VkSwapchainCreateInfoKHR* create_info,
Jesse Halld7b994a2015-09-07 14:17:37 -0700281 VkSwapchainKHR* swapchain_handle);
282VkResult DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain_handle);
Jesse Hallb1352bc2015-09-04 16:12:33 -0700283VkResult GetSwapchainImagesKHR(VkDevice device,
Jesse Halld7b994a2015-09-07 14:17:37 -0700284 VkSwapchainKHR swapchain_handle,
Jesse Hallb1352bc2015-09-04 16:12:33 -0700285 uint32_t* count,
Jesse Halld7b994a2015-09-07 14:17:37 -0700286 VkImage* images);
Jesse Hallb1352bc2015-09-04 16:12:33 -0700287VkResult AcquireNextImageKHR(VkDevice device,
Jesse Halld7b994a2015-09-07 14:17:37 -0700288 VkSwapchainKHR swapchain_handle,
Jesse Hallb1352bc2015-09-04 16:12:33 -0700289 uint64_t timeout,
290 VkSemaphore semaphore,
291 uint32_t* image_index);
292VkResult QueuePresentKHR(VkQueue queue, VkPresentInfoKHR* present_info);
293
Jesse Hall04f4f472015-08-16 19:51:04 -0700294} // namespace vulkan
295
296#endif // LIBVULKAN_LOADER_H