2 * Copyright (C) 2015 Valve Corporation
3 * Copyright © 2016 S-Core Corporation
4 * Copyright © 2016-2017 Samsung Electronics co., Ltd. All Rights Reserved.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
25 * Author: Cody Northrop <cody@lunarg.com>
26 * Author: David Pinedo <david@lunarg.com>
27 * Author: Ian Elliott <ian@LunarG.com>
28 * Author: Tony Barbour <tony@LunarG.com>
31 #include "null-driver.h"
35 #include <vulkan/vk_icd.h>
37 #include <vulkan-wsi-tizen.h>
41 #define NULLDRV_LOG_FUNC \
45 printf("null driver: %s\n", __FUNCTION__); \
49 #define NULLDRV_LOG_FUNC do { } while (0)
55 VkResult (*get_memory_requirements)(struct nulldrv_base *base,
56 VkMemoryRequirements *mem_requirements);
60 struct nulldrv_base base;
63 enum nulldrv_ext_type {
64 NULLDRV_EXT_KHR_SWAPCHAIN,
66 NULLDRV_EXT_INVALID = NULLDRV_EXT_COUNT,
69 struct nulldrv_instance {
70 struct nulldrv_obj obj;
78 struct nulldrv_base base;
79 bool exts[NULLDRV_EXT_COUNT];
80 struct nulldrv_desc_ooxx *desc_ooxx;
81 struct nulldrv_queue *queues[1];
84 struct nulldrv_desc_ooxx {
85 uint32_t surface_desc_size;
86 uint32_t sampler_desc_size;
89 struct nulldrv_queue {
90 struct nulldrv_base base;
91 struct nulldrv_dev *dev;
94 struct nulldrv_rt_view {
95 struct nulldrv_obj obj;
98 struct nulldrv_fence {
99 struct nulldrv_obj obj;
103 struct nulldrv_obj obj;
109 VkSampleCountFlagBits samples;
111 tbm_surface_h tbm_surface;
115 struct nulldrv_base base;
116 struct nulldrv_bo *bo;
120 struct nulldrv_sampler {
121 struct nulldrv_obj obj;
124 struct nulldrv_shader_module {
125 struct nulldrv_obj obj;
128 struct nulldrv_pipeline_cache {
129 struct nulldrv_obj obj;
132 struct nulldrv_img_view {
133 struct nulldrv_obj obj;
134 struct nulldrv_img *img;
140 struct nulldrv_obj obj;
145 struct nulldrv_desc_layout {
146 struct nulldrv_obj obj;
149 struct nulldrv_pipeline_layout {
150 struct nulldrv_obj obj;
153 struct nulldrv_shader {
154 struct nulldrv_obj obj;
158 struct nulldrv_pipeline {
159 struct nulldrv_obj obj;
160 struct nulldrv_dev *dev;
163 struct nulldrv_dynamic_vp {
164 struct nulldrv_obj obj;
167 struct nulldrv_dynamic_line_width {
168 struct nulldrv_obj obj;
171 struct nulldrv_dynamic_depth_bias {
172 struct nulldrv_obj obj;
175 struct nulldrv_dynamic_blend {
176 struct nulldrv_obj obj;
179 struct nulldrv_dynamic_depth_bounds {
180 struct nulldrv_obj obj;
183 struct nulldrv_dynamic_stencil {
184 struct nulldrv_obj obj;
188 struct nulldrv_obj obj;
191 struct nulldrv_desc_pool {
192 struct nulldrv_obj obj;
193 struct nulldrv_dev *dev;
196 struct nulldrv_desc_set {
197 struct nulldrv_obj obj;
198 struct nulldrv_desc_ooxx *ooxx;
199 const struct nulldrv_desc_layout *layout;
202 struct nulldrv_framebuffer {
203 struct nulldrv_obj obj;
206 struct nulldrv_render_pass {
207 struct nulldrv_obj obj;
210 struct nulldrv_buf_view {
211 struct nulldrv_obj obj;
213 struct nulldrv_buf *buf;
221 struct nulldrv_display {
222 struct nulldrv_base base;
223 struct nulldrv_dev *dev;
226 struct nulldrv_swap_chain {
227 struct nulldrv_base base;
228 struct nulldrv_dev *dev;
231 static const VkExtensionProperties instance_extensions[NULLDRV_EXT_COUNT] =
234 .extensionName = VK_KHR_SURFACE_EXTENSION_NAME,
235 .specVersion = VK_KHR_SURFACE_SPEC_VERSION,
239 const VkExtensionProperties device_extensions[1] =
242 .extensionName = VK_KHR_SWAPCHAIN_EXTENSION_NAME,
243 .specVersion = VK_KHR_SWAPCHAIN_SPEC_VERSION,
247 static struct nulldrv_base *
248 nulldrv_base(void* base)
250 return (struct nulldrv_base *) base;
253 static struct nulldrv_base *
254 nulldrv_base_create(struct nulldrv_dev *dev,
256 VkDebugReportObjectTypeEXT type)
258 struct nulldrv_base *base;
261 obj_size = sizeof(*base);
263 VK_ASSERT(obj_size >= sizeof(*base));
265 base = (struct nulldrv_base*)malloc(obj_size);
269 memset(base, 0, obj_size);
271 /* Initialize pointer to loader's dispatch table with ICD_LOADER_MAGIC */
272 set_loader_magic_value(base);
276 * dev is NULL when we are creating the base device object
277 * Set dev now so that debug setup happens correctly
279 dev = (struct nulldrv_dev *) base;
283 base->get_memory_requirements = NULL;
289 nulldrv_gpu_add(int devid, const char *primary_node,
290 const char *render_node, struct nulldrv_gpu **gpu_ret)
292 struct nulldrv_gpu *gpu;
294 gpu = malloc(sizeof(*gpu));
296 return VK_ERROR_OUT_OF_HOST_MEMORY;
298 memset(gpu, 0, sizeof(*gpu));
300 /* Initialize pointer to loader's dispatch table with ICD_LOADER_MAGIC */
301 set_loader_magic_value(gpu);
309 nulldrv_queue_create(struct nulldrv_dev *dev,
311 struct nulldrv_queue **queue_ret)
313 struct nulldrv_queue *queue;
315 queue = (struct nulldrv_queue *)
316 nulldrv_base_create(dev, sizeof(*queue),
317 VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT);
319 return VK_ERROR_OUT_OF_HOST_MEMORY;
329 dev_create_queues(struct nulldrv_dev *dev,
330 const VkDeviceQueueCreateInfo *queues,
335 for (i = 0; i < count; i++) {
336 const VkDeviceQueueCreateInfo *q = &queues[i];
337 VkResult ret = VK_SUCCESS;
339 if (q->queueCount == 1 && !dev->queues[q->queueFamilyIndex]) {
340 ret = nulldrv_queue_create(dev, q->queueFamilyIndex,
341 &dev->queues[q->queueFamilyIndex]);
344 if (ret != VK_SUCCESS)
351 static enum nulldrv_ext_type
352 nulldrv_gpu_lookup_extension(const struct nulldrv_gpu *gpu,
355 enum nulldrv_ext_type type;
357 for (type = 0; type < ARRAY_LENGTH(device_extensions); type++) {
358 if (strcmp(device_extensions[type].extensionName, name) == 0)
362 VK_ASSERT(type < NULLDRV_EXT_COUNT || type == NULLDRV_EXT_INVALID);
368 nulldrv_desc_ooxx_create(struct nulldrv_dev *dev,
369 struct nulldrv_desc_ooxx **ooxx_ret)
371 struct nulldrv_desc_ooxx *ooxx;
373 ooxx = malloc(sizeof(*ooxx));
375 return VK_ERROR_OUT_OF_HOST_MEMORY;
377 memset(ooxx, 0, sizeof(*ooxx));
379 ooxx->surface_desc_size = 0;
380 ooxx->sampler_desc_size = 0;
388 nulldrv_dev_create(struct nulldrv_gpu *gpu,
389 const VkDeviceCreateInfo *info,
390 struct nulldrv_dev **dev_ret)
392 struct nulldrv_dev *dev;
396 dev = (struct nulldrv_dev *)
397 nulldrv_base_create(NULL, sizeof(*dev),
398 VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT);
400 return VK_ERROR_OUT_OF_HOST_MEMORY;
402 for (i = 0; i < info->enabledExtensionCount; i++) {
403 enum nulldrv_ext_type ext =
404 nulldrv_gpu_lookup_extension(gpu,
405 info->ppEnabledExtensionNames[i]);
407 if (ext == NULLDRV_EXT_INVALID)
408 return VK_ERROR_EXTENSION_NOT_PRESENT;
410 dev->exts[ext] = true;
413 ret = nulldrv_desc_ooxx_create(dev, &dev->desc_ooxx);
414 if (ret != VK_SUCCESS)
417 ret = dev_create_queues(dev, info->pQueueCreateInfos,
418 info->queueCreateInfoCount);
419 if (ret != VK_SUCCESS)
427 static struct nulldrv_gpu *nulldrv_gpu(VkPhysicalDevice gpu)
429 return (struct nulldrv_gpu *) gpu;
432 static VkResult nulldrv_fence_create(struct nulldrv_dev *dev,
433 const VkFenceCreateInfo *info,
434 struct nulldrv_fence **fence_ret)
436 struct nulldrv_fence *fence;
438 fence = (struct nulldrv_fence *)
439 nulldrv_base_create(dev, sizeof(*fence),
440 VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT);
442 return VK_ERROR_OUT_OF_HOST_MEMORY;
449 static struct nulldrv_dev *
450 nulldrv_dev(VkDevice dev)
452 return (struct nulldrv_dev *) dev;
455 static struct nulldrv_img *
456 nulldrv_img_from_base(struct nulldrv_base *base)
458 return (struct nulldrv_img *) base;
463 img_get_memory_requirements(struct nulldrv_base *base,
464 VkMemoryRequirements *requirements)
466 struct nulldrv_img *img = nulldrv_img_from_base(base);
467 VkResult ret = VK_SUCCESS;
469 requirements->size = img->total_size;
470 requirements->alignment = 4096;
471 requirements->memoryTypeBits = ~0u; /* can use any memory type */
477 nulldrv_img_create(struct nulldrv_dev *dev,
478 tbm_surface_h tbm_surface,
479 const VkImageCreateInfo *info,
481 struct nulldrv_img **img_ret)
483 struct nulldrv_img *img;
485 img = (struct nulldrv_img *)
486 nulldrv_base_create(dev, sizeof(*img),
487 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
489 return VK_ERROR_OUT_OF_HOST_MEMORY;
491 img->tbm_surface = tbm_surface;
492 img->type = info->imageType;
493 img->depth = info->extent.depth;
494 img->mip_levels = info->mipLevels;
495 img->array_size = info->arrayLayers;
496 img->usage = info->usage;
497 img->samples = info->samples;
499 img->obj.base.get_memory_requirements = img_get_memory_requirements;
506 static struct nulldrv_img *
507 nulldrv_img(VkImage image)
509 return *(struct nulldrv_img **) ℑ
513 nulldrv_mem_alloc(struct nulldrv_dev *dev,
514 const VkMemoryAllocateInfo *info,
515 struct nulldrv_mem **mem_ret)
517 struct nulldrv_mem *mem;
519 mem = (struct nulldrv_mem *)
520 nulldrv_base_create(dev, sizeof(*mem),
521 VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT);
523 return VK_ERROR_OUT_OF_HOST_MEMORY;
525 mem->bo = malloc(info->allocationSize);
527 return VK_ERROR_OUT_OF_HOST_MEMORY;
529 mem->size = info->allocationSize;
537 nulldrv_sampler_create(struct nulldrv_dev *dev,
538 const VkSamplerCreateInfo *info,
539 struct nulldrv_sampler **sampler_ret)
541 struct nulldrv_sampler *sampler;
543 sampler = (struct nulldrv_sampler *)
544 nulldrv_base_create(dev, sizeof(*sampler),
545 VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT);
547 return VK_ERROR_OUT_OF_HOST_MEMORY;
549 *sampler_ret = sampler;
555 nulldrv_img_view_create(struct nulldrv_dev *dev,
556 const VkImageViewCreateInfo *info,
557 struct nulldrv_img_view **view_ret)
559 struct nulldrv_img *img = nulldrv_img(info->image);
560 struct nulldrv_img_view *view;
562 view = (struct nulldrv_img_view *)
563 nulldrv_base_create(dev, sizeof(*view),
564 VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT);
566 return VK_ERROR_OUT_OF_HOST_MEMORY;
578 nulldrv_mem_map(struct nulldrv_mem *mem, VkFlags flags)
583 static struct nulldrv_mem *
584 nulldrv_mem(VkDeviceMemory mem)
586 return *(struct nulldrv_mem **) &mem;
589 static struct nulldrv_buf *
590 nulldrv_buf_from_base(struct nulldrv_base *base)
592 return (struct nulldrv_buf *) base;
596 buf_get_memory_requirements(struct nulldrv_base *base,
597 VkMemoryRequirements* requirements)
599 struct nulldrv_buf *buf = nulldrv_buf_from_base(base);
601 if (requirements == NULL)
604 requirements->size = buf->size;
605 requirements->alignment = 4096;
606 requirements->memoryTypeBits = 1; /* nulldrv only has one memory type */
612 nulldrv_buf_create(struct nulldrv_dev *dev,
613 const VkBufferCreateInfo *info,
614 struct nulldrv_buf **buf_ret)
616 struct nulldrv_buf *buf;
618 buf = (struct nulldrv_buf *)
619 nulldrv_base_create(dev, sizeof(*buf),
620 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
622 return VK_ERROR_OUT_OF_HOST_MEMORY;
624 buf->size = info->size;
625 buf->usage = info->usage;
627 buf->obj.base.get_memory_requirements = buf_get_memory_requirements;
635 nulldrv_desc_layout_create(struct nulldrv_dev *dev,
636 const VkDescriptorSetLayoutCreateInfo *info,
637 struct nulldrv_desc_layout **layout_ret)
639 struct nulldrv_desc_layout *layout;
641 layout = (struct nulldrv_desc_layout *)
642 nulldrv_base_create(dev, sizeof(*layout),
643 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT);
645 return VK_ERROR_OUT_OF_HOST_MEMORY;
647 *layout_ret = layout;
653 nulldrv_pipeline_layout_create(struct nulldrv_dev *dev,
654 const VkPipelineLayoutCreateInfo* info,
655 struct nulldrv_pipeline_layout **ret)
657 struct nulldrv_pipeline_layout *pipeline_layout;
659 pipeline_layout = (struct nulldrv_pipeline_layout *)
660 nulldrv_base_create(dev, sizeof(*pipeline_layout),
661 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT);
662 if (!pipeline_layout)
663 return VK_ERROR_OUT_OF_HOST_MEMORY;
665 *ret = pipeline_layout;
670 static struct nulldrv_desc_layout *
671 nulldrv_desc_layout(const VkDescriptorSetLayout layout)
673 return *(struct nulldrv_desc_layout **) &layout;
677 graphics_pipeline_create(struct nulldrv_dev *dev,
678 const VkGraphicsPipelineCreateInfo *info,
679 struct nulldrv_pipeline **pipeline_ret)
681 struct nulldrv_pipeline *pipeline;
683 pipeline = (struct nulldrv_pipeline *)
684 nulldrv_base_create(dev, sizeof(*pipeline),
685 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT);
687 return VK_ERROR_OUT_OF_HOST_MEMORY;
689 *pipeline_ret = pipeline;
695 nulldrv_cmd_create(struct nulldrv_dev *dev,
696 const VkCommandBufferAllocateInfo *info,
697 struct nulldrv_cmd **cmd_ret)
699 struct nulldrv_cmd *cmd;
700 uint32_t num_allocated = 0;
703 for (i = 0; i < info->commandBufferCount; i++) {
704 cmd = (struct nulldrv_cmd *)
705 nulldrv_base_create(dev, sizeof(*cmd),
706 VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT);
708 for (j = 0; j < num_allocated; j++)
711 return VK_ERROR_OUT_OF_HOST_MEMORY;
722 nulldrv_desc_pool_create(struct nulldrv_dev *dev,
723 const VkDescriptorPoolCreateInfo *info,
724 struct nulldrv_desc_pool **pool_ret)
726 struct nulldrv_desc_pool *pool;
728 pool = (struct nulldrv_desc_pool *)
729 nulldrv_base_create(dev, sizeof(*pool),
730 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT);
732 return VK_ERROR_OUT_OF_HOST_MEMORY;
742 nulldrv_desc_set_create(struct nulldrv_dev *dev,
743 struct nulldrv_desc_pool *pool,
744 const struct nulldrv_desc_layout *layout,
745 struct nulldrv_desc_set **set_ret)
747 struct nulldrv_desc_set *set;
749 set = (struct nulldrv_desc_set *)
750 nulldrv_base_create(dev, sizeof(*set),
751 VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT);
753 return VK_ERROR_OUT_OF_HOST_MEMORY;
755 set->ooxx = dev->desc_ooxx;
756 set->layout = layout;
762 static struct nulldrv_desc_pool *
763 nulldrv_desc_pool(VkDescriptorPool pool)
765 return *(struct nulldrv_desc_pool **) &pool;
769 nulldrv_fb_create(struct nulldrv_dev *dev,
770 const VkFramebufferCreateInfo *info,
771 struct nulldrv_framebuffer **fb_ret)
774 struct nulldrv_framebuffer *fb;
776 fb = (struct nulldrv_framebuffer *)
777 nulldrv_base_create(dev, sizeof(*fb),
778 VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT);
780 return VK_ERROR_OUT_OF_HOST_MEMORY;
789 nulldrv_render_pass_create(struct nulldrv_dev *dev,
790 const VkRenderPassCreateInfo *info,
791 struct nulldrv_render_pass **rp_ret)
793 struct nulldrv_render_pass *rp;
795 rp = (struct nulldrv_render_pass *)
796 nulldrv_base_create(dev, sizeof(*rp),
797 VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT);
799 return VK_ERROR_OUT_OF_HOST_MEMORY;
806 static struct nulldrv_buf *
807 nulldrv_buf(VkBuffer buf)
809 return *(struct nulldrv_buf **) &buf;
813 nulldrv_buf_view_create(struct nulldrv_dev *dev,
814 const VkBufferViewCreateInfo *info,
815 struct nulldrv_buf_view **view_ret)
817 struct nulldrv_buf *buf = nulldrv_buf(info->buffer);
818 struct nulldrv_buf_view *view;
820 view = (struct nulldrv_buf_view *)
821 nulldrv_base_create(dev, sizeof(*view),
822 VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT);
824 return VK_ERROR_OUT_OF_HOST_MEMORY;
833 static VKAPI_ATTR VkResult VKAPI_CALL
834 create_buffer(VkDevice device,
835 const VkBufferCreateInfo *info,
836 const VkAllocationCallbacks *allocator,
840 struct nulldrv_dev *dev = nulldrv_dev(device);
842 return nulldrv_buf_create(dev, info,
843 (struct nulldrv_buf **) buffer);
846 static VKAPI_ATTR void VKAPI_CALL
847 destroy_buffer(VkDevice device,
849 const VkAllocationCallbacks *allocator)
854 static VKAPI_ATTR VkResult VKAPI_CALL
855 create_command_pool(VkDevice device,
856 const VkCommandPoolCreateInfo *info,
857 const VkAllocationCallbacks *allocator,
861 *pool = (VkCommandPool)1;
865 static VKAPI_ATTR void VKAPI_CALL
866 destroy_command_pool(VkDevice device,
868 const VkAllocationCallbacks *allocator)
873 static VKAPI_ATTR VkResult VKAPI_CALL
874 reset_command_pool(VkDevice device,
876 VkCommandPoolResetFlags flags)
882 static VKAPI_ATTR VkResult VKAPI_CALL
883 allocate_command_buffers(VkDevice device,
884 const VkCommandBufferAllocateInfo *info,
885 VkCommandBuffer *command_buffers)
888 struct nulldrv_dev *dev = nulldrv_dev(device);
890 return nulldrv_cmd_create(dev, info, (struct nulldrv_cmd **)command_buffers);
893 static VKAPI_ATTR void VKAPI_CALL
894 free_command_buffers(VkDevice device,
897 const VkCommandBuffer *command_buffers)
902 for (i = 0; i < count; i++)
903 free(command_buffers[i]);
906 static VKAPI_ATTR VkResult VKAPI_CALL
907 begin_command_buffer(VkCommandBuffer command_buffer,
908 const VkCommandBufferBeginInfo *info)
914 static VKAPI_ATTR VkResult VKAPI_CALL
915 end_command_buffer(VkCommandBuffer command_buffer)
921 static VKAPI_ATTR VkResult VKAPI_CALL
922 reset_command_buffer(VkCommandBuffer command_buffer,
923 VkCommandBufferResetFlags flags)
929 static VKAPI_ATTR void VKAPI_CALL
930 cmd_copy_buffer(VkCommandBuffer command_buffer,
933 uint32_t region_count,
934 const VkBufferCopy *regions)
939 static VKAPI_ATTR void VKAPI_CALL
940 cmd_copy_image(VkCommandBuffer command_buffer,
942 VkImageLayout src_layout,
944 VkImageLayout dst_layout,
945 uint32_t region_count,
946 const VkImageCopy *regions)
951 static VKAPI_ATTR void VKAPI_CALL
952 cmd_blit_image(VkCommandBuffer command_buffer,
954 VkImageLayout src_layout,
956 VkImageLayout dst_layout,
957 uint32_t region_count,
958 const VkImageBlit *regions,
964 static VKAPI_ATTR void VKAPI_CALL
965 cmd_copy_buffer_to_image(VkCommandBuffer command_buffer,
968 VkImageLayout dst_layout,
969 uint32_t region_count,
970 const VkBufferImageCopy *regions)
975 static VKAPI_ATTR void VKAPI_CALL
976 cmd_copy_image_to_buffer(VkCommandBuffer command_buffer,
978 VkImageLayout src_layout,
980 uint32_t region_count,
981 const VkBufferImageCopy *regions)
986 static VKAPI_ATTR void VKAPI_CALL
987 cmd_update_buffer(VkCommandBuffer command_buffer,
991 const uint32_t *data)
996 static VKAPI_ATTR void VKAPI_CALL
997 cmd_fill_buffer(VkCommandBuffer command_buffer,
1006 static VKAPI_ATTR void VKAPI_CALL
1007 cmd_clear_depth_stencil_image(VkCommandBuffer command_buffer,
1009 VkImageLayout layout,
1010 const VkClearDepthStencilValue *value,
1011 uint32_t range_count,
1012 const VkImageSubresourceRange *ranges)
1017 static VKAPI_ATTR void VKAPI_CALL
1018 cmd_clear_attachments(VkCommandBuffer command_buffer,
1019 uint32_t attachment_count,
1020 const VkClearAttachment *attachments,
1021 uint32_t rect_count,
1022 const VkClearRect *rects)
1027 static VKAPI_ATTR void VKAPI_CALL
1028 cmd_clear_color_image(VkCommandBuffer command_buffer,
1030 VkImageLayout image_layout,
1031 const VkClearColorValue *color,
1032 uint32_t range_count,
1033 const VkImageSubresourceRange *ranges)
1038 static VKAPI_ATTR void VKAPI_CALL
1039 cmd_resolve_image(VkCommandBuffer command_buffer,
1041 VkImageLayout src_layout,
1043 VkImageLayout dst_layout,
1044 uint32_t region_count,
1045 const VkImageResolve *regions)
1050 static VKAPI_ATTR void VKAPI_CALL
1051 cmd_begin_query(VkCommandBuffer command_buffer,
1059 static VKAPI_ATTR void VKAPI_CALL
1060 cmd_end_query(VkCommandBuffer command_buffer,
1067 static VKAPI_ATTR void VKAPI_CALL
1068 cmd_reset_query_pool(VkCommandBuffer command_buffer,
1070 uint32_t first_query,
1071 uint32_t query_count)
1076 static VKAPI_ATTR void VKAPI_CALL
1077 cmd_set_event(VkCommandBuffer command_buffer,
1079 VkPipelineStageFlags stage_mask)
1084 static VKAPI_ATTR void VKAPI_CALL
1085 cmd_reset_event(VkCommandBuffer command_buffer,
1087 VkPipelineStageFlags stage_mask)
1092 static VKAPI_ATTR void VKAPI_CALL
1093 cmd_copy_query_pool_results(VkCommandBuffer command_buffer,
1095 uint32_t first_query,
1096 uint32_t query_count,
1098 VkDeviceSize offset,
1099 VkDeviceSize stride,
1105 static VKAPI_ATTR void VKAPI_CALL
1106 cmd_write_timestamp(VkCommandBuffer command_buffer,
1107 VkPipelineStageFlagBits pipeline_stage,
1114 static VKAPI_ATTR void VKAPI_CALL
1115 cmd_bind_pipeline(VkCommandBuffer command_buffer,
1116 VkPipelineBindPoint pipeline_bind_point,
1117 VkPipeline pipeline)
1122 static VKAPI_ATTR void VKAPI_CALL
1123 cmd_set_viewport(VkCommandBuffer command_buffer,
1126 const VkViewport *viewports)
1131 static VKAPI_ATTR void VKAPI_CALL
1132 cmd_set_scissor(VkCommandBuffer command_buffer,
1135 const VkRect2D *scissors)
1140 static VKAPI_ATTR void VKAPI_CALL
1141 cmd_set_line_width(VkCommandBuffer command_buffer, float line_width)
1146 static VKAPI_ATTR void VKAPI_CALL
1147 cmd_set_depth_bias(VkCommandBuffer command_buffer,
1155 static VKAPI_ATTR void VKAPI_CALL
1156 cmd_set_blend_constants(VkCommandBuffer command_buffer,
1157 const float blend_constants[4])
1162 static VKAPI_ATTR void VKAPI_CALL
1163 cmd_set_depth_bounds(VkCommandBuffer command_buffer,
1170 static VKAPI_ATTR void VKAPI_CALL
1171 cmd_set_stencil_compare_mask(VkCommandBuffer command_buffer,
1172 VkStencilFaceFlags face_mask,
1173 uint32_t compare_mask)
1178 static VKAPI_ATTR void VKAPI_CALL
1179 cmd_set_stencil_write_mask(VkCommandBuffer command_buffer,
1180 VkStencilFaceFlags face_mask,
1181 uint32_t write_mask)
1186 static VKAPI_ATTR void VKAPI_CALL
1187 cmd_set_stencil_reference(VkCommandBuffer command_buffer,
1188 VkStencilFaceFlags face_mask,
1194 static VKAPI_ATTR void VKAPI_CALL
1195 cmd_bind_descriptor_sets(VkCommandBuffer command_buffer,
1196 VkPipelineBindPoint pipeline_bind_point,
1197 VkPipelineLayout layout,
1200 const VkDescriptorSet *sets,
1201 uint32_t offset_count,
1202 const uint32_t *offsets)
1207 static VKAPI_ATTR void VKAPI_CALL
1208 cmd_bind_vertex_buffers(VkCommandBuffer command_buffer,
1211 const VkBuffer *buffers,
1212 const VkDeviceSize *offsets)
1217 static VKAPI_ATTR void VKAPI_CALL
1218 cmd_bind_index_buffer(VkCommandBuffer command_buffer,
1220 VkDeviceSize offset,
1221 VkIndexType index_type)
1226 static VKAPI_ATTR void VKAPI_CALL
1227 cmd_draw(VkCommandBuffer command_buffer,
1228 uint32_t vertex_count,
1229 uint32_t instance_count,
1230 uint32_t first_vertex,
1231 uint32_t first_instance)
1236 static VKAPI_ATTR void VKAPI_CALL
1237 cmd_draw_indexed(VkCommandBuffer command_buffer,
1238 uint32_t index_count,
1239 uint32_t instance_count,
1240 uint32_t first_index,
1241 int32_t vertex_offset,
1242 uint32_t first_instance)
1247 static VKAPI_ATTR void VKAPI_CALL
1248 cmd_draw_indirect(VkCommandBuffer command_buffer,
1250 VkDeviceSize offset,
1251 uint32_t draw_count,
1257 static VKAPI_ATTR void VKAPI_CALL
1258 cmd_draw_indexed_indirect(VkCommandBuffer command_buffer,
1260 VkDeviceSize offset,
1261 uint32_t draw_count,
1267 static VKAPI_ATTR void VKAPI_CALL
1268 cmd_dispatch(VkCommandBuffer command_buffer,
1276 static VKAPI_ATTR void VKAPI_CALL
1277 cmd_dispatch_indirect(VkCommandBuffer command_buffer,
1279 VkDeviceSize offset)
1284 static VKAPI_ATTR void VKAPI_CALL
1285 cmd_wait_events(VkCommandBuffer command_buffer,
1286 uint32_t event_count,
1287 const VkEvent *events,
1288 VkPipelineStageFlags source_stage_mask,
1289 VkPipelineStageFlags dst_stage_mask,
1290 uint32_t memory_barrier_count,
1291 const VkMemoryBarrier *memory_barriers,
1292 uint32_t buffer_memory_barrierCount,
1293 const VkBufferMemoryBarrier *buffer_memory_barriers,
1294 uint32_t image_memory_barrierCount,
1295 const VkImageMemoryBarrier *image_memory_barriers)
1300 static VKAPI_ATTR void VKAPI_CALL
1301 cmd_pipeline_barrier(VkCommandBuffer command_buffer,
1302 VkPipelineStageFlags src_stage_mask,
1303 VkPipelineStageFlags dst_stage_mask,
1304 VkDependencyFlags dependency_flags,
1305 uint32_t memory_barrier_count,
1306 const VkMemoryBarrier *memory_barriers,
1307 uint32_t buffer_memory_barrierCount,
1308 const VkBufferMemoryBarrier *buffer_memory_barriers,
1309 uint32_t image_memory_barrierCount,
1310 const VkImageMemoryBarrier *image_memory_barriers)
1315 static VKAPI_ATTR VkResult VKAPI_CALL
1316 create_device(VkPhysicalDevice dev,
1317 const VkDeviceCreateInfo *info,
1318 const VkAllocationCallbacks *allocator,
1322 struct nulldrv_gpu *gpu = nulldrv_gpu(dev);
1323 return nulldrv_dev_create(gpu, info, (struct nulldrv_dev**)device);
1326 static VKAPI_ATTR void VKAPI_CALL
1327 destroy_device(VkDevice device,
1328 const VkAllocationCallbacks *allocator)
1333 static VKAPI_ATTR void VKAPI_CALL
1334 get_device_queue(VkDevice device,
1335 uint32_t queue_node_index,
1336 uint32_t queue_index,
1340 struct nulldrv_dev *dev = nulldrv_dev(device);
1341 *queue = (VkQueue) dev->queues[0];
1344 static VKAPI_ATTR VkResult VKAPI_CALL
1345 device_wait_idle(VkDevice device)
1351 static VKAPI_ATTR VkResult VKAPI_CALL
1352 create_event(VkDevice device,
1353 const VkEventCreateInfo *info,
1354 const VkAllocationCallbacks *allocator,
1361 static VKAPI_ATTR void VKAPI_CALL
1362 destroy_event(VkDevice device,
1364 const VkAllocationCallbacks *allocator)
1369 static VKAPI_ATTR VkResult VKAPI_CALL
1370 get_event_status(VkDevice device,
1377 static VKAPI_ATTR VkResult VKAPI_CALL
1378 set_event(VkDevice device,
1385 static VKAPI_ATTR VkResult VKAPI_CALL
1386 reset_event(VkDevice device,
1393 static VKAPI_ATTR VkResult VKAPI_CALL
1394 create_fence(VkDevice device,
1395 const VkFenceCreateInfo *info,
1396 const VkAllocationCallbacks *allocator,
1400 struct nulldrv_dev *dev = nulldrv_dev(device);
1402 return nulldrv_fence_create(dev, info,
1403 (struct nulldrv_fence **) fence);
1406 static VKAPI_ATTR void VKAPI_CALL
1407 destroy_fence(VkDevice device,
1409 const VkAllocationCallbacks *allocator)
1414 static VKAPI_ATTR VkResult VKAPI_CALL
1415 get_fence_status(VkDevice device,
1422 static VKAPI_ATTR VkResult VKAPI_CALL
1423 reset_fences(VkDevice device,
1424 uint32_t fence_count,
1425 const VkFence *fences)
1431 static VKAPI_ATTR VkResult VKAPI_CALL
1432 wait_for_fences(VkDevice device,
1433 uint32_t fence_count,
1434 const VkFence *fences,
1442 static VKAPI_ATTR void VKAPI_CALL
1443 get_physical_device_properties(VkPhysicalDevice pdev,
1444 VkPhysicalDeviceProperties *props)
1448 props->apiVersion = VK_API_VERSION_1_0;
1449 props->driverVersion = 0;
1450 props->vendorID = 0;
1451 props->deviceID = 0;
1452 props->deviceType = VK_PHYSICAL_DEVICE_TYPE_OTHER;
1453 strncpy(props->deviceName, "nulldrv", strlen("nulldrv"));
1455 /* TODO: fill out limits */
1456 memset(&props->limits, 0, sizeof(VkPhysicalDeviceLimits));
1457 memset(&props->sparseProperties, 0,
1458 sizeof(VkPhysicalDeviceSparseProperties));
1461 static VKAPI_ATTR void VKAPI_CALL
1462 get_physical_device_features(VkPhysicalDevice dev,
1463 VkPhysicalDeviceFeatures *features)
1467 memset(features, 0xff, sizeof(*features));
1470 static VKAPI_ATTR void VKAPI_CALL
1471 get_physical_device_format_properties(VkPhysicalDevice pdev,
1473 VkFormatProperties *format_info)
1477 format_info->linearTilingFeatures = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
1478 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
1479 format_info->optimalTilingFeatures = format_info->linearTilingFeatures;
1480 format_info->bufferFeatures = 0;
1483 static VKAPI_ATTR void VKAPI_CALL
1484 get_physical_device_queue_family_properties(VkPhysicalDevice pdev,
1485 uint32_t *queue_family_prop_count,
1486 VkQueueFamilyProperties *props)
1488 if (props == NULL) {
1489 *queue_family_prop_count = 1;
1492 props->queueFlags = VK_QUEUE_GRAPHICS_BIT |
1493 VK_QUEUE_SPARSE_BINDING_BIT;
1494 props->queueCount = 1;
1495 props->timestampValidBits = 0;
1498 static VKAPI_ATTR void VKAPI_CALL
1499 get_physical_device_memory_properties(VkPhysicalDevice pdev,
1500 VkPhysicalDeviceMemoryProperties *props)
1502 /* null driver pretends to have a single memory type (and single heap) */
1503 props->memoryTypeCount = 1;
1504 props->memoryHeapCount = 1;
1505 props->memoryTypes[0].heapIndex = 0;
1506 props->memoryTypes[0].propertyFlags =
1507 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
1508 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
1509 VK_MEMORY_PROPERTY_HOST_CACHED_BIT |
1510 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;
1511 props->memoryHeaps[0].flags = 0; /* not physical_deviceice local */
1512 props->memoryHeaps[0].size = 0; /* it's just malloc-backed memory */
1515 static VKAPI_ATTR VkResult VKAPI_CALL
1516 enumerate_device_layer_properties(VkPhysicalDevice pdev,
1517 uint32_t *prop_count,
1518 VkLayerProperties *props)
1520 /* TODO: Fill in with real data */
1524 static VKAPI_ATTR VkResult VKAPI_CALL
1525 enumerate_instance_extension_properties(const char *layer_name,
1526 uint32_t *prop_count,
1527 VkExtensionProperties *props)
1531 if (props == NULL) {
1532 *prop_count = NULLDRV_EXT_COUNT;
1536 copy_size = *prop_count < NULLDRV_EXT_COUNT ?
1537 *prop_count : NULLDRV_EXT_COUNT;
1539 memcpy(props, instance_extensions,
1540 copy_size * sizeof(VkExtensionProperties));
1542 *prop_count = copy_size;
1544 if (copy_size < NULLDRV_EXT_COUNT)
1545 return VK_INCOMPLETE;
1550 static VKAPI_ATTR VkResult VKAPI_CALL
1551 enumerate_instance_layer_properties(uint32_t *prop_count,
1552 VkLayerProperties *props)
1554 /* TODO: Fill in with real data */
1558 static VKAPI_ATTR VkResult VKAPI_CALL
1559 enumerate_device_extension_properties(VkPhysicalDevice pdev,
1560 const char *layer_name,
1561 uint32_t *prop_count,
1562 VkExtensionProperties *props)
1565 uint32_t extension_count = ARRAY_LENGTH(device_extensions);
1567 if (props == NULL) {
1568 *prop_count = extension_count;
1572 copy_size = *prop_count < extension_count ?
1573 *prop_count : extension_count;
1575 memcpy(props, device_extensions,
1576 copy_size * sizeof(VkExtensionProperties));
1578 *prop_count = copy_size;
1580 if (copy_size < extension_count)
1581 return VK_INCOMPLETE;
1586 static VKAPI_ATTR VkResult VKAPI_CALL
1587 create_image(VkDevice device,
1588 const VkImageCreateInfo *info,
1589 const VkAllocationCallbacks *allocator,
1593 struct nulldrv_dev *dev = nulldrv_dev(device);
1595 return nulldrv_img_create(dev, NULL, info, false,
1596 (struct nulldrv_img **) image);
1599 static VKAPI_ATTR void VKAPI_CALL
1600 destroy_image(VkDevice device,
1602 const VkAllocationCallbacks *allocator)
1607 static VKAPI_ATTR void VKAPI_CALL
1608 get_image_subresource_layout(VkDevice device,
1610 const VkImageSubresource *subresource,
1611 VkSubresourceLayout *layout)
1617 layout->rowPitch = 4;
1618 layout->depthPitch = 4;
1619 layout->arrayPitch = 4;
1622 static VKAPI_ATTR VkResult VKAPI_CALL
1623 allocate_memory(VkDevice device,
1624 const VkMemoryAllocateInfo *info,
1625 const VkAllocationCallbacks *allocator,
1626 VkDeviceMemory *memory)
1629 struct nulldrv_dev *dev = nulldrv_dev(device);
1631 return nulldrv_mem_alloc(dev, info,
1632 (struct nulldrv_mem **) memory);
1635 static VKAPI_ATTR void VKAPI_CALL
1636 free_memory(VkDevice device,
1637 VkDeviceMemory memory,
1638 const VkAllocationCallbacks *allocator)
1643 static VKAPI_ATTR VkResult VKAPI_CALL
1644 map_memory(VkDevice device,
1645 VkDeviceMemory memory,
1646 VkDeviceSize offset,
1652 struct nulldrv_mem *mem = nulldrv_mem(memory);
1653 void *ptr = nulldrv_mem_map(mem, flags);
1657 return (ptr) ? VK_SUCCESS : VK_ERROR_MEMORY_MAP_FAILED;
1660 static VKAPI_ATTR void VKAPI_CALL
1661 unmap_memory(VkDevice device,
1662 VkDeviceMemory memory)
1667 static VKAPI_ATTR VkResult VKAPI_CALL
1668 flush_mapped_memory_ranges(VkDevice device,
1669 uint32_t memory_range_count,
1670 const VkMappedMemoryRange *memory_ranges)
1676 static VKAPI_ATTR VkResult VKAPI_CALL
1677 invalidate_mapped_memory_ranges(VkDevice device,
1678 uint32_t memory_range_count,
1679 const VkMappedMemoryRange *memory_ranges)
1685 static VKAPI_ATTR void VKAPI_CALL
1686 get_device_memory_commitment(VkDevice device,
1687 VkDeviceMemory memory,
1688 VkDeviceSize *committed_memory_bytes)
1692 static VKAPI_ATTR VkResult VKAPI_CALL
1693 create_instance(const VkInstanceCreateInfo *info,
1694 const VkAllocationCallbacks *allocator,
1695 VkInstance *instance)
1698 struct nulldrv_instance *inst;
1700 inst = (struct nulldrv_instance *)
1701 nulldrv_base_create(NULL, sizeof(*inst),
1702 VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT);
1704 return VK_ERROR_OUT_OF_HOST_MEMORY;
1706 inst->obj.base.get_memory_requirements = NULL;
1708 *instance = (VkInstance) inst;
1713 static VKAPI_ATTR void VKAPI_CALL
1714 destroy_instance(VkInstance instance,
1715 const VkAllocationCallbacks *allocator)
1720 static VKAPI_ATTR VkResult VKAPI_CALL
1721 enumerate_physical_devices(VkInstance instance,
1722 uint32_t *gpu_count,
1723 VkPhysicalDevice *gpus)
1727 struct nulldrv_gpu *gpu;
1730 ret = nulldrv_gpu_add(0, 0, 0, &gpu);
1732 if (ret == VK_SUCCESS && gpus)
1733 gpus[0] = (VkPhysicalDevice) gpu;
1738 static VKAPI_ATTR void VKAPI_CALL
1739 get_buffer_memory_requirements(VkDevice device,
1741 VkMemoryRequirements *memory_requirements)
1744 struct nulldrv_base *base = nulldrv_base((void*)(uintptr_t)buffer);
1746 base->get_memory_requirements(base, memory_requirements);
1749 static VKAPI_ATTR void VKAPI_CALL
1750 get_image_memory_requirements(VkDevice device,
1752 VkMemoryRequirements *memory_requirements)
1755 struct nulldrv_base *base = nulldrv_base((void*)(uintptr_t)image);
1757 base->get_memory_requirements(base, memory_requirements);
1760 static VKAPI_ATTR VkResult VKAPI_CALL
1761 bind_buffer_memory(VkDevice device,
1763 VkDeviceMemory memory,
1764 VkDeviceSize memory_offset)
1770 static VKAPI_ATTR VkResult VKAPI_CALL
1771 bind_image_memory(VkDevice device,
1773 VkDeviceMemory memory,
1774 VkDeviceSize memory_offset)
1780 static VKAPI_ATTR void VKAPI_CALL
1781 get_image_sparse_memory_requirements(VkDevice device,
1784 VkSparseImageMemoryRequirements *reqs)
1789 static VKAPI_ATTR void VKAPI_CALL
1790 get_physical_device_sparse_image_format_properties(VkPhysicalDevice dev,
1793 VkSampleCountFlagBits samples,
1794 VkImageUsageFlags usage,
1795 VkImageTiling tiling,
1796 uint32_t *prop_count,
1797 VkSparseImageFormatProperties *props)
1802 static VKAPI_ATTR VkResult VKAPI_CALL
1803 queue_bind_sparse(VkQueue queue,
1804 uint32_t bind_info_count,
1805 const VkBindSparseInfo *bind_info,
1812 static VKAPI_ATTR VkResult VKAPI_CALL
1813 create_pipeline_cache(VkDevice device,
1814 const VkPipelineCacheCreateInfo *info,
1815 const VkAllocationCallbacks *allocator,
1816 VkPipelineCache *cache)
1821 struct nulldrv_dev *dev = nulldrv_dev(device);
1822 struct nulldrv_pipeline_cache *pipeline_cache;
1824 pipeline_cache = (struct nulldrv_pipeline_cache *)
1825 nulldrv_base_create(dev, sizeof(*pipeline_cache),
1826 VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT);
1827 if (!pipeline_cache)
1828 return VK_ERROR_OUT_OF_HOST_MEMORY;
1830 *cache = (VkPipelineCache)(uintptr_t)pipeline_cache;
1835 static VKAPI_ATTR void VKAPI_CALL
1836 destroy_pipeline(VkDevice device,
1837 VkPipeline pipeline,
1838 const VkAllocationCallbacks *allocator)
1843 static VKAPI_ATTR void VKAPI_CALL
1844 destroy_pipeline_cache(VkDevice device,
1845 VkPipelineCache pipeline_cache,
1846 const VkAllocationCallbacks *allocator)
1851 static VKAPI_ATTR VkResult VKAPI_CALL
1852 get_pipeline_cache_data(VkDevice device,
1853 VkPipelineCache pipeline_cache,
1858 return VK_ERROR_INITIALIZATION_FAILED;
1861 static VKAPI_ATTR VkResult VKAPI_CALL
1862 merge_pipeline_caches(VkDevice device,
1863 VkPipelineCache dst_cache,
1864 uint32_t src_cache_count,
1865 const VkPipelineCache *src_caches)
1868 return VK_ERROR_INITIALIZATION_FAILED;
1871 static VKAPI_ATTR VkResult VKAPI_CALL
1872 create_graphics_pipelines(VkDevice device,
1873 VkPipelineCache pipeline_cache,
1874 uint32_t create_info_count,
1875 const VkGraphicsPipelineCreateInfo *info,
1876 const VkAllocationCallbacks *allocator,
1877 VkPipeline *pipeline)
1880 struct nulldrv_dev *dev = nulldrv_dev(device);
1882 return graphics_pipeline_create(dev, info,
1883 (struct nulldrv_pipeline **) pipeline);
1886 static VKAPI_ATTR VkResult VKAPI_CALL
1887 create_compute_pipelines(VkDevice device,
1888 VkPipelineCache pipeline_cache,
1889 uint32_t create_info_count,
1890 const VkComputePipelineCreateInfo *info,
1891 const VkAllocationCallbacks *allocator,
1892 VkPipeline *pipeline)
1898 static VKAPI_ATTR VkResult VKAPI_CALL
1899 create_query_pool(VkDevice device,
1900 const VkQueryPoolCreateInfo *info,
1901 const VkAllocationCallbacks *allocator,
1908 static VKAPI_ATTR void VKAPI_CALL
1909 destroy_query_pool(VkDevice device,
1910 VkQueryPool query_poool,
1911 const VkAllocationCallbacks *allocator)
1916 static VKAPI_ATTR VkResult VKAPI_CALL
1917 get_query_pool_results(VkDevice device,
1918 VkQueryPool query_pool,
1919 uint32_t first_query,
1920 uint32_t query_count,
1924 VkQueryResultFlags flags)
1930 static VKAPI_ATTR VkResult VKAPI_CALL
1931 queue_wait_idle(VkQueue queue)
1937 static VKAPI_ATTR VkResult VKAPI_CALL
1938 queue_submit(VkQueue queue,
1939 uint32_t submit_count,
1940 const VkSubmitInfo *submits,
1947 static VKAPI_ATTR VkResult VKAPI_CALL
1948 create_semaphore(VkDevice device,
1949 const VkSemaphoreCreateInfo *info,
1950 const VkAllocationCallbacks *allocator,
1951 VkSemaphore *semaphore)
1957 static VKAPI_ATTR void VKAPI_CALL
1958 destroy_semaphore(VkDevice device,
1959 VkSemaphore semaphore,
1960 const VkAllocationCallbacks *allocator)
1965 static VKAPI_ATTR VkResult VKAPI_CALL
1966 create_sampler(VkDevice device,
1967 const VkSamplerCreateInfo *info,
1968 const VkAllocationCallbacks *allocator,
1972 struct nulldrv_dev *dev = nulldrv_dev(device);
1974 return nulldrv_sampler_create(dev, info,
1975 (struct nulldrv_sampler **) sampler);
1978 static VKAPI_ATTR void VKAPI_CALL
1979 destroy_sampler(VkDevice device,
1981 const VkAllocationCallbacks *allocator)
1986 static VKAPI_ATTR VkResult VKAPI_CALL
1987 create_shader_module(VkDevice device,
1988 const VkShaderModuleCreateInfo *info,
1989 const VkAllocationCallbacks *allocator,
1990 VkShaderModule *module)
1994 struct nulldrv_dev *dev = nulldrv_dev(device);
1995 struct nulldrv_shader_module *shader_module;
1997 shader_module = (struct nulldrv_shader_module *)
1998 nulldrv_base_create(dev, sizeof(*shader_module),
1999 VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT);
2001 return VK_ERROR_OUT_OF_HOST_MEMORY;
2003 *module = (VkShaderModule)(uintptr_t)shader_module;
2008 static VKAPI_ATTR void VKAPI_CALL
2009 destroy_shader_module(VkDevice device,
2010 VkShaderModule shader_module,
2011 const VkAllocationCallbacks *allocator)
2013 /* TODO: Fill in with real data */
2017 static VKAPI_ATTR VkResult VKAPI_CALL
2018 create_buffer_view(VkDevice device,
2019 const VkBufferViewCreateInfo *info,
2020 const VkAllocationCallbacks *allocator,
2024 struct nulldrv_dev *dev = nulldrv_dev(device);
2026 return nulldrv_buf_view_create(dev, info,
2027 (struct nulldrv_buf_view **) view);
2030 static VKAPI_ATTR void VKAPI_CALL
2031 destroy_buffer_view(VkDevice device,
2032 VkBufferView buffer_view,
2033 const VkAllocationCallbacks *allocator)
2038 static VKAPI_ATTR VkResult VKAPI_CALL
2039 create_image_view(VkDevice device,
2040 const VkImageViewCreateInfo *info,
2041 const VkAllocationCallbacks *allocator,
2045 struct nulldrv_dev *dev = nulldrv_dev(device);
2047 return nulldrv_img_view_create(dev, info,
2048 (struct nulldrv_img_view **) view);
2051 static VKAPI_ATTR void VKAPI_CALL
2052 destroy_image_view(VkDevice device,
2053 VkImageView image_view,
2054 const VkAllocationCallbacks *allocator)
2059 static VKAPI_ATTR VkResult VKAPI_CALL
2060 create_descriptor_set_layout(VkDevice device,
2061 const VkDescriptorSetLayoutCreateInfo *info,
2062 const VkAllocationCallbacks *allocator,
2063 VkDescriptorSetLayout *layout)
2066 struct nulldrv_dev *dev = nulldrv_dev(device);
2068 return nulldrv_desc_layout_create(dev, info,
2069 (struct nulldrv_desc_layout **)layout);
2072 static VKAPI_ATTR void VKAPI_CALL
2073 destroy_descriptor_set_layout(VkDevice device,
2074 VkDescriptorSetLayout layout,
2075 const VkAllocationCallbacks *allocator)
2080 static VKAPI_ATTR VkResult VKAPI_CALL
2081 create_pipeline_layout(VkDevice device,
2082 const VkPipelineLayoutCreateInfo *info,
2083 const VkAllocationCallbacks *allocator,
2084 VkPipelineLayout *layout)
2087 struct nulldrv_dev *dev = nulldrv_dev(device);
2089 return nulldrv_pipeline_layout_create(dev, info,
2090 (struct nulldrv_pipeline_layout **)
2094 static VKAPI_ATTR void VKAPI_CALL
2095 destroy_pipeline_layout(VkDevice device,
2096 VkPipelineLayout layout,
2097 const VkAllocationCallbacks *allocator)
2102 static VKAPI_ATTR VkResult VKAPI_CALL
2103 create_descriptor_pool(VkDevice device,
2104 const VkDescriptorPoolCreateInfo *info,
2105 const VkAllocationCallbacks *allocator,
2106 VkDescriptorPool *pool)
2109 struct nulldrv_dev *dev = nulldrv_dev(device);
2111 return nulldrv_desc_pool_create(dev, info,
2112 (struct nulldrv_desc_pool **)pool);
2115 static VKAPI_ATTR void VKAPI_CALL
2116 destroy_descriptor_pool(VkDevice device,
2117 VkDescriptorPool descriptor_pool,
2118 const VkAllocationCallbacks *allocator)
2123 static VKAPI_ATTR VkResult VKAPI_CALL
2124 reset_descriptor_pool(VkDevice device,
2125 VkDescriptorPool descriptor_pool,
2126 VkDescriptorPoolResetFlags flags)
2132 static VKAPI_ATTR VkResult VKAPI_CALL
2133 allocate_descriptor_sets(VkDevice device,
2134 const VkDescriptorSetAllocateInfo *info,
2135 VkDescriptorSet *sets)
2138 struct nulldrv_desc_pool *pool =
2139 nulldrv_desc_pool(info->descriptorPool);
2140 struct nulldrv_dev *dev = pool->dev;
2141 VkResult ret = VK_SUCCESS;
2144 for (i = 0; i < info->descriptorSetCount; i++) {
2145 const struct nulldrv_desc_layout *layout =
2146 nulldrv_desc_layout(info->pSetLayouts[i]);
2148 ret = nulldrv_desc_set_create(dev, pool, layout,
2149 (struct nulldrv_desc_set **)&sets[i]);
2150 if (ret != VK_SUCCESS)
2157 static VKAPI_ATTR VkResult VKAPI_CALL
2158 free_descriptor_sets(VkDevice device,
2159 VkDescriptorPool descriptor_pool,
2160 uint32_t descriptor_set_count,
2161 const VkDescriptorSet *sets)
2167 static VKAPI_ATTR void VKAPI_CALL
2168 update_descriptor_sets(VkDevice device,
2169 uint32_t write_count,
2170 const VkWriteDescriptorSet *writes,
2171 uint32_t copy_count,
2172 const VkCopyDescriptorSet *copies)
2177 static VKAPI_ATTR VkResult VKAPI_CALL
2178 create_framebuffer(VkDevice device,
2179 const VkFramebufferCreateInfo *info,
2180 const VkAllocationCallbacks *allocator,
2184 struct nulldrv_dev *dev = nulldrv_dev(device);
2186 return nulldrv_fb_create(dev, info, (struct nulldrv_framebuffer **)fb);
2189 static VKAPI_ATTR void VKAPI_CALL
2190 destroy_framebuffer(VkDevice device,
2191 VkFramebuffer framebuffer,
2192 const VkAllocationCallbacks *allocator)
2197 static VKAPI_ATTR VkResult VKAPI_CALL
2198 create_render_pass(VkDevice device,
2199 const VkRenderPassCreateInfo *info,
2200 const VkAllocationCallbacks *allocator,
2204 struct nulldrv_dev *dev = nulldrv_dev(device);
2206 return nulldrv_render_pass_create(dev, info,
2207 (struct nulldrv_render_pass **)rp);
2210 static VKAPI_ATTR void VKAPI_CALL
2211 destroy_render_pass(VkDevice device,
2212 VkRenderPass render_pass,
2213 const VkAllocationCallbacks *allocator)
2218 static VKAPI_ATTR void VKAPI_CALL
2219 cmd_push_constants(VkCommandBuffer command_buffer,
2220 VkPipelineLayout layout,
2221 VkShaderStageFlags stage_flags,
2226 /* TODO: Implement */
2229 static VKAPI_ATTR void VKAPI_CALL
2230 get_render_area_granularity(VkDevice device,
2231 VkRenderPass render_pass,
2232 VkExtent2D *granularity)
2234 granularity->height = 1;
2235 granularity->width = 1;
2238 static VKAPI_ATTR void VKAPI_CALL
2239 cmd_begin_render_pass(VkCommandBuffer command_buffer,
2240 const VkRenderPassBeginInfo *render_pass_begin,
2241 VkSubpassContents contents)
2246 static VKAPI_ATTR void VKAPI_CALL
2247 cmd_next_subpass(VkCommandBuffer command_buffer,
2248 VkSubpassContents contents)
2253 static VKAPI_ATTR void VKAPI_CALL
2254 cmd_end_render_pass(VkCommandBuffer command_buffer)
2259 static VKAPI_ATTR void VKAPI_CALL
2260 cmd_execute_commands(VkCommandBuffer command_buffer,
2262 const VkCommandBuffer *buffers)
2267 static VKAPI_ATTR VkResult VKAPI_CALL
2268 get_physical_device_image_format_properties(VkPhysicalDevice dev,
2271 VkImageTiling tiling,
2272 VkImageUsageFlags usage,
2273 VkImageCreateFlags flags,
2274 VkImageFormatProperties *props)
2276 props->maxExtent.width = 1024;
2277 props->maxExtent.height = 1024;
2278 props->maxExtent.depth = 1024;
2279 props->maxMipLevels = 10;
2280 props->maxArrayLayers = 1024;
2281 props->sampleCounts = VK_SAMPLE_COUNT_1_BIT;
2282 props->maxResourceSize = 1024*1024*1024;
2287 struct nulldrv_entry
2293 static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
2294 get_device_proc_addr(VkDevice device, const char *name);
2296 static const struct nulldrv_entry device_funcs[] =
2298 { "vkGetDeviceProcAddr", get_device_proc_addr },
2299 { "vkEnumerateDeviceExtensionProperties", enumerate_device_extension_properties },
2300 { "vkEnumerateDeviceLayerProperties", enumerate_device_layer_properties },
2302 { "vkDestroyDevice", destroy_device },
2303 { "vkGetDeviceQueue", get_device_queue },
2304 { "vkQueueSubmit", queue_submit },
2305 { "vkQueueWaitIdle", queue_wait_idle },
2306 { "vkDeviceWaitIdle", device_wait_idle },
2307 { "vkAllocateMemory", allocate_memory },
2308 { "vkFreeMemory", free_memory },
2309 { "vkMapMemory", map_memory },
2310 { "vkUnmapMemory", unmap_memory },
2311 { "vkFlushMappedMemoryRanges", flush_mapped_memory_ranges },
2312 { "vkInvalidateMappedMemoryRanges", invalidate_mapped_memory_ranges },
2313 { "vkGetDeviceMemoryCommitment", get_device_memory_commitment },
2314 { "vkBindBufferMemory", bind_buffer_memory },
2315 { "vkBindImageMemory", bind_image_memory },
2316 { "vkGetBufferMemoryRequirements", get_buffer_memory_requirements },
2317 { "vkGetImageMemoryRequirements", get_image_memory_requirements },
2318 { "vkGetImageSparseMemoryRequirements", get_image_sparse_memory_requirements },
2319 { "vkQueueBindSparse", queue_bind_sparse },
2320 { "vkCreateFence", create_fence },
2321 { "vkDestroyFence", destroy_fence },
2322 { "vkResetFences", reset_fences },
2323 { "vkGetFenceStatus", get_fence_status },
2324 { "vkWaitForFences", wait_for_fences },
2325 { "vkCreateSemaphore", create_semaphore },
2326 { "vkDestroySemaphore", destroy_semaphore },
2327 { "vkCreateEvent", create_event },
2328 { "vkDestroyEvent", destroy_event },
2329 { "vkGetEventStatus", get_event_status },
2330 { "vkSetEvent", set_event },
2331 { "vkResetEvent", reset_event },
2332 { "vkCreateQueryPool", create_query_pool },
2333 { "vkDestroyQueryPool", destroy_query_pool },
2334 { "vkGetQueryPoolResults", get_query_pool_results },
2335 { "vkCreateBuffer", create_buffer },
2336 { "vkDestroyBuffer", destroy_buffer },
2337 { "vkCreateBufferView", create_buffer_view },
2338 { "vkDestroyBufferView", destroy_buffer_view },
2339 { "vkCreateImage", create_image },
2340 { "vkDestroyImage", destroy_image },
2341 { "vkGetImageSubresourceLayout", get_image_subresource_layout },
2342 { "vkCreateImageView", create_image_view },
2343 { "vkDestroyImageView", destroy_image_view },
2344 { "vkCreateShaderModule", create_shader_module },
2345 { "vkDestroyShaderModule", destroy_shader_module },
2346 { "vkCreatePipelineCache", create_pipeline_cache },
2347 { "vkDestroyPipelineCache", destroy_pipeline_cache },
2348 { "vkGetPipelineCacheData", get_pipeline_cache_data },
2349 { "vkMergePipelineCaches", merge_pipeline_caches },
2350 { "vkCreateGraphicsPipelines", create_graphics_pipelines },
2351 { "vkCreateComputePipelines", create_compute_pipelines },
2352 { "vkDestroyPipeline", destroy_pipeline },
2353 { "vkCreatePipelineLayout", create_pipeline_layout },
2354 { "vkDestroyPipelineLayout", destroy_pipeline_layout },
2355 { "vkCreateSampler", create_sampler },
2356 { "vkDestroySampler", destroy_sampler },
2357 { "vkCreateDescriptorSetLayout", create_descriptor_set_layout },
2358 { "vkDestroyDescriptorSetLayout", destroy_descriptor_set_layout },
2359 { "vkCreateDescriptorPool", create_descriptor_pool },
2360 { "vkDestroyDescriptorPool", destroy_descriptor_pool },
2361 { "vkResetDescriptorPool", reset_descriptor_pool },
2362 { "vkAllocateDescriptorSets", allocate_descriptor_sets },
2363 { "vkFreeDescriptorSets", free_descriptor_sets },
2364 { "vkUpdateDescriptorSets", update_descriptor_sets },
2365 { "vkCreateFramebuffer", create_framebuffer },
2366 { "vkDestroyFramebuffer", destroy_framebuffer },
2367 { "vkCreateRenderPass", create_render_pass },
2368 { "vkDestroyRenderPass", destroy_render_pass },
2369 { "vkGetRenderAreaGranularity", get_render_area_granularity },
2370 { "vkCreateCommandPool", create_command_pool },
2371 { "vkDestroyCommandPool", destroy_command_pool },
2372 { "vkResetCommandPool", reset_command_pool },
2373 { "vkAllocateCommandBuffers", allocate_command_buffers },
2374 { "vkFreeCommandBuffers", free_command_buffers },
2375 { "vkBeginCommandBuffer", begin_command_buffer },
2376 { "vkEndCommandBuffer", end_command_buffer },
2377 { "vkResetCommandBuffer", reset_command_buffer },
2378 { "vkCmdBindPipeline", cmd_bind_pipeline },
2379 { "vkCmdSetViewport", cmd_set_viewport },
2380 { "vkCmdSetScissor", cmd_set_scissor },
2381 { "vkCmdSetLineWidth", cmd_set_line_width },
2382 { "vkCmdSetDepthBias", cmd_set_depth_bias },
2383 { "vkCmdSetBlendConstants", cmd_set_blend_constants },
2384 { "vkCmdSetDepthBounds", cmd_set_depth_bounds },
2385 { "vkCmdSetStencilCompareMask", cmd_set_stencil_compare_mask },
2386 { "vkCmdSetStencilWriteMask", cmd_set_stencil_write_mask },
2387 { "vkCmdSetStencilReference", cmd_set_stencil_reference },
2388 { "vkCmdBindDescriptorSets", cmd_bind_descriptor_sets },
2389 { "vkCmdBindIndexBuffer", cmd_bind_index_buffer },
2390 { "vkCmdBindVertexBuffers", cmd_bind_vertex_buffers },
2391 { "vkCmdDraw", cmd_draw },
2392 { "vkCmdDrawIndexed", cmd_draw_indexed },
2393 { "vkCmdDrawIndirect", cmd_draw_indirect },
2394 { "vkCmdDrawIndexedIndirect", cmd_draw_indexed_indirect },
2395 { "vkCmdDispatch", cmd_dispatch },
2396 { "vkCmdDispatchIndirect", cmd_dispatch_indirect },
2397 { "vkCmdCopyBuffer", cmd_copy_buffer },
2398 { "vkCmdCopyImage", cmd_copy_image },
2399 { "vkCmdBlitImage", cmd_blit_image },
2400 { "vkCmdCopyBufferToImage", cmd_copy_buffer_to_image },
2401 { "vkCmdCopyImageToBuffer", cmd_copy_image_to_buffer },
2402 { "vkCmdUpdateBuffer", cmd_update_buffer },
2403 { "vkCmdFillBuffer", cmd_fill_buffer },
2404 { "vkCmdClearColorImage", cmd_clear_color_image },
2405 { "vkCmdClearDepthStencilImage", cmd_clear_depth_stencil_image },
2406 { "vkCmdClearAttachments", cmd_clear_attachments },
2407 { "vkCmdResolveImage", cmd_resolve_image },
2408 { "vkCmdSetEvent", cmd_set_event },
2409 { "vkCmdResetEvent", cmd_reset_event },
2410 { "vkCmdWaitEvents", cmd_wait_events },
2411 { "vkCmdPipelineBarrier", cmd_pipeline_barrier },
2412 { "vkCmdBeginQuery", cmd_begin_query },
2413 { "vkCmdEndQuery", cmd_end_query },
2414 { "vkCmdResetQueryPool", cmd_reset_query_pool },
2415 { "vkCmdWriteTimestamp", cmd_write_timestamp },
2416 { "vkCmdCopyQueryPoolResults", cmd_copy_query_pool_results },
2417 { "vkCmdPushConstants", cmd_push_constants },
2418 { "vkCmdBeginRenderPass", cmd_begin_render_pass },
2419 { "vkCmdNextSubpass", cmd_next_subpass },
2420 { "vkCmdEndRenderPass", cmd_end_render_pass },
2421 { "vkCmdExecuteCommands", cmd_execute_commands },
2424 static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
2425 get_device_proc_addr(VkDevice device, const char *name)
2429 for (i = 0; i < ARRAY_LENGTH(device_funcs); ++i) {
2430 if (strcmp(name, device_funcs[i].name) == 0)
2431 return device_funcs[i].func;
2437 static const struct nulldrv_entry global_funcs[] =
2439 { "vkEnumerateInstanceLayerProperties", enumerate_instance_layer_properties },
2440 { "vkEnumerateInstanceExtensionProperties", enumerate_instance_extension_properties },
2441 { "vkCreateInstance", create_instance },
2444 static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
2445 get_instance_proc_addr(VkInstance instance, const char *name);
2447 static const struct nulldrv_entry instance_funcs[] =
2449 { "vkGetInstanceProcAddr", get_instance_proc_addr },
2450 { "vkDestroyInstance", destroy_instance },
2451 { "vkEnumeratePhysicalDevices", enumerate_physical_devices },
2453 { "vkGetPhysicalDeviceFeatures", get_physical_device_features },
2454 { "vkGetPhysicalDeviceFormatProperties", get_physical_device_format_properties },
2455 { "vkGetPhysicalDeviceImageFormatProperties", get_physical_device_image_format_properties },
2456 { "vkGetPhysicalDeviceProperties", get_physical_device_properties },
2457 { "vkGetPhysicalDeviceQueueFamilyProperties", get_physical_device_queue_family_properties },
2458 { "vkGetPhysicalDeviceMemoryProperties", get_physical_device_memory_properties },
2459 { "vkGetPhysicalDeviceSparseImageFormatProperties",
2460 get_physical_device_sparse_image_format_properties },
2461 { "vkCreateDevice", create_device },
2464 static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
2465 get_instance_proc_addr(VkInstance instance, const char *name)
2469 if (instance == NULL)
2471 for (i = 0; i < ARRAY_LENGTH(global_funcs); ++i) {
2472 if (strcmp(name, global_funcs[i].name) == 0)
2473 return global_funcs[i].func;
2478 for (i = 0; i < ARRAY_LENGTH(instance_funcs); ++i) {
2479 if (strcmp(name, instance_funcs[i].name) == 0)
2480 return instance_funcs[i].func;
2483 for (i = 0; i < ARRAY_LENGTH(device_funcs); ++i) {
2484 if (strcmp(name, device_funcs[i].name) == 0)
2485 return device_funcs[i].func;
2492 VK_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
2493 vk_icdGetInstanceProcAddr(VkInstance instance, const char *name)
2497 for (i = 0; i < ARRAY_LENGTH(global_funcs); ++i) {
2498 if (strcmp(name, global_funcs[i].name) == 0)
2499 return global_funcs[i].func;
2502 for (i = 0; i < ARRAY_LENGTH(instance_funcs); ++i) {
2503 if (strcmp(name, instance_funcs[i].name) == 0)
2504 return instance_funcs[i].func;
2507 for (i = 0; i < ARRAY_LENGTH(device_funcs); ++i) {
2508 if (strcmp(name, device_funcs[i].name) == 0)
2509 return device_funcs[i].func;
2516 vk_create_presentable_image(VkDevice device, const VkImageCreateInfo *info, tbm_surface_h surface)
2519 struct nulldrv_dev *dev = nulldrv_dev(device);
2520 struct nulldrv_img *img;
2522 if (nulldrv_img_create(dev, surface, info, false, &img) == VK_SUCCESS)
2523 return (VkImage)(uintptr_t)img;
2525 return (VkImage)(uintptr_t)NULL;
2529 vk_signal_semaphore(VkSemaphore semaphore)
2535 vk_wait_for_semaphores(uint32_t count, const VkSemaphore *semaphores)
2541 vk_signal_fence(VkFence fence)