null_driver.cpp revision d02edcbb40d476b6d3b5ae279a6ccef786be8848
1/*
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
17#include <hardware/hwvulkan.h>
18
19#include <array>
20#include <algorithm>
21#include <inttypes.h>
22#include <string.h>
23
24// #define LOG_NDEBUG 0
25#include <log/log.h>
26#include <utils/Errors.h>
27
28#include "null_driver.h"
29
30using namespace null_driver;
31
32struct VkPhysicalDevice_T {
33    hwvulkan_dispatch_t dispatch;
34};
35
36struct VkInstance_T {
37    hwvulkan_dispatch_t dispatch;
38    const VkAllocCallbacks* alloc;
39    VkPhysicalDevice_T physical_device;
40};
41
42struct VkQueue_T {
43    hwvulkan_dispatch_t dispatch;
44};
45
46struct VkCmdBuffer_T {
47    hwvulkan_dispatch_t dispatch;
48};
49
50namespace {
51// Handles for non-dispatchable objects are either pointers, or arbitrary
52// 64-bit non-zero values. We only use pointers when we need to keep state for
53// the object even in a null driver. For the rest, we form a handle as:
54//   [63:63] = 1 to distinguish from pointer handles*
55//   [62:56] = non-zero handle type enum value
56//   [55: 0] = per-handle-type incrementing counter
57// * This works because virtual addresses with the high bit set are reserved
58// for kernel data in all ABIs we run on.
59//
60// We never reclaim handles on vkDestroy*. It's not even necessary for us to
61// have distinct handles for live objects, and practically speaking we won't
62// ever create 2^56 objects of the same type from a single VkDevice in a null
63// driver.
64//
65// Using a namespace here instead of 'enum class' since we want scoped
66// constants but also want implicit conversions to integral types.
67namespace HandleType {
68enum Enum {
69    kAttachmentView,
70    kBufferView,
71    kCmdPool,
72    kDescriptorPool,
73    kDescriptorSet,
74    kDescriptorSetLayout,
75    kDynamicColorBlendState,
76    kDynamicDepthStencilState,
77    kDynamicRasterState,
78    kDynamicViewportState,
79    kEvent,
80    kFence,
81    kFramebuffer,
82    kImageView,
83    kPipeline,
84    kPipelineCache,
85    kPipelineLayout,
86    kQueryPool,
87    kRenderPass,
88    kSampler,
89    kSemaphore,
90    kShader,
91    kShaderModule,
92
93    kNumTypes
94};
95}  // namespace HandleType
96uint64_t AllocHandle(VkDevice device, HandleType::Enum type);
97
98const VkDeviceSize kMaxDeviceMemory = VkDeviceSize(INTPTR_MAX) + 1;
99
100}  // anonymous namespace
101
102struct VkDevice_T {
103    hwvulkan_dispatch_t dispatch;
104    VkInstance_T* instance;
105    VkQueue_T queue;
106    std::array<uint64_t, HandleType::kNumTypes> next_handle;
107};
108
109// -----------------------------------------------------------------------------
110// Declare HAL_MODULE_INFO_SYM early so it can be referenced by nulldrv_device
111// later.
112
113namespace {
114int OpenDevice(const hw_module_t* module, const char* id, hw_device_t** device);
115hw_module_methods_t nulldrv_module_methods = {.open = OpenDevice};
116}  // namespace
117
118#pragma clang diagnostic push
119#pragma clang diagnostic ignored "-Wmissing-variable-declarations"
120__attribute__((visibility("default"))) hwvulkan_module_t HAL_MODULE_INFO_SYM = {
121    .common =
122        {
123         .tag = HARDWARE_MODULE_TAG,
124         .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
125         .hal_api_version = HARDWARE_HAL_API_VERSION,
126         .id = HWVULKAN_HARDWARE_MODULE_ID,
127         .name = "Null Vulkan Driver",
128         .author = "The Android Open Source Project",
129         .methods = &nulldrv_module_methods,
130        },
131};
132#pragma clang diagnostic pop
133
134// -----------------------------------------------------------------------------
135
136namespace {
137
138VkResult CreateInstance(const VkInstanceCreateInfo* create_info,
139                        VkInstance* out_instance) {
140    VkInstance_T* instance =
141        static_cast<VkInstance_T*>(create_info->pAllocCb->pfnAlloc(
142            create_info->pAllocCb->pUserData, sizeof(VkInstance_T),
143            alignof(VkInstance_T), VK_SYSTEM_ALLOC_TYPE_API_OBJECT));
144    if (!instance)
145        return VK_ERROR_OUT_OF_HOST_MEMORY;
146
147    instance->dispatch.magic = HWVULKAN_DISPATCH_MAGIC;
148    instance->alloc = create_info->pAllocCb;
149    instance->physical_device.dispatch.magic = HWVULKAN_DISPATCH_MAGIC;
150
151    *out_instance = instance;
152    return VK_SUCCESS;
153}
154
155int CloseDevice(struct hw_device_t* /*device*/) {
156    // nothing to do - opening a device doesn't allocate any resources
157    return 0;
158}
159
160hwvulkan_device_t nulldrv_device = {
161    .common =
162        {
163         .tag = HARDWARE_DEVICE_TAG,
164         .version = HWVULKAN_DEVICE_API_VERSION_0_1,
165         .module = &HAL_MODULE_INFO_SYM.common,
166         .close = CloseDevice,
167        },
168    .GetGlobalExtensionProperties = GetGlobalExtensionProperties,
169    .CreateInstance = CreateInstance,
170    .GetInstanceProcAddr = GetInstanceProcAddr};
171
172int OpenDevice(const hw_module_t* /*module*/,
173               const char* id,
174               hw_device_t** device) {
175    if (strcmp(id, HWVULKAN_DEVICE_0) == 0) {
176        *device = &nulldrv_device.common;
177        return 0;
178    }
179    return -ENOENT;
180}
181
182VkInstance_T* GetInstanceFromPhysicalDevice(
183    VkPhysicalDevice_T* physical_device) {
184    return reinterpret_cast<VkInstance_T*>(
185        reinterpret_cast<uintptr_t>(physical_device) -
186        offsetof(VkInstance_T, physical_device));
187}
188
189uint64_t AllocHandle(VkDevice device, HandleType::Enum type) {
190    const uint64_t kHandleMask = (UINT64_C(1) << 56) - 1;
191    ALOGE_IF(device->next_handle[type] == kHandleMask,
192             "non-dispatchable handles of type=%u are about to overflow", type);
193    return (UINT64_C(1) << 63) | ((uint64_t(type) & 0x7) << 56) |
194           (device->next_handle[type]++ & kHandleMask);
195}
196
197}  // namespace
198
199namespace null_driver {
200
201template <typename HandleT>
202struct HandleTraits {};
203
204template <typename HandleT>
205typename HandleTraits<HandleT>::PointerType GetObjectFromHandle(
206    const HandleT& h) {
207    return reinterpret_cast<typename HandleTraits<HandleT>::PointerType>(
208        uintptr_t(h.handle));
209}
210
211template <typename T>
212typename T::HandleType GetHandleToObject(const T* obj) {
213    return typename T::HandleType(reinterpret_cast<uintptr_t>(obj));
214}
215
216// -----------------------------------------------------------------------------
217// Global
218
219VkResult GetGlobalExtensionProperties(const char*,
220                                      uint32_t* count,
221                                      VkExtensionProperties*) {
222    *count = 0;
223    return VK_SUCCESS;
224}
225
226PFN_vkVoidFunction GetInstanceProcAddr(VkInstance, const char* name) {
227    PFN_vkVoidFunction proc = LookupInstanceProcAddr(name);
228    if (!proc && strcmp(name, "vkGetDeviceProcAddr") == 0)
229        proc = reinterpret_cast<PFN_vkVoidFunction>(GetDeviceProcAddr);
230    return proc;
231}
232
233PFN_vkVoidFunction GetDeviceProcAddr(VkDevice, const char* name) {
234    return LookupDeviceProcAddr(name);
235}
236
237// -----------------------------------------------------------------------------
238// Instance
239
240VkResult DestroyInstance(VkInstance instance) {
241    instance->alloc->pfnFree(instance->alloc->pUserData, instance);
242    return VK_SUCCESS;
243}
244
245// -----------------------------------------------------------------------------
246// PhysicalDevice
247
248VkResult EnumeratePhysicalDevices(VkInstance instance,
249                                  uint32_t* physical_device_count,
250                                  VkPhysicalDevice* physical_devices) {
251    if (physical_devices && *physical_device_count >= 1)
252        physical_devices[0] = &instance->physical_device;
253    *physical_device_count = 1;
254    return VK_SUCCESS;
255}
256
257VkResult GetPhysicalDeviceProperties(VkPhysicalDevice,
258                                     VkPhysicalDeviceProperties* properties) {
259    properties->apiVersion = VK_API_VERSION;
260    properties->driverVersion = VK_MAKE_VERSION(0, 0, 1);
261    properties->vendorId = 0xC0DE;
262    properties->deviceId = 0xCAFE;
263    properties->deviceType = VK_PHYSICAL_DEVICE_TYPE_OTHER;
264    strcpy(properties->deviceName, "Android Vulkan Null Driver");
265    memset(properties->pipelineCacheUUID, 0,
266           sizeof(properties->pipelineCacheUUID));
267    return VK_SUCCESS;
268}
269
270VkResult GetPhysicalDeviceMemoryProperties(
271    VkPhysicalDevice,
272    VkPhysicalDeviceMemoryProperties* properties) {
273    properties->memoryTypeCount = 1;
274    properties->memoryTypes[0].propertyFlags =
275        VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
276    properties->memoryTypes[0].heapIndex = 0;
277    properties->memoryHeapCount = 1;
278    properties->memoryHeaps[0].size = kMaxDeviceMemory;
279    properties->memoryHeaps[0].flags = VK_MEMORY_HEAP_HOST_LOCAL;
280    return VK_SUCCESS;
281}
282
283// -----------------------------------------------------------------------------
284// Device
285
286VkResult CreateDevice(VkPhysicalDevice physical_device,
287                      const VkDeviceCreateInfo*,
288                      VkDevice* out_device) {
289    VkInstance_T* instance = GetInstanceFromPhysicalDevice(physical_device);
290    VkDevice_T* device = static_cast<VkDevice_T*>(instance->alloc->pfnAlloc(
291        instance->alloc->pUserData, sizeof(VkDevice_T), alignof(VkDevice_T),
292        VK_SYSTEM_ALLOC_TYPE_API_OBJECT));
293    if (!device)
294        return VK_ERROR_OUT_OF_HOST_MEMORY;
295
296    device->dispatch.magic = HWVULKAN_DISPATCH_MAGIC;
297    device->instance = instance;
298    device->queue.dispatch.magic = HWVULKAN_DISPATCH_MAGIC;
299    std::fill(device->next_handle.begin(), device->next_handle.end(),
300              UINT64_C(0));
301
302    *out_device = device;
303    return VK_SUCCESS;
304}
305
306VkResult DestroyDevice(VkDevice device) {
307    if (!device)
308        return VK_SUCCESS;
309    const VkAllocCallbacks* alloc = device->instance->alloc;
310    alloc->pfnFree(alloc->pUserData, device);
311    return VK_SUCCESS;
312}
313
314VkResult GetDeviceQueue(VkDevice device, uint32_t, uint32_t, VkQueue* queue) {
315    *queue = &device->queue;
316    return VK_SUCCESS;
317}
318
319// -----------------------------------------------------------------------------
320// CmdBuffer
321
322VkResult CreateCommandBuffer(VkDevice device,
323                             const VkCmdBufferCreateInfo*,
324                             VkCmdBuffer* out_cmdbuf) {
325    const VkAllocCallbacks* alloc = device->instance->alloc;
326    VkCmdBuffer_T* cmdbuf = static_cast<VkCmdBuffer_T*>(alloc->pfnAlloc(
327        alloc->pUserData, sizeof(VkCmdBuffer_T), alignof(VkCmdBuffer_T),
328        VK_SYSTEM_ALLOC_TYPE_API_OBJECT));
329    if (!cmdbuf)
330        return VK_ERROR_OUT_OF_HOST_MEMORY;
331    cmdbuf->dispatch.magic = HWVULKAN_DISPATCH_MAGIC;
332    *out_cmdbuf = cmdbuf;
333    return VK_SUCCESS;
334}
335
336VkResult DestroyCommandBuffer(VkDevice device, VkCmdBuffer cmdbuf) {
337    const VkAllocCallbacks* alloc = device->instance->alloc;
338    alloc->pfnFree(alloc->pUserData, cmdbuf);
339    return VK_SUCCESS;
340}
341
342// -----------------------------------------------------------------------------
343// DeviceMemory
344
345struct DeviceMemory {
346    typedef VkDeviceMemory HandleType;
347    VkDeviceSize size;
348    alignas(16) uint8_t data[0];
349};
350template <>
351struct HandleTraits<VkDeviceMemory> {
352    typedef DeviceMemory* PointerType;
353};
354
355VkResult AllocMemory(VkDevice device,
356                     const VkMemoryAllocInfo* alloc_info,
357                     VkDeviceMemory* mem_handle) {
358    if (SIZE_MAX - sizeof(DeviceMemory) <= alloc_info->allocationSize)
359        return VK_ERROR_OUT_OF_HOST_MEMORY;
360
361    const VkAllocCallbacks* alloc = device->instance->alloc;
362    size_t size = sizeof(DeviceMemory) + size_t(alloc_info->allocationSize);
363    DeviceMemory* mem = static_cast<DeviceMemory*>(
364        alloc->pfnAlloc(alloc->pUserData, size, alignof(DeviceMemory),
365                        VK_SYSTEM_ALLOC_TYPE_API_OBJECT));
366    if (!mem)
367        return VK_ERROR_OUT_OF_HOST_MEMORY;
368    mem->size = size;
369    *mem_handle = GetHandleToObject(mem);
370    return VK_SUCCESS;
371}
372
373VkResult FreeMemory(VkDevice device, VkDeviceMemory mem_handle) {
374    const VkAllocCallbacks* alloc = device->instance->alloc;
375    DeviceMemory* mem = GetObjectFromHandle(mem_handle);
376    alloc->pfnFree(alloc->pUserData, mem);
377    return VK_SUCCESS;
378}
379
380VkResult MapMemory(VkDevice,
381                   VkDeviceMemory mem_handle,
382                   VkDeviceSize offset,
383                   VkDeviceSize,
384                   VkMemoryMapFlags,
385                   void** out_ptr) {
386    DeviceMemory* mem = GetObjectFromHandle(mem_handle);
387    *out_ptr = &mem->data[0] + offset;
388    return VK_SUCCESS;
389}
390
391// -----------------------------------------------------------------------------
392// Buffer
393
394struct Buffer {
395    typedef VkBuffer HandleType;
396    VkDeviceSize size;
397};
398template <>
399struct HandleTraits<VkBuffer> {
400    typedef Buffer* PointerType;
401};
402
403VkResult CreateBuffer(VkDevice device,
404                      const VkBufferCreateInfo* create_info,
405                      VkBuffer* buffer_handle) {
406    ALOGW_IF(create_info->size > kMaxDeviceMemory,
407             "CreateBuffer: requested size 0x%" PRIx64
408             " exceeds max device memory size 0x%" PRIx64,
409             create_info->size, kMaxDeviceMemory);
410
411    const VkAllocCallbacks* alloc = device->instance->alloc;
412    Buffer* buffer = static_cast<Buffer*>(
413        alloc->pfnAlloc(alloc->pUserData, sizeof(Buffer), alignof(Buffer),
414                        VK_SYSTEM_ALLOC_TYPE_API_OBJECT));
415    if (!buffer)
416        return VK_ERROR_OUT_OF_HOST_MEMORY;
417    buffer->size = create_info->size;
418    *buffer_handle = GetHandleToObject(buffer);
419    return VK_SUCCESS;
420}
421
422VkResult GetBufferMemoryRequirements(VkDevice,
423                                     VkBuffer buffer_handle,
424                                     VkMemoryRequirements* requirements) {
425    Buffer* buffer = GetObjectFromHandle(buffer_handle);
426    requirements->size = buffer->size;
427    requirements->alignment = 16;  // allow fast Neon/SSE memcpy
428    requirements->memoryTypeBits = 0x1;
429    return VK_SUCCESS;
430}
431
432VkResult DestroyBuffer(VkDevice device, VkBuffer buffer_handle) {
433    const VkAllocCallbacks* alloc = device->instance->alloc;
434    Buffer* buffer = GetObjectFromHandle(buffer_handle);
435    alloc->pfnFree(alloc->pUserData, buffer);
436    return VK_SUCCESS;
437}
438
439// -----------------------------------------------------------------------------
440// Image
441
442struct Image {
443    typedef VkImage HandleType;
444    VkDeviceSize size;
445};
446template <>
447struct HandleTraits<VkImage> {
448    typedef Image* PointerType;
449};
450
451VkResult CreateImage(VkDevice device,
452                     const VkImageCreateInfo* create_info,
453                     VkImage* image_handle) {
454    if (create_info->imageType != VK_IMAGE_TYPE_2D ||
455        create_info->format != VK_FORMAT_R8G8B8A8_UNORM ||
456        create_info->mipLevels != 1) {
457        ALOGE("CreateImage: not yet implemented: type=%d format=%d mips=%u",
458              create_info->imageType, create_info->format,
459              create_info->mipLevels);
460        return VK_ERROR_UNAVAILABLE;
461    }
462
463    VkDeviceSize size =
464        VkDeviceSize(create_info->extent.width * create_info->extent.height) *
465        create_info->arraySize * create_info->samples * 4u;
466    ALOGW_IF(size > kMaxDeviceMemory,
467             "CreateImage: image size 0x%" PRIx64
468             " exceeds max device memory size 0x%" PRIx64,
469             size, kMaxDeviceMemory);
470
471    const VkAllocCallbacks* alloc = device->instance->alloc;
472    Image* image = static_cast<Image*>(
473        alloc->pfnAlloc(alloc->pUserData, sizeof(Image), alignof(Image),
474                        VK_SYSTEM_ALLOC_TYPE_API_OBJECT));
475    if (!image)
476        return VK_ERROR_OUT_OF_HOST_MEMORY;
477    image->size = size;
478    *image_handle = GetHandleToObject(image);
479    return VK_SUCCESS;
480}
481
482VkResult GetImageMemoryRequirements(VkDevice,
483                                    VkImage image_handle,
484                                    VkMemoryRequirements* requirements) {
485    Image* image = GetObjectFromHandle(image_handle);
486    requirements->size = image->size;
487    requirements->alignment = 16;  // allow fast Neon/SSE memcpy
488    requirements->memoryTypeBits = 0x1;
489    return VK_SUCCESS;
490}
491
492VkResult DestroyImage(VkDevice device, VkImage image_handle) {
493    const VkAllocCallbacks* alloc = device->instance->alloc;
494    Image* image = GetObjectFromHandle(image_handle);
495    alloc->pfnFree(alloc->pUserData, image);
496    return VK_SUCCESS;
497}
498
499// -----------------------------------------------------------------------------
500// No-op types
501
502VkResult CreateAttachmentView(VkDevice device,
503                              const VkAttachmentViewCreateInfo*,
504                              VkAttachmentView* view) {
505    *view = AllocHandle(device, HandleType::kAttachmentView);
506    return VK_SUCCESS;
507}
508
509VkResult CreateBufferView(VkDevice device,
510                          const VkBufferViewCreateInfo*,
511                          VkBufferView* view) {
512    *view = AllocHandle(device, HandleType::kBufferView);
513    return VK_SUCCESS;
514}
515
516VkResult CreateCommandPool(VkDevice device,
517                           const VkCmdPoolCreateInfo*,
518                           VkCmdPool* pool) {
519    *pool = AllocHandle(device, HandleType::kCmdPool);
520    return VK_SUCCESS;
521}
522
523VkResult CreateDescriptorPool(VkDevice device,
524                              VkDescriptorPoolUsage,
525                              uint32_t,
526                              const VkDescriptorPoolCreateInfo*,
527                              VkDescriptorPool* pool) {
528    *pool = AllocHandle(device, HandleType::kDescriptorPool);
529    return VK_SUCCESS;
530}
531
532VkResult AllocDescriptorSets(VkDevice device,
533                             VkDescriptorPool,
534                             VkDescriptorSetUsage,
535                             uint32_t count,
536                             const VkDescriptorSetLayout*,
537                             VkDescriptorSet* sets,
538                             uint32_t* out_count) {
539    for (uint32_t i = 0; i < count; i++)
540        sets[i] = AllocHandle(device, HandleType::kDescriptorSet);
541    *out_count = count;
542    return VK_SUCCESS;
543}
544
545VkResult CreateDescriptorSetLayout(VkDevice device,
546                                   const VkDescriptorSetLayoutCreateInfo*,
547                                   VkDescriptorSetLayout* layout) {
548    *layout = AllocHandle(device, HandleType::kDescriptorSetLayout);
549    return VK_SUCCESS;
550}
551
552VkResult CreateDynamicColorBlendState(VkDevice device,
553                                      const VkDynamicColorBlendStateCreateInfo*,
554                                      VkDynamicColorBlendState* state) {
555    *state = AllocHandle(device, HandleType::kDynamicColorBlendState);
556    return VK_SUCCESS;
557}
558
559VkResult CreateDynamicDepthStencilState(
560    VkDevice device,
561    const VkDynamicDepthStencilStateCreateInfo*,
562    VkDynamicDepthStencilState* state) {
563    *state = AllocHandle(device, HandleType::kDynamicDepthStencilState);
564    return VK_SUCCESS;
565}
566
567VkResult CreateDynamicRasterState(VkDevice device,
568                                  const VkDynamicRasterStateCreateInfo*,
569                                  VkDynamicRasterState* state) {
570    *state = AllocHandle(device, HandleType::kDynamicRasterState);
571    return VK_SUCCESS;
572}
573
574VkResult CreateDynamicViewportState(VkDevice device,
575                                    const VkDynamicViewportStateCreateInfo*,
576                                    VkDynamicViewportState* state) {
577    *state = AllocHandle(device, HandleType::kDynamicViewportState);
578    return VK_SUCCESS;
579}
580
581VkResult CreateEvent(VkDevice device,
582                     const VkEventCreateInfo*,
583                     VkEvent* event) {
584    *event = AllocHandle(device, HandleType::kEvent);
585    return VK_SUCCESS;
586}
587
588VkResult CreateFence(VkDevice device,
589                     const VkFenceCreateInfo*,
590                     VkFence* fence) {
591    *fence = AllocHandle(device, HandleType::kFence);
592    return VK_SUCCESS;
593}
594
595VkResult CreateFramebuffer(VkDevice device,
596                           const VkFramebufferCreateInfo*,
597                           VkFramebuffer* framebuffer) {
598    *framebuffer = AllocHandle(device, HandleType::kFramebuffer);
599    return VK_SUCCESS;
600}
601
602VkResult CreateImageView(VkDevice device,
603                         const VkImageViewCreateInfo*,
604                         VkImageView* view) {
605    *view = AllocHandle(device, HandleType::kImageView);
606    return VK_SUCCESS;
607}
608
609VkResult CreateGraphicsPipelines(VkDevice device,
610                                 VkPipelineCache,
611                                 uint32_t count,
612                                 const VkGraphicsPipelineCreateInfo*,
613                                 VkPipeline* pipelines) {
614    for (uint32_t i = 0; i < count; i++)
615        pipelines[i] = AllocHandle(device, HandleType::kPipeline);
616    return VK_SUCCESS;
617}
618
619VkResult CreateComputePipelines(VkDevice device,
620                                VkPipelineCache,
621                                uint32_t count,
622                                const VkComputePipelineCreateInfo*,
623                                VkPipeline* pipelines) {
624    for (uint32_t i = 0; i < count; i++)
625        pipelines[i] = AllocHandle(device, HandleType::kPipeline);
626    return VK_SUCCESS;
627}
628
629VkResult CreatePipelineCache(VkDevice device,
630                             const VkPipelineCacheCreateInfo*,
631                             VkPipelineCache* cache) {
632    *cache = AllocHandle(device, HandleType::kPipelineCache);
633    return VK_SUCCESS;
634}
635
636VkResult CreatePipelineLayout(VkDevice device,
637                              const VkPipelineLayoutCreateInfo*,
638                              VkPipelineLayout* layout) {
639    *layout = AllocHandle(device, HandleType::kPipelineLayout);
640    return VK_SUCCESS;
641}
642
643VkResult CreateQueryPool(VkDevice device,
644                         const VkQueryPoolCreateInfo*,
645                         VkQueryPool* pool) {
646    *pool = AllocHandle(device, HandleType::kQueryPool);
647    return VK_SUCCESS;
648}
649
650VkResult CreateRenderPass(VkDevice device,
651                          const VkRenderPassCreateInfo*,
652                          VkRenderPass* renderpass) {
653    *renderpass = AllocHandle(device, HandleType::kRenderPass);
654    return VK_SUCCESS;
655}
656
657VkResult CreateSampler(VkDevice device,
658                       const VkSamplerCreateInfo*,
659                       VkSampler* sampler) {
660    *sampler = AllocHandle(device, HandleType::kSampler);
661    return VK_SUCCESS;
662}
663
664VkResult CreateSemaphore(VkDevice device,
665                         const VkSemaphoreCreateInfo*,
666                         VkSemaphore* semaphore) {
667    *semaphore = AllocHandle(device, HandleType::kSemaphore);
668    return VK_SUCCESS;
669}
670
671VkResult CreateShader(VkDevice device,
672                      const VkShaderCreateInfo*,
673                      VkShader* shader) {
674    *shader = AllocHandle(device, HandleType::kShader);
675    return VK_SUCCESS;
676}
677
678VkResult CreateShaderModule(VkDevice device,
679                            const VkShaderModuleCreateInfo*,
680                            VkShaderModule* module) {
681    *module = AllocHandle(device, HandleType::kShaderModule);
682    return VK_SUCCESS;
683}
684
685// -----------------------------------------------------------------------------
686// No-op entrypoints
687
688// clang-format off
689#pragma clang diagnostic push
690#pragma clang diagnostic ignored "-Wunused-parameter"
691
692VkResult GetPhysicalDeviceQueueCount(VkPhysicalDevice physicalDevice, uint32_t* pCount) {
693    ALOGV("TODO: vk%s", __FUNCTION__);
694    return VK_SUCCESS;
695}
696
697VkResult GetPhysicalDeviceQueueProperties(VkPhysicalDevice physicalDevice, uint32_t count, VkPhysicalDeviceQueueProperties* pQueueProperties) {
698    ALOGV("TODO: vk%s", __FUNCTION__);
699    return VK_SUCCESS;
700}
701
702VkResult GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures) {
703    ALOGV("TODO: vk%s", __FUNCTION__);
704    return VK_SUCCESS;
705}
706
707VkResult GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties) {
708    ALOGV("TODO: vk%s", __FUNCTION__);
709    return VK_SUCCESS;
710}
711
712VkResult GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageFormatProperties* pImageFormatProperties) {
713    ALOGV("TODO: vk%s", __FUNCTION__);
714    return VK_SUCCESS;
715}
716
717VkResult GetPhysicalDeviceLimits(VkPhysicalDevice physicalDevice, VkPhysicalDeviceLimits* pLimits) {
718    ALOGV("TODO: vk%s", __FUNCTION__);
719    return VK_SUCCESS;
720}
721
722VkResult GetGlobalLayerProperties(uint32_t* pCount, VkLayerProperties* pProperties) {
723    ALOGV("TODO: vk%s", __FUNCTION__);
724    return VK_SUCCESS;
725}
726
727VkResult GetPhysicalDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t* pCount, VkLayerProperties* pProperties) {
728    ALOGV("TODO: vk%s", __FUNCTION__);
729    return VK_SUCCESS;
730}
731
732VkResult GetPhysicalDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pCount, VkExtensionProperties* pProperties) {
733    ALOGV("TODO: vk%s", __FUNCTION__);
734    return VK_SUCCESS;
735}
736
737VkResult QueueSubmit(VkQueue queue, uint32_t cmdBufferCount, const VkCmdBuffer* pCmdBuffers, VkFence fence) {
738    return VK_SUCCESS;
739}
740
741VkResult QueueWaitIdle(VkQueue queue) {
742    ALOGV("TODO: vk%s", __FUNCTION__);
743    return VK_SUCCESS;
744}
745
746VkResult DeviceWaitIdle(VkDevice device) {
747    ALOGV("TODO: vk%s", __FUNCTION__);
748    return VK_SUCCESS;
749}
750
751VkResult UnmapMemory(VkDevice device, VkDeviceMemory mem) {
752    return VK_SUCCESS;
753}
754
755VkResult FlushMappedMemoryRanges(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges) {
756    ALOGV("TODO: vk%s", __FUNCTION__);
757    return VK_SUCCESS;
758}
759
760VkResult InvalidateMappedMemoryRanges(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges) {
761    ALOGV("TODO: vk%s", __FUNCTION__);
762    return VK_SUCCESS;
763}
764
765VkResult GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes) {
766    ALOGV("TODO: vk%s", __FUNCTION__);
767    return VK_SUCCESS;
768}
769
770VkResult BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memOffset) {
771    return VK_SUCCESS;
772}
773
774VkResult BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memOffset) {
775    ALOGV("TODO: vk%s", __FUNCTION__);
776    return VK_SUCCESS;
777}
778
779VkResult GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t* pNumRequirements, VkSparseImageMemoryRequirements* pSparseMemoryRequirements) {
780    ALOGV("TODO: vk%s", __FUNCTION__);
781    return VK_SUCCESS;
782}
783
784VkResult GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, uint32_t samples, VkImageUsageFlags usage, VkImageTiling tiling, uint32_t* pNumProperties, VkSparseImageFormatProperties* pProperties) {
785    ALOGV("TODO: vk%s", __FUNCTION__);
786    return VK_SUCCESS;
787}
788
789VkResult QueueBindSparseBufferMemory(VkQueue queue, VkBuffer buffer, uint32_t numBindings, const VkSparseMemoryBindInfo* pBindInfo) {
790    ALOGV("TODO: vk%s", __FUNCTION__);
791    return VK_SUCCESS;
792}
793
794VkResult QueueBindSparseImageOpaqueMemory(VkQueue queue, VkImage image, uint32_t numBindings, const VkSparseMemoryBindInfo* pBindInfo) {
795    ALOGV("TODO: vk%s", __FUNCTION__);
796    return VK_SUCCESS;
797}
798
799VkResult QueueBindSparseImageMemory(VkQueue queue, VkImage image, uint32_t numBindings, const VkSparseImageMemoryBindInfo* pBindInfo) {
800    ALOGV("TODO: vk%s", __FUNCTION__);
801    return VK_SUCCESS;
802}
803
804VkResult DestroyFence(VkDevice device, VkFence fence) {
805    return VK_SUCCESS;
806}
807
808VkResult ResetFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences) {
809    return VK_SUCCESS;
810}
811
812VkResult GetFenceStatus(VkDevice device, VkFence fence) {
813    ALOGV("TODO: vk%s", __FUNCTION__);
814    return VK_SUCCESS;
815}
816
817VkResult WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout) {
818    return VK_SUCCESS;
819}
820
821VkResult DestroySemaphore(VkDevice device, VkSemaphore semaphore) {
822    return VK_SUCCESS;
823}
824
825VkResult QueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore) {
826    ALOGV("TODO: vk%s", __FUNCTION__);
827    return VK_SUCCESS;
828}
829
830VkResult QueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore) {
831    ALOGV("TODO: vk%s", __FUNCTION__);
832    return VK_SUCCESS;
833}
834
835VkResult DestroyEvent(VkDevice device, VkEvent event) {
836    return VK_SUCCESS;
837}
838
839VkResult GetEventStatus(VkDevice device, VkEvent event) {
840    ALOGV("TODO: vk%s", __FUNCTION__);
841    return VK_SUCCESS;
842}
843
844VkResult SetEvent(VkDevice device, VkEvent event) {
845    ALOGV("TODO: vk%s", __FUNCTION__);
846    return VK_SUCCESS;
847}
848
849VkResult ResetEvent(VkDevice device, VkEvent event) {
850    ALOGV("TODO: vk%s", __FUNCTION__);
851    return VK_SUCCESS;
852}
853
854VkResult DestroyQueryPool(VkDevice device, VkQueryPool queryPool) {
855    return VK_SUCCESS;
856}
857
858VkResult GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData, VkQueryResultFlags flags) {
859    ALOGV("TODO: vk%s", __FUNCTION__);
860    return VK_SUCCESS;
861}
862
863VkResult DestroyBufferView(VkDevice device, VkBufferView bufferView) {
864    return VK_SUCCESS;
865}
866
867VkResult GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout) {
868    ALOGV("TODO: vk%s", __FUNCTION__);
869    return VK_SUCCESS;
870}
871
872VkResult DestroyImageView(VkDevice device, VkImageView imageView) {
873    return VK_SUCCESS;
874}
875
876VkResult DestroyAttachmentView(VkDevice device, VkAttachmentView attachmentView) {
877    return VK_SUCCESS;
878}
879
880VkResult DestroyShaderModule(VkDevice device, VkShaderModule shaderModule) {
881    return VK_SUCCESS;
882}
883
884VkResult DestroyShader(VkDevice device, VkShader shader) {
885    return VK_SUCCESS;
886}
887
888VkResult DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache) {
889    return VK_SUCCESS;
890}
891
892size_t GetPipelineCacheSize(VkDevice device, VkPipelineCache pipelineCache) {
893    ALOGV("TODO: vk%s", __FUNCTION__);
894    return VK_SUCCESS;
895}
896
897VkResult GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, void* pData) {
898    ALOGV("TODO: vk%s", __FUNCTION__);
899    return VK_SUCCESS;
900}
901
902VkResult MergePipelineCaches(VkDevice device, VkPipelineCache destCache, uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches) {
903    ALOGV("TODO: vk%s", __FUNCTION__);
904    return VK_SUCCESS;
905}
906
907VkResult DestroyPipeline(VkDevice device, VkPipeline pipeline) {
908    return VK_SUCCESS;
909}
910
911VkResult DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout) {
912    return VK_SUCCESS;
913}
914
915VkResult DestroySampler(VkDevice device, VkSampler sampler) {
916    return VK_SUCCESS;
917}
918
919VkResult DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout) {
920    return VK_SUCCESS;
921}
922
923VkResult DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool) {
924    return VK_SUCCESS;
925}
926
927VkResult ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool) {
928    ALOGV("TODO: vk%s", __FUNCTION__);
929    return VK_SUCCESS;
930}
931
932VkResult UpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies) {
933    ALOGV("TODO: vk%s", __FUNCTION__);
934    return VK_SUCCESS;
935}
936
937VkResult FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets) {
938    ALOGV("TODO: vk%s", __FUNCTION__);
939    return VK_SUCCESS;
940}
941
942VkResult DestroyDynamicViewportState(VkDevice device, VkDynamicViewportState dynamicViewportState) {
943    return VK_SUCCESS;
944}
945
946VkResult DestroyDynamicRasterState(VkDevice device, VkDynamicRasterState dynamicRasterState) {
947    return VK_SUCCESS;
948}
949
950VkResult DestroyDynamicColorBlendState(VkDevice device, VkDynamicColorBlendState dynamicColorBlendState) {
951    return VK_SUCCESS;
952}
953
954VkResult DestroyDynamicDepthStencilState(VkDevice device, VkDynamicDepthStencilState dynamicDepthStencilState) {
955    return VK_SUCCESS;
956}
957
958VkResult DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer) {
959    return VK_SUCCESS;
960}
961
962VkResult DestroyRenderPass(VkDevice device, VkRenderPass renderPass) {
963    return VK_SUCCESS;
964}
965
966VkResult GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity) {
967    ALOGV("TODO: vk%s", __FUNCTION__);
968    return VK_SUCCESS;
969}
970
971VkResult DestroyCommandPool(VkDevice device, VkCmdPool cmdPool) {
972    return VK_SUCCESS;
973}
974
975VkResult ResetCommandPool(VkDevice device, VkCmdPool cmdPool, VkCmdPoolResetFlags flags) {
976    ALOGV("TODO: vk%s", __FUNCTION__);
977    return VK_SUCCESS;
978}
979
980VkResult BeginCommandBuffer(VkCmdBuffer cmdBuffer, const VkCmdBufferBeginInfo* pBeginInfo) {
981    return VK_SUCCESS;
982}
983
984VkResult EndCommandBuffer(VkCmdBuffer cmdBuffer) {
985    return VK_SUCCESS;
986}
987
988VkResult ResetCommandBuffer(VkCmdBuffer cmdBuffer, VkCmdBufferResetFlags flags) {
989    ALOGV("TODO: vk%s", __FUNCTION__);
990    return VK_SUCCESS;
991}
992
993void CmdBindPipeline(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
994}
995
996void CmdBindDynamicViewportState(VkCmdBuffer cmdBuffer, VkDynamicViewportState dynamicViewportState) {
997}
998
999void CmdBindDynamicRasterState(VkCmdBuffer cmdBuffer, VkDynamicRasterState dynamicRasterState) {
1000}
1001
1002void CmdBindDynamicColorBlendState(VkCmdBuffer cmdBuffer, VkDynamicColorBlendState dynamicColorBlendState) {
1003}
1004
1005void CmdBindDynamicDepthStencilState(VkCmdBuffer cmdBuffer, VkDynamicDepthStencilState dynamicDepthStencilState) {
1006}
1007
1008void CmdBindDescriptorSets(VkCmdBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets) {
1009}
1010
1011void CmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
1012}
1013
1014void CmdBindVertexBuffers(VkCmdBuffer cmdBuffer, uint32_t startBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets) {
1015}
1016
1017void CmdDraw(VkCmdBuffer cmdBuffer, uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount) {
1018}
1019
1020void CmdDrawIndexed(VkCmdBuffer cmdBuffer, uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount) {
1021}
1022
1023void CmdDrawIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
1024}
1025
1026void CmdDrawIndexedIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
1027}
1028
1029void CmdDispatch(VkCmdBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z) {
1030}
1031
1032void CmdDispatchIndirect(VkCmdBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset) {
1033}
1034
1035void CmdCopyBuffer(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions) {
1036}
1037
1038void CmdCopyImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageCopy* pRegions) {
1039}
1040
1041void CmdBlitImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkTexFilter filter) {
1042}
1043
1044void CmdCopyBufferToImage(VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions) {
1045}
1046
1047void CmdCopyImageToBuffer(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer destBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions) {
1048}
1049
1050void CmdUpdateBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData) {
1051}
1052
1053void CmdFillBuffer(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data) {
1054}
1055
1056void CmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
1057}
1058
1059void CmdClearDepthStencilImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
1060}
1061
1062void CmdClearColorAttachment(VkCmdBuffer cmdBuffer, uint32_t colorAttachment, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rectCount, const VkRect3D* pRects) {
1063}
1064
1065void CmdClearDepthStencilAttachment(VkCmdBuffer cmdBuffer, VkImageAspectFlags imageAspectMask, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rectCount, const VkRect3D* pRects) {
1066}
1067
1068void CmdResolveImage(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions) {
1069}
1070
1071void CmdSetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
1072}
1073
1074void CmdResetEvent(VkCmdBuffer cmdBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
1075}
1076
1077void CmdWaitEvents(VkCmdBuffer cmdBuffer, uint32_t eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags destStageMask, uint32_t memBarrierCount, const void* const* ppMemBarriers) {
1078}
1079
1080void CmdPipelineBarrier(VkCmdBuffer cmdBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags destStageMask, VkBool32 byRegion, uint32_t memBarrierCount, const void* const* ppMemBarriers) {
1081}
1082
1083void CmdBeginQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
1084}
1085
1086void CmdEndQuery(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot) {
1087}
1088
1089void CmdResetQueryPool(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount) {
1090}
1091
1092void CmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset) {
1093}
1094
1095void CmdCopyQueryPoolResults(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize destStride, VkQueryResultFlags flags) {
1096}
1097
1098void CmdPushConstants(VkCmdBuffer cmdBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t start, uint32_t length, const void* values) {
1099}
1100
1101void CmdBeginRenderPass(VkCmdBuffer cmdBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkRenderPassContents contents) {
1102}
1103
1104void CmdNextSubpass(VkCmdBuffer cmdBuffer, VkRenderPassContents contents) {
1105}
1106
1107void CmdEndRenderPass(VkCmdBuffer cmdBuffer) {
1108}
1109
1110void CmdExecuteCommands(VkCmdBuffer cmdBuffer, uint32_t cmdBuffersCount, const VkCmdBuffer* pCmdBuffers) {
1111}
1112
1113#pragma clang diagnostic pop
1114// clang-format on
1115
1116}  // namespace null_driver
1117