blob: d0e476cb6bfd0ee2c7e3d6547a32159f38bb27c0 [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;
46 PFN_vkGetPhysicalDeviceLimits GetPhysicalDeviceLimits;
47 PFN_vkGetPhysicalDeviceProperties GetPhysicalDeviceProperties;
48 PFN_vkGetPhysicalDeviceQueueCount GetPhysicalDeviceQueueCount;
49 PFN_vkGetPhysicalDeviceQueueProperties GetPhysicalDeviceQueueProperties;
50 PFN_vkGetPhysicalDeviceMemoryProperties GetPhysicalDeviceMemoryProperties;
51 PFN_vkCreateDevice CreateDevice;
52 PFN_vkGetPhysicalDeviceExtensionProperties GetPhysicalDeviceExtensionProperties;
53 PFN_vkGetPhysicalDeviceLayerProperties GetPhysicalDeviceLayerProperties;
54 PFN_vkGetPhysicalDeviceSparseImageFormatProperties GetPhysicalDeviceSparseImageFormatProperties;
Jesse Hallb1352bc2015-09-04 16:12:33 -070055
56 // Layers and loader only, not implemented by drivers
57 PFN_vkGetPhysicalDeviceSurfaceSupportKHR GetPhysicalDeviceSurfaceSupportKHR;
Jesse Hall04f4f472015-08-16 19:51:04 -070058 // clang-format on
59};
60
61struct DeviceVtbl {
62 void* device;
63
64 PFN_vkGetDeviceProcAddr GetDeviceProcAddr;
65 PFN_vkDestroyDevice DestroyDevice;
66 PFN_vkGetDeviceQueue GetDeviceQueue;
67 PFN_vkDeviceWaitIdle DeviceWaitIdle;
68 PFN_vkAllocMemory AllocMemory;
69 PFN_vkFreeMemory FreeMemory;
70 PFN_vkMapMemory MapMemory;
71 PFN_vkUnmapMemory UnmapMemory;
72 PFN_vkFlushMappedMemoryRanges FlushMappedMemoryRanges;
73 PFN_vkInvalidateMappedMemoryRanges InvalidateMappedMemoryRanges;
74 PFN_vkGetDeviceMemoryCommitment GetDeviceMemoryCommitment;
75 PFN_vkBindBufferMemory BindBufferMemory;
76 PFN_vkBindImageMemory BindImageMemory;
77 PFN_vkGetBufferMemoryRequirements GetBufferMemoryRequirements;
78 PFN_vkGetImageMemoryRequirements GetImageMemoryRequirements;
79 PFN_vkGetImageSparseMemoryRequirements GetImageSparseMemoryRequirements;
80 PFN_vkCreateFence CreateFence;
81 PFN_vkDestroyFence DestroyFence;
82 PFN_vkResetFences ResetFences;
83 PFN_vkGetFenceStatus GetFenceStatus;
84 PFN_vkWaitForFences WaitForFences;
85 PFN_vkCreateSemaphore CreateSemaphore;
86 PFN_vkDestroySemaphore DestroySemaphore;
87 PFN_vkCreateEvent CreateEvent;
88 PFN_vkDestroyEvent DestroyEvent;
89 PFN_vkGetEventStatus GetEventStatus;
90 PFN_vkSetEvent SetEvent;
91 PFN_vkResetEvent ResetEvent;
92 PFN_vkCreateQueryPool CreateQueryPool;
93 PFN_vkDestroyQueryPool DestroyQueryPool;
94 PFN_vkGetQueryPoolResults GetQueryPoolResults;
95 PFN_vkCreateBuffer CreateBuffer;
96 PFN_vkDestroyBuffer DestroyBuffer;
97 PFN_vkCreateBufferView CreateBufferView;
98 PFN_vkDestroyBufferView DestroyBufferView;
99 PFN_vkCreateImage CreateImage;
100 PFN_vkDestroyImage DestroyImage;
101 PFN_vkGetImageSubresourceLayout GetImageSubresourceLayout;
102 PFN_vkCreateImageView CreateImageView;
103 PFN_vkDestroyImageView DestroyImageView;
104 PFN_vkCreateAttachmentView CreateAttachmentView;
105 PFN_vkDestroyAttachmentView DestroyAttachmentView;
106 PFN_vkCreateShaderModule CreateShaderModule;
107 PFN_vkDestroyShaderModule DestroyShaderModule;
108 PFN_vkCreateShader CreateShader;
109 PFN_vkDestroyShader DestroyShader;
110 PFN_vkCreatePipelineCache CreatePipelineCache;
111 PFN_vkDestroyPipelineCache DestroyPipelineCache;
112 PFN_vkGetPipelineCacheSize GetPipelineCacheSize;
113 PFN_vkGetPipelineCacheData GetPipelineCacheData;
114 PFN_vkMergePipelineCaches MergePipelineCaches;
115 PFN_vkCreateGraphicsPipelines CreateGraphicsPipelines;
116 PFN_vkCreateComputePipelines CreateComputePipelines;
117 PFN_vkDestroyPipeline DestroyPipeline;
118 PFN_vkCreatePipelineLayout CreatePipelineLayout;
119 PFN_vkDestroyPipelineLayout DestroyPipelineLayout;
120 PFN_vkCreateSampler CreateSampler;
121 PFN_vkDestroySampler DestroySampler;
122 PFN_vkCreateDescriptorSetLayout CreateDescriptorSetLayout;
123 PFN_vkDestroyDescriptorSetLayout DestroyDescriptorSetLayout;
124 PFN_vkCreateDescriptorPool CreateDescriptorPool;
125 PFN_vkDestroyDescriptorPool DestroyDescriptorPool;
126 PFN_vkResetDescriptorPool ResetDescriptorPool;
127 PFN_vkAllocDescriptorSets AllocDescriptorSets;
128 PFN_vkFreeDescriptorSets FreeDescriptorSets;
129 PFN_vkUpdateDescriptorSets UpdateDescriptorSets;
130 PFN_vkCreateDynamicViewportState CreateDynamicViewportState;
131 PFN_vkDestroyDynamicViewportState DestroyDynamicViewportState;
132 PFN_vkCreateDynamicRasterState CreateDynamicRasterState;
133 PFN_vkDestroyDynamicRasterState DestroyDynamicRasterState;
134 PFN_vkCreateDynamicColorBlendState CreateDynamicColorBlendState;
135 PFN_vkDestroyDynamicColorBlendState DestroyDynamicColorBlendState;
136 PFN_vkCreateDynamicDepthStencilState CreateDynamicDepthStencilState;
137 PFN_vkDestroyDynamicDepthStencilState DestroyDynamicDepthStencilState;
138 PFN_vkCreateFramebuffer CreateFramebuffer;
139 PFN_vkDestroyFramebuffer DestroyFramebuffer;
140 PFN_vkCreateRenderPass CreateRenderPass;
141 PFN_vkDestroyRenderPass DestroyRenderPass;
142 PFN_vkGetRenderAreaGranularity GetRenderAreaGranularity;
143 PFN_vkCreateCommandPool CreateCommandPool;
144 PFN_vkDestroyCommandPool DestroyCommandPool;
145 PFN_vkResetCommandPool ResetCommandPool;
146 PFN_vkCreateCommandBuffer CreateCommandBuffer;
147 PFN_vkDestroyCommandBuffer DestroyCommandBuffer;
148
149 PFN_vkQueueSubmit QueueSubmit;
150 PFN_vkQueueWaitIdle QueueWaitIdle;
151 PFN_vkQueueBindSparseBufferMemory QueueBindSparseBufferMemory;
152 PFN_vkQueueBindSparseImageOpaqueMemory QueueBindSparseImageOpaqueMemory;
153 PFN_vkQueueBindSparseImageMemory QueueBindSparseImageMemory;
154 PFN_vkQueueSignalSemaphore QueueSignalSemaphore;
155 PFN_vkQueueWaitSemaphore QueueWaitSemaphore;
156
157 PFN_vkBeginCommandBuffer BeginCommandBuffer;
158 PFN_vkEndCommandBuffer EndCommandBuffer;
159 PFN_vkResetCommandBuffer ResetCommandBuffer;
160 PFN_vkCmdBindPipeline CmdBindPipeline;
161 PFN_vkCmdBindDynamicViewportState CmdBindDynamicViewportState;
162 PFN_vkCmdBindDynamicRasterState CmdBindDynamicRasterState;
163 PFN_vkCmdBindDynamicColorBlendState CmdBindDynamicColorBlendState;
164 PFN_vkCmdBindDynamicDepthStencilState CmdBindDynamicDepthStencilState;
165 PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets;
166 PFN_vkCmdBindIndexBuffer CmdBindIndexBuffer;
167 PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers;
168 PFN_vkCmdDraw CmdDraw;
169 PFN_vkCmdDrawIndexed CmdDrawIndexed;
170 PFN_vkCmdDrawIndirect CmdDrawIndirect;
171 PFN_vkCmdDrawIndexedIndirect CmdDrawIndexedIndirect;
172 PFN_vkCmdDispatch CmdDispatch;
173 PFN_vkCmdDispatchIndirect CmdDispatchIndirect;
174 PFN_vkCmdCopyBuffer CmdCopyBuffer;
175 PFN_vkCmdCopyImage CmdCopyImage;
176 PFN_vkCmdBlitImage CmdBlitImage;
177 PFN_vkCmdCopyBufferToImage CmdCopyBufferToImage;
178 PFN_vkCmdCopyImageToBuffer CmdCopyImageToBuffer;
179 PFN_vkCmdUpdateBuffer CmdUpdateBuffer;
180 PFN_vkCmdFillBuffer CmdFillBuffer;
181 PFN_vkCmdClearColorImage CmdClearColorImage;
182 PFN_vkCmdClearDepthStencilImage CmdClearDepthStencilImage;
183 PFN_vkCmdClearColorAttachment CmdClearColorAttachment;
184 PFN_vkCmdClearDepthStencilAttachment CmdClearDepthStencilAttachment;
185 PFN_vkCmdResolveImage CmdResolveImage;
186 PFN_vkCmdSetEvent CmdSetEvent;
187 PFN_vkCmdResetEvent CmdResetEvent;
188 PFN_vkCmdWaitEvents CmdWaitEvents;
189 PFN_vkCmdPipelineBarrier CmdPipelineBarrier;
190 PFN_vkCmdBeginQuery CmdBeginQuery;
191 PFN_vkCmdEndQuery CmdEndQuery;
192 PFN_vkCmdResetQueryPool CmdResetQueryPool;
193 PFN_vkCmdWriteTimestamp CmdWriteTimestamp;
194 PFN_vkCmdCopyQueryPoolResults CmdCopyQueryPoolResults;
195 PFN_vkCmdPushConstants CmdPushConstants;
196 PFN_vkCmdBeginRenderPass CmdBeginRenderPass;
197 PFN_vkCmdNextSubpass CmdNextSubpass;
198 PFN_vkCmdEndRenderPass CmdEndRenderPass;
199 PFN_vkCmdExecuteCommands CmdExecuteCommands;
Jesse Hallb1352bc2015-09-04 16:12:33 -0700200
201 // Layers and loader only, not implemented by drivers
202 PFN_vkGetSurfacePropertiesKHR GetSurfacePropertiesKHR;
203 PFN_vkGetSurfaceFormatsKHR GetSurfaceFormatsKHR;
204 PFN_vkGetSurfacePresentModesKHR GetSurfacePresentModesKHR;
205 PFN_vkCreateSwapchainKHR CreateSwapchainKHR;
206 PFN_vkDestroySwapchainKHR DestroySwapchainKHR;
207 PFN_vkGetSwapchainImagesKHR GetSwapchainImagesKHR;
208 PFN_vkAcquireNextImageKHR AcquireNextImageKHR;
209 PFN_vkQueuePresentKHR QueuePresentKHR;
210
211 // Implemented only by drivers, not by layers or the loader
212 PFN_vkImportNativeFenceANDROID ImportNativeFenceANDROID;
213 PFN_vkQueueSignalNativeFenceANDROID QueueSignalNativeFenceANDROID;
Jesse Hall04f4f472015-08-16 19:51:04 -0700214};
215
216// -----------------------------------------------------------------------------
217// loader.cpp
218
219VkResult GetGlobalExtensionProperties(const char* layer_name,
220 uint32_t* count,
221 VkExtensionProperties* properties);
222VkResult GetGlobalLayerProperties(uint32_t* count,
223 VkLayerProperties* properties);
224VkResult CreateInstance(const VkInstanceCreateInfo* create_info,
225 VkInstance* instance);
226PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* name);
227PFN_vkVoidFunction GetDeviceProcAddr(VkDevice drv_device, const char* name);
228VkResult GetDeviceQueue(VkDevice drv_device,
229 uint32_t family,
230 uint32_t index,
231 VkQueue* out_queue);
Jesse Hallc7a6eb52015-08-31 12:52:03 -0700232VkResult CreateCommandBuffer(VkDevice device,
233 const VkCmdBufferCreateInfo* create_info,
234 VkCmdBuffer* out_cmdbuf);
Jesse Hall04f4f472015-08-16 19:51:04 -0700235VkResult DestroyDevice(VkDevice drv_device);
236
Jesse Halld7b994a2015-09-07 14:17:37 -0700237void* AllocDeviceMem(VkDevice device,
238 size_t size,
239 size_t align,
240 VkSystemAllocType type);
241void FreeDeviceMem(VkDevice device, void* ptr);
242const DeviceVtbl& GetDriverVtbl(VkDevice device);
243const DeviceVtbl& GetDriverVtbl(VkQueue queue);
244
Jesse Hall04f4f472015-08-16 19:51:04 -0700245// -----------------------------------------------------------------------------
246// get_proc_addr.cpp
247
248PFN_vkVoidFunction GetGlobalInstanceProcAddr(const char* name);
249PFN_vkVoidFunction GetGlobalDeviceProcAddr(const char* name);
250PFN_vkVoidFunction GetSpecificInstanceProcAddr(const InstanceVtbl* vtbl,
251 const char* name);
252PFN_vkVoidFunction GetSpecificDeviceProcAddr(const DeviceVtbl* vtbl,
253 const char* name);
254
255bool LoadInstanceVtbl(VkInstance instance,
256 PFN_vkGetInstanceProcAddr get_proc_addr,
257 InstanceVtbl& vtbl);
258bool LoadDeviceVtbl(VkDevice device,
259 PFN_vkGetDeviceProcAddr get_proc_addr,
260 DeviceVtbl& vtbl);
261
Jesse Hallb1352bc2015-09-04 16:12:33 -0700262// -----------------------------------------------------------------------------
263// swapchain.cpp
264
265VkResult GetPhysicalDeviceSurfaceSupportKHR(
266 VkPhysicalDevice pdev,
267 uint32_t queue_family,
268 const VkSurfaceDescriptionKHR* surface_desc,
269 VkBool32* supported);
270VkResult GetSurfacePropertiesKHR(VkDevice device,
271 const VkSurfaceDescriptionKHR* surface_desc,
272 VkSurfacePropertiesKHR* properties);
273VkResult GetSurfaceFormatsKHR(VkDevice device,
274 const VkSurfaceDescriptionKHR* surface_desc,
275 uint32_t* count,
276 VkSurfaceFormatKHR* formats);
277VkResult GetSurfacePresentModesKHR(VkDevice device,
278 const VkSurfaceDescriptionKHR* surface_desc,
279 uint32_t* count,
280 VkPresentModeKHR* modes);
281VkResult CreateSwapchainKHR(VkDevice device,
282 const VkSwapchainCreateInfoKHR* create_info,
Jesse Halld7b994a2015-09-07 14:17:37 -0700283 VkSwapchainKHR* swapchain_handle);
284VkResult DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain_handle);
Jesse Hallb1352bc2015-09-04 16:12:33 -0700285VkResult GetSwapchainImagesKHR(VkDevice device,
Jesse Halld7b994a2015-09-07 14:17:37 -0700286 VkSwapchainKHR swapchain_handle,
Jesse Hallb1352bc2015-09-04 16:12:33 -0700287 uint32_t* count,
Jesse Halld7b994a2015-09-07 14:17:37 -0700288 VkImage* images);
Jesse Hallb1352bc2015-09-04 16:12:33 -0700289VkResult AcquireNextImageKHR(VkDevice device,
Jesse Halld7b994a2015-09-07 14:17:37 -0700290 VkSwapchainKHR swapchain_handle,
Jesse Hallb1352bc2015-09-04 16:12:33 -0700291 uint64_t timeout,
292 VkSemaphore semaphore,
293 uint32_t* image_index);
294VkResult QueuePresentKHR(VkQueue queue, VkPresentInfoKHR* present_info);
295
Jesse Hall04f4f472015-08-16 19:51:04 -0700296} // namespace vulkan
297
298#endif // LIBVULKAN_LOADER_H