1d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall/*
2d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * Copyright 2015 The Android Open Source Project
3d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall *
4d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * Licensed under the Apache License, Version 2.0 (the "License");
5d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * you may not use this file except in compliance with the License.
6d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * You may obtain a copy of the License at
7d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall *
8d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall *      http://www.apache.org/licenses/LICENSE-2.0
9d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall *
10d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * Unless required by applicable law or agreed to in writing, software
11d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * distributed under the License is distributed on an "AS IS" BASIS,
12d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * See the License for the specific language governing permissions and
14d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * limitations under the License.
15d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall */
16d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall
1704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <hardware/hwvulkan.h>
1804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
191f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall#include <algorithm>
201f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall#include <array>
21715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall#include <inttypes.h>
22d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall#include <stdlib.h>
23715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall#include <string.h>
2404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
2573ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall#include <log/log.h>
2604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <utils/Errors.h>
2704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
281f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall#include "null_driver_gen.h"
2904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
3004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallusing namespace null_driver;
3104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
3204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallstruct VkPhysicalDevice_T {
3304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    hwvulkan_dispatch_t dispatch;
3404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall};
3504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
3604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallstruct VkInstance_T {
3704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    hwvulkan_dispatch_t dispatch;
383fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    VkAllocationCallbacks allocator;
3904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    VkPhysicalDevice_T physical_device;
40715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    uint64_t next_callback_handle;
4104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall};
4204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
4304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallstruct VkQueue_T {
4404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    hwvulkan_dispatch_t dispatch;
4504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall};
4604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
473fbc856120217247c72fb5ed88500000f3881c45Jesse Hallstruct VkCommandBuffer_T {
4804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    hwvulkan_dispatch_t dispatch;
4904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall};
5004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
51f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hallnamespace {
52f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// Handles for non-dispatchable objects are either pointers, or arbitrary
53f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// 64-bit non-zero values. We only use pointers when we need to keep state for
54f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// the object even in a null driver. For the rest, we form a handle as:
55f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall//   [63:63] = 1 to distinguish from pointer handles*
56f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall//   [62:56] = non-zero handle type enum value
57f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall//   [55: 0] = per-handle-type incrementing counter
58f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// * This works because virtual addresses with the high bit set are reserved
59f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// for kernel data in all ABIs we run on.
60f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall//
61f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// We never reclaim handles on vkDestroy*. It's not even necessary for us to
62f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// have distinct handles for live objects, and practically speaking we won't
63f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// ever create 2^56 objects of the same type from a single VkDevice in a null
64f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// driver.
65f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall//
66f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// Using a namespace here instead of 'enum class' since we want scoped
67f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// constants but also want implicit conversions to integral types.
68f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hallnamespace HandleType {
69c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hallenum Enum {
70c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kBufferView,
71715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    kDebugReportCallbackEXT,
72c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kDescriptorPool,
73c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kDescriptorSet,
74c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kDescriptorSetLayout,
75c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kEvent,
76c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kFence,
77c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kFramebuffer,
78c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kImageView,
79c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kPipeline,
80c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kPipelineCache,
81c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kPipelineLayout,
82c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kQueryPool,
83c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kRenderPass,
84c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kSampler,
85c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kSemaphore,
86c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kShaderModule,
87c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall
88c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall    kNumTypes
89c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall};
90c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall}  // namespace HandleType
91bde8ee3037ed1e26d4e603332137c88e6c6d55cbJesse Hall
9200f10fec7d5cb96bc980a6d272dc8d33597a1b20Jesse Hallconst VkDeviceSize kMaxDeviceMemory = 0x10000000;  // 256 MiB, arbitrary
93bde8ee3037ed1e26d4e603332137c88e6c6d55cbJesse Hall
94c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall}  // anonymous namespace
95f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall
9604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallstruct VkDevice_T {
9704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    hwvulkan_dispatch_t dispatch;
983fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    VkAllocationCallbacks allocator;
9904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    VkInstance_T* instance;
10004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    VkQueue_T queue;
101f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall    std::array<uint64_t, HandleType::kNumTypes> next_handle;
10204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall};
10304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
10404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall// -----------------------------------------------------------------------------
10504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall// Declare HAL_MODULE_INFO_SYM early so it can be referenced by nulldrv_device
10604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall// later.
10704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
10804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallnamespace {
10904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallint OpenDevice(const hw_module_t* module, const char* id, hw_device_t** device);
11004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallhw_module_methods_t nulldrv_module_methods = {.open = OpenDevice};
11104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}  // namespace
11204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
11304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#pragma clang diagnostic push
11404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#pragma clang diagnostic ignored "-Wmissing-variable-declarations"
11504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall__attribute__((visibility("default"))) hwvulkan_module_t HAL_MODULE_INFO_SYM = {
11604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    .common =
11704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        {
11803c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .tag = HARDWARE_MODULE_TAG,
11903c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
12003c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .hal_api_version = HARDWARE_HAL_API_VERSION,
12103c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .id = HWVULKAN_HARDWARE_MODULE_ID,
12203c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .name = "Null Vulkan Driver",
12303c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .author = "The Android Open Source Project",
12403c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .methods = &nulldrv_module_methods,
12504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        },
12604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall};
12704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#pragma clang diagnostic pop
12804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall// -----------------------------------------------------------------------------
13004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallnamespace {
13204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallint CloseDevice(struct hw_device_t* /*device*/) {
13404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    // nothing to do - opening a device doesn't allocate any resources
13504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return 0;
13604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
13704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallhwvulkan_device_t nulldrv_device = {
13904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    .common =
14004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        {
14103c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .tag = HARDWARE_DEVICE_TAG,
14203c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .version = HWVULKAN_DEVICE_API_VERSION_0_1,
14303c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .module = &HAL_MODULE_INFO_SYM.common,
14403c64b0b525a2f259456a220c51bbc8438ae2c03Michael Lentine            .close = CloseDevice,
14504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        },
1465ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    .EnumerateInstanceExtensionProperties =
1475ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        EnumerateInstanceExtensionProperties,
14804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    .CreateInstance = CreateInstance,
14904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    .GetInstanceProcAddr = GetInstanceProcAddr};
15004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
15104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallint OpenDevice(const hw_module_t* /*module*/,
15204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall               const char* id,
15304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall               hw_device_t** device) {
15404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    if (strcmp(id, HWVULKAN_DEVICE_0) == 0) {
15504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        *device = &nulldrv_device.common;
15604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        return 0;
15704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    }
15804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return -ENOENT;
15904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
16004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
16104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse HallVkInstance_T* GetInstanceFromPhysicalDevice(
16204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    VkPhysicalDevice_T* physical_device) {
16304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return reinterpret_cast<VkInstance_T*>(
16404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        reinterpret_cast<uintptr_t>(physical_device) -
16504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        offsetof(VkInstance_T, physical_device));
16604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
16704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
168715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Halluint64_t AllocHandle(uint64_t type, uint64_t* next_handle) {
169715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    const uint64_t kHandleMask = (UINT64_C(1) << 56) - 1;
170715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    ALOGE_IF(*next_handle == kHandleMask,
171715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall             "non-dispatchable handles of type=%" PRIu64
172715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall             " are about to overflow",
173715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall             type);
174715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    return (UINT64_C(1) << 63) | ((type & 0x7) << 56) |
175715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall           ((*next_handle)++ & kHandleMask);
176715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall}
177715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall
178715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Halltemplate <class Handle>
179715b86ac7d0853131b375ff786c87d8d87a762a1Jesse HallHandle AllocHandle(VkInstance instance, HandleType::Enum type) {
180715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    return reinterpret_cast<Handle>(
181715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        AllocHandle(type, &instance->next_callback_handle));
182715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall}
183715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall
1843fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentinetemplate <class Handle>
1853fec89ea37127fe292a6766b5320fcbf9574c0edMichael LentineHandle AllocHandle(VkDevice device, HandleType::Enum type) {
1863fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    return reinterpret_cast<Handle>(
187715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        AllocHandle(type, &device->next_handle[type]));
188f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall}
189f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall
190d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse HallVKAPI_ATTR void* DefaultAllocate(void*,
191d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall                                 size_t size,
192d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall                                 size_t alignment,
193d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall                                 VkSystemAllocationScope) {
194d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    void* ptr = nullptr;
195d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    // Vulkan requires 'alignment' to be a power of two, but posix_memalign
196d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    // additionally requires that it be at least sizeof(void*).
197d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    int ret = posix_memalign(&ptr, std::max(alignment, sizeof(void*)), size);
198d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    return ret == 0 ? ptr : nullptr;
199d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall}
200d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall
201d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse HallVKAPI_ATTR void* DefaultReallocate(void*,
202d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall                                   void* ptr,
203d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall                                   size_t size,
204d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall                                   size_t alignment,
205d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall                                   VkSystemAllocationScope) {
206d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    if (size == 0) {
207d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall        free(ptr);
208d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall        return nullptr;
209d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    }
210d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall
211d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    // TODO(jessehall): Right now we never shrink allocations; if the new
212d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    // request is smaller than the existing chunk, we just continue using it.
213d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    // The null driver never reallocs, so this doesn't matter. If that changes,
214d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    // or if this code is copied into some other project, this should probably
215d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    // have a heuristic to allocate-copy-free when doing so will save "enough"
216d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    // space.
217d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    size_t old_size = ptr ? malloc_usable_size(ptr) : 0;
218d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    if (size <= old_size)
219d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall        return ptr;
220d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall
221d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    void* new_ptr = nullptr;
222d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    if (posix_memalign(&new_ptr, std::max(alignment, sizeof(void*)), size) != 0)
223d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall        return nullptr;
224d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    if (ptr) {
225d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall        memcpy(new_ptr, ptr, std::min(old_size, size));
226d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall        free(ptr);
227d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    }
228d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    return new_ptr;
229d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall}
230d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall
231d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse HallVKAPI_ATTR void DefaultFree(void*, void* ptr) {
232d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    free(ptr);
233d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall}
234d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall
235d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hallconst VkAllocationCallbacks kDefaultAllocCallbacks = {
236d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    .pUserData = nullptr,
237d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    .pfnAllocation = DefaultAllocate,
238d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    .pfnReallocation = DefaultReallocate,
239d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    .pfnFree = DefaultFree,
240d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall};
241d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall
24204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}  // namespace
24304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
24404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallnamespace null_driver {
24504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
246a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall#define DEFINE_OBJECT_HANDLE_CONVERSION(T)              \
247a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    T* Get##T##FromHandle(Vk##T h);                     \
248a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    T* Get##T##FromHandle(Vk##T h) {                    \
249a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall        return reinterpret_cast<T*>(uintptr_t(h));      \
250a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    }                                                   \
251a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    Vk##T GetHandleTo##T(const T* obj);                 \
252a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    Vk##T GetHandleTo##T(const T* obj) {                \
253a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall        return Vk##T(reinterpret_cast<uintptr_t>(obj)); \
254a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    }
255f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall
25673ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall// -----------------------------------------------------------------------------
25773ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall// Global
25873ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall
259e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse HallVKAPI_ATTR
260715b86ac7d0853131b375ff786c87d8d87a762a1Jesse HallVkResult EnumerateInstanceExtensionProperties(
261715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    const char* layer_name,
262715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    uint32_t* count,
263715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    VkExtensionProperties* properties) {
264715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    if (layer_name) {
265715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        ALOGW(
266715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall            "Driver vkEnumerateInstanceExtensionProperties shouldn't be called "
267715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall            "with a layer name ('%s')",
268715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall            layer_name);
269715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    }
270715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall
2714b62e4fd280d4f7a24f906a83ff16f5cd74bf171Jesse Hall// NOTE: Change this to zero to report and extension, which can be useful
2724b62e4fd280d4f7a24f906a83ff16f5cd74bf171Jesse Hall// for testing changes to the loader.
2734b62e4fd280d4f7a24f906a83ff16f5cd74bf171Jesse Hall#if 1
2744b62e4fd280d4f7a24f906a83ff16f5cd74bf171Jesse Hall    (void)properties;  // unused
2754b62e4fd280d4f7a24f906a83ff16f5cd74bf171Jesse Hall    *count = 0;
2764b62e4fd280d4f7a24f906a83ff16f5cd74bf171Jesse Hall    return VK_SUCCESS;
2774b62e4fd280d4f7a24f906a83ff16f5cd74bf171Jesse Hall#else
278715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    const VkExtensionProperties kExtensions[] = {
279715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        {VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
280715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    const uint32_t kExtensionsCount =
281715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        sizeof(kExtensions) / sizeof(kExtensions[0]);
282715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall
283715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    if (!properties || *count > kExtensionsCount)
284715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        *count = kExtensionsCount;
285715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    if (properties)
286715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        std::copy(kExtensions, kExtensions + *count, properties);
287715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    return *count < kExtensionsCount ? VK_INCOMPLETE : VK_SUCCESS;
2884b62e4fd280d4f7a24f906a83ff16f5cd74bf171Jesse Hall#endif
28973ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall}
29073ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall
291e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse HallVKAPI_ATTR
292715b86ac7d0853131b375ff786c87d8d87a762a1Jesse HallVkResult CreateInstance(const VkInstanceCreateInfo* create_info,
2931f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall                        const VkAllocationCallbacks* allocator,
2941f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall                        VkInstance* out_instance) {
295d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall    if (!allocator)
296d3b1450e6606cacff0d2c6e0ff6e45f1420ad5eeJesse Hall        allocator = &kDefaultAllocCallbacks;
2971f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall
2981f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall    VkInstance_T* instance =
2991f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall        static_cast<VkInstance_T*>(allocator->pfnAllocation(
3001f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall            allocator->pUserData, sizeof(VkInstance_T), alignof(VkInstance_T),
3011f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall            VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE));
3021f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall    if (!instance)
3031f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall        return VK_ERROR_OUT_OF_HOST_MEMORY;
3041f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall
3051f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall    instance->dispatch.magic = HWVULKAN_DISPATCH_MAGIC;
3061f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall    instance->allocator = *allocator;
3071f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall    instance->physical_device.dispatch.magic = HWVULKAN_DISPATCH_MAGIC;
308715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    instance->next_callback_handle = 0;
309715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall
310715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    for (uint32_t i = 0; i < create_info->enabledExtensionCount; i++) {
311715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        if (strcmp(create_info->ppEnabledExtensionNames[i],
312715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall                   VK_EXT_DEBUG_REPORT_EXTENSION_NAME) == 0) {
313b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall            ALOGV("instance extension '%s' requested",
314b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall                  create_info->ppEnabledExtensionNames[i]);
315b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall        } else {
316b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall            ALOGW("unsupported extension '%s' requested",
317b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall                  create_info->ppEnabledExtensionNames[i]);
318715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        }
319715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    }
3201f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall
3211f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall    *out_instance = instance;
3221f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall    return VK_SUCCESS;
3231f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall}
3241f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall
3251f91d390ac013ea2514a67e12ddb083119d636d7Jesse HallVKAPI_ATTR
3261f91d390ac013ea2514a67e12ddb083119d636d7Jesse HallPFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* name) {
3271f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall    return instance ? GetInstanceProcAddr(name) : GetGlobalProcAddr(name);
32804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
32904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
330e1b12783fff0b8e2defcc94c54fac8d737e6b996Jesse HallVKAPI_ATTR
33104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse HallPFN_vkVoidFunction GetDeviceProcAddr(VkDevice, const char* name) {
3321f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall    return GetInstanceProcAddr(name);
33304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
33404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
33573ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall// -----------------------------------------------------------------------------
33673ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall// Instance
33773ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall
33803b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hallvoid DestroyInstance(VkInstance instance,
3393fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                     const VkAllocationCallbacks* /*allocator*/) {
34003b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    instance->allocator.pfnFree(instance->allocator.pUserData, instance);
34104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
34204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
34373ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall// -----------------------------------------------------------------------------
34473ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall// PhysicalDevice
34573ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall
34604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse HallVkResult EnumeratePhysicalDevices(VkInstance instance,
34704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall                                  uint32_t* physical_device_count,
34804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall                                  VkPhysicalDevice* physical_devices) {
34904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    if (physical_devices && *physical_device_count >= 1)
35004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        physical_devices[0] = &instance->physical_device;
35104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    *physical_device_count = 1;
35204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
35304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
35404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
35557f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse HallVkResult EnumerateDeviceLayerProperties(VkPhysicalDevice /*gpu*/,
35657f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                        uint32_t* count,
35757f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                        VkLayerProperties* /*properties*/) {
35857f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    ALOGW("Driver vkEnumerateDeviceLayerProperties shouldn't be called");
35957f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    *count = 0;
36057f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    return VK_SUCCESS;
36157f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall}
36257f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall
36357f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse HallVkResult EnumerateDeviceExtensionProperties(VkPhysicalDevice /*gpu*/,
36457f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                            const char* layer_name,
36557f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                            uint32_t* count,
36657f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                            VkExtensionProperties* properties) {
36757f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    if (layer_name) {
36857f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall        ALOGW(
36957f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall            "Driver vkEnumerateDeviceExtensionProperties shouldn't be called "
37057f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall            "with a layer name ('%s')",
37157f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall            layer_name);
37257f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall        *count = 0;
37357f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall        return VK_SUCCESS;
37457f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    }
37557f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall
37657f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    const VkExtensionProperties kExtensions[] = {
37757f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall        {VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME,
37857f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall         VK_ANDROID_NATIVE_BUFFER_SPEC_VERSION}};
37957f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    const uint32_t kExtensionsCount =
38057f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall        sizeof(kExtensions) / sizeof(kExtensions[0]);
38157f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall
38257f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    if (!properties || *count > kExtensionsCount)
38357f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall        *count = kExtensionsCount;
38457f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    if (properties)
38557f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall        std::copy(kExtensions, kExtensions + *count, properties);
38657f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    return *count < kExtensionsCount ? VK_INCOMPLETE : VK_SUCCESS;
38757f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall}
38857f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall
389606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetPhysicalDeviceProperties(VkPhysicalDevice,
390606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hall                                 VkPhysicalDeviceProperties* properties) {
3912676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall    properties->apiVersion = VK_MAKE_VERSION(1, 0, VK_HEADER_VERSION);
39204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    properties->driverVersion = VK_MAKE_VERSION(0, 0, 1);
39365ab552c18df3e94c5d275294a20dd4d20dda119Jesse Hall    properties->vendorID = 0;
39465ab552c18df3e94c5d275294a20dd4d20dda119Jesse Hall    properties->deviceID = 0;
39504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    properties->deviceType = VK_PHYSICAL_DEVICE_TYPE_OTHER;
39604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    strcpy(properties->deviceName, "Android Vulkan Null Driver");
39704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    memset(properties->pipelineCacheUUID, 0,
39804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall           sizeof(properties->pipelineCacheUUID));
399c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall    properties->limits = VkPhysicalDeviceLimits{
400c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4096,     // maxImageDimension1D
401c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4096,     // maxImageDimension2D
402c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        256,      // maxImageDimension3D
403c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4096,     // maxImageDimensionCube
404c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        256,      // maxImageArrayLayers
405c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        65536,    // maxTexelBufferElements
406c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        16384,    // maxUniformBufferRange
407c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        1 << 27,  // maxStorageBufferRange
408c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        128,      // maxPushConstantsSize
409c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4096,     // maxMemoryAllocationCount
410c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4000,     // maxSamplerAllocationCount
411c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        1,        // bufferImageGranularity
412c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // sparseAddressSpaceSize
413c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,        // maxBoundDescriptorSets
414c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        16,       // maxPerStageDescriptorSamplers
415c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        12,       // maxPerStageDescriptorUniformBuffers
416c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,        // maxPerStageDescriptorStorageBuffers
417c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        16,       // maxPerStageDescriptorSampledImages
418c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,        // maxPerStageDescriptorStorageImages
419c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,        // maxPerStageDescriptorInputAttachments
420c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        128,      // maxPerStageResources
421c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        96,       // maxDescriptorSetSamplers
422c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        72,       // maxDescriptorSetUniformBuffers
423c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        8,        // maxDescriptorSetUniformBuffersDynamic
424c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        24,       // maxDescriptorSetStorageBuffers
425c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,        // maxDescriptorSetStorageBuffersDynamic
426c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        96,       // maxDescriptorSetSampledImages
427c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        24,       // maxDescriptorSetStorageImages
428c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,        // maxDescriptorSetInputAttachments
429c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        16,       // maxVertexInputAttributes
430c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        16,       // maxVertexInputBindings
431c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        2047,     // maxVertexInputAttributeOffset
432c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        2048,     // maxVertexInputBindingStride
433c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        64,       // maxVertexOutputComponents
434c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxTessellationGenerationLevel
435c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxTessellationPatchSize
436c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxTessellationControlPerVertexInputComponents
437c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxTessellationControlPerVertexOutputComponents
438c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxTessellationControlPerPatchOutputComponents
439c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxTessellationControlTotalOutputComponents
440c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxTessellationEvaluationInputComponents
441c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxTessellationEvaluationOutputComponents
442c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxGeometryShaderInvocations
443c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxGeometryInputComponents
444c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxGeometryOutputComponents
445c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxGeometryOutputVertices
446c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxGeometryTotalOutputComponents
447c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        64,       // maxFragmentInputComponents
448c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,        // maxFragmentOutputAttachments
449c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,        // maxFragmentDualSrcAttachments
450c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,        // maxFragmentCombinedOutputResources
451c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        16384,    // maxComputeSharedMemorySize
452c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        {65536, 65536, 65536},  // maxComputeWorkGroupCount[3]
453c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        128,                    // maxComputeWorkGroupInvocations
454c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        {128, 128, 64},         // maxComputeWorkGroupSize[3]
455c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,                      // subPixelPrecisionBits
456c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,                      // subTexelPrecisionBits
457c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,                      // mipmapPrecisionBits
458c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        UINT32_MAX,             // maxDrawIndexedIndexValue
459c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        1,                      // maxDrawIndirectCount
460c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        2,                      // maxSamplerLodBias
461c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        1,                      // maxSamplerAnisotropy
462c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        1,                      // maxViewports
463c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        {4096, 4096},           // maxViewportDimensions[2]
464c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        {-8192.0f, 8191.0f},    // viewportBoundsRange[2]
465c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,                      // viewportSubPixelBits
466c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        64,                     // minMemoryMapAlignment
467c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        256,                    // minTexelBufferOffsetAlignment
468c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        256,                    // minUniformBufferOffsetAlignment
469c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        256,                    // minStorageBufferOffsetAlignment
470c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        -8,                     // minTexelOffset
471c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        7,                      // maxTexelOffset
472c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,                      // minTexelGatherOffset
473c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,                      // maxTexelGatherOffset
474c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0.0f,                   // minInterpolationOffset
475c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0.0f,                   // maxInterpolationOffset
476c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,                      // subPixelInterpolationOffsetBits
477c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4096,                   // maxFramebufferWidth
478c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4096,                   // maxFramebufferHeight
479c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        256,                    // maxFramebufferLayers
480c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_SAMPLE_COUNT_1_BIT |
481c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall            VK_SAMPLE_COUNT_4_BIT,  // framebufferColorSampleCounts
482c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_SAMPLE_COUNT_1_BIT |
483c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall            VK_SAMPLE_COUNT_4_BIT,  // framebufferDepthSampleCounts
484c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_SAMPLE_COUNT_1_BIT |
485c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall            VK_SAMPLE_COUNT_4_BIT,  // framebufferStencilSampleCounts
486c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_SAMPLE_COUNT_1_BIT |
487c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall            VK_SAMPLE_COUNT_4_BIT,  // framebufferNoAttachmentsSampleCounts
488c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        4,                          // maxColorAttachments
489c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_SAMPLE_COUNT_1_BIT |
490c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall            VK_SAMPLE_COUNT_4_BIT,  // sampledImageColorSampleCounts
491c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_SAMPLE_COUNT_1_BIT,      // sampledImageIntegerSampleCounts
492c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_SAMPLE_COUNT_1_BIT |
493c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall            VK_SAMPLE_COUNT_4_BIT,  // sampledImageDepthSampleCounts
494c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_SAMPLE_COUNT_1_BIT |
495c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall            VK_SAMPLE_COUNT_4_BIT,  // sampledImageStencilSampleCounts
496c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_SAMPLE_COUNT_1_BIT,      // storageImageSampleCounts
497c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        1,                          // maxSampleMaskWords
498c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_TRUE,                    // timestampComputeAndGraphics
499c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        1,                          // timestampPeriod
500c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,                          // maxClipDistances
501c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,                          // maxCullDistances
502c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0,                          // maxCombinedClipAndCullDistances
503c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        2,                          // discreteQueuePriorities
504c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        {1.0f, 1.0f},               // pointSizeRange[2]
505c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        {1.0f, 1.0f},               // lineWidthRange[2]
506c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0.0f,                       // pointSizeGranularity
507c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        0.0f,                       // lineWidthGranularity
508c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_TRUE,                    // strictLines
509c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        VK_TRUE,                    // standardSampleLocations
510c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        1,                          // optimalBufferCopyOffsetAlignment
511c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        1,                          // optimalBufferCopyRowPitchAlignment
512c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall        64,                         // nonCoherentAtomSize
513c34849e83c9bdf2a1d768e621ba6304f905fba93Jesse Hall    };
51404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
51504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
516606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetPhysicalDeviceQueueFamilyProperties(
5175ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    VkPhysicalDevice,
5185ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    uint32_t* count,
5195ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    VkQueueFamilyProperties* properties) {
520715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    if (!properties || *count > 1)
521715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        *count = 1;
522715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    if (properties && *count == 1) {
52365ab552c18df3e94c5d275294a20dd4d20dda119Jesse Hall        properties->queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT |
52465ab552c18df3e94c5d275294a20dd4d20dda119Jesse Hall                                 VK_QUEUE_TRANSFER_BIT;
5255ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall        properties->queueCount = 1;
526acfa53409aa45de2c12f10617222e0d593e8f2dfJesse Hall        properties->timestampValidBits = 64;
527715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        properties->minImageTransferGranularity = VkExtent3D{1, 1, 1};
5285ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall    }
5295ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall}
5305ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
531606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetPhysicalDeviceMemoryProperties(
53273ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    VkPhysicalDevice,
53373ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    VkPhysicalDeviceMemoryProperties* properties) {
53473ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    properties->memoryTypeCount = 1;
53573ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    properties->memoryTypes[0].propertyFlags =
536d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall        VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
537d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall        VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
538d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall        VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
539d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall        VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
54073ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    properties->memoryTypes[0].heapIndex = 0;
54173ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    properties->memoryHeapCount = 1;
542bde8ee3037ed1e26d4e603332137c88e6c6d55cbJesse Hall    properties->memoryHeaps[0].size = kMaxDeviceMemory;
543d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall    properties->memoryHeaps[0].flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT;
54404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
54504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
5468e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hallvoid GetPhysicalDeviceFeatures(VkPhysicalDevice /*gpu*/,
5478e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall                               VkPhysicalDeviceFeatures* features) {
5488e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall    *features = VkPhysicalDeviceFeatures{
5498e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_TRUE,   // robustBufferAccess
5508e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // fullDrawIndexUint32
5518e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // imageCubeArray
5528e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // independentBlend
5538e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // geometryShader
5548e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // tessellationShader
5558e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // sampleRateShading
5568e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // dualSrcBlend
5578e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // logicOp
5588e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // multiDrawIndirect
5598e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // drawIndirectFirstInstance
5608e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // depthClamp
5618e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // depthBiasClamp
5628e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // fillModeNonSolid
5638e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // depthBounds
5648e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // wideLines
5658e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // largePoints
5668e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // alphaToOne
5678e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // multiViewport
5688e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // samplerAnisotropy
5698e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // textureCompressionETC2
5708e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // textureCompressionASTC_LDR
5718e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // textureCompressionBC
5728e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // occlusionQueryPrecise
5738e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // pipelineStatisticsQuery
5748e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // vertexPipelineStoresAndAtomics
5758e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // fragmentStoresAndAtomics
5768e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderTessellationAndGeometryPointSize
5778e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderImageGatherExtended
5788e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderStorageImageExtendedFormats
5798e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderStorageImageMultisample
5808e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderStorageImageReadWithoutFormat
5818e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderStorageImageWriteWithoutFormat
5828e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderUniformBufferArrayDynamicIndexing
5838e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderSampledImageArrayDynamicIndexing
5848e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderStorageBufferArrayDynamicIndexing
5858e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderStorageImageArrayDynamicIndexing
5868e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderClipDistance
5878e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderCullDistance
5888e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderFloat64
5898e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderInt64
5908e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderInt16
5918e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderResourceResidency
5928e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // shaderResourceMinLod
5938e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // sparseBinding
5948e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // sparseResidencyBuffer
5958e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // sparseResidencyImage2D
5968e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // sparseResidencyImage3D
5978e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // sparseResidency2Samples
5988e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // sparseResidency4Samples
5998e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // sparseResidency8Samples
6008e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // sparseResidency16Samples
6018e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // sparseResidencyAliased
6028e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // variableMultisampleRate
6038e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall        VK_FALSE,  // inheritedQueries
6048e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall    };
6058e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall}
6068e37cf3509b211e8acd4e60437bdbda1cb9278cbJesse Hall
60773ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall// -----------------------------------------------------------------------------
60873ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall// Device
60973ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall
61004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse HallVkResult CreateDevice(VkPhysicalDevice physical_device,
611b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall                      const VkDeviceCreateInfo* create_info,
6123fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                      const VkAllocationCallbacks* allocator,
61304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall                      VkDevice* out_device) {
61404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    VkInstance_T* instance = GetInstanceFromPhysicalDevice(physical_device);
61503b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    if (!allocator)
61603b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall        allocator = &instance->allocator;
6173fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    VkDevice_T* device = static_cast<VkDevice_T*>(allocator->pfnAllocation(
6183fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        allocator->pUserData, sizeof(VkDevice_T), alignof(VkDevice_T),
6193fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        VK_SYSTEM_ALLOCATION_SCOPE_DEVICE));
62004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    if (!device)
62104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall        return VK_ERROR_OUT_OF_HOST_MEMORY;
62204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
62304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    device->dispatch.magic = HWVULKAN_DISPATCH_MAGIC;
62403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    device->allocator = *allocator;
62504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    device->instance = instance;
62604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    device->queue.dispatch.magic = HWVULKAN_DISPATCH_MAGIC;
627f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall    std::fill(device->next_handle.begin(), device->next_handle.end(),
628f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall              UINT64_C(0));
62904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
630b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall    for (uint32_t i = 0; i < create_info->enabledExtensionCount; i++) {
631b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall        if (strcmp(create_info->ppEnabledExtensionNames[i],
632b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall                   VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME) == 0) {
633b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall            ALOGV("Enabling " VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME);
634b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall        }
635b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall    }
636b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall
63704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    *out_device = device;
63804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
63904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
64004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
6413fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyDevice(VkDevice device,
6423fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                   const VkAllocationCallbacks* /*allocator*/) {
64304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    if (!device)
644cf25c4174dca708032ea83ac7ae2baad9e575b29Jesse Hall        return;
64503b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    device->allocator.pfnFree(device->allocator.pUserData, device);
64604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
64704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
648606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetDeviceQueue(VkDevice device, uint32_t, uint32_t, VkQueue* queue) {
64904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    *queue = &device->queue;
65004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
65104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
65204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall// -----------------------------------------------------------------------------
6533fbc856120217247c72fb5ed88500000f3881c45Jesse Hall// CommandPool
65403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall
6553fbc856120217247c72fb5ed88500000f3881c45Jesse Hallstruct CommandPool {
6563fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    typedef VkCommandPool HandleType;
6573fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    VkAllocationCallbacks allocator;
65803b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall};
6593fbc856120217247c72fb5ed88500000f3881c45Jesse HallDEFINE_OBJECT_HANDLE_CONVERSION(CommandPool)
66003b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall
66103b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse HallVkResult CreateCommandPool(VkDevice device,
6623fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                           const VkCommandPoolCreateInfo* /*create_info*/,
6633fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                           const VkAllocationCallbacks* allocator,
6643fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                           VkCommandPool* cmd_pool) {
66503b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    if (!allocator)
66603b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall        allocator = &device->allocator;
6673fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    CommandPool* pool = static_cast<CommandPool*>(allocator->pfnAllocation(
6683fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        allocator->pUserData, sizeof(CommandPool), alignof(CommandPool),
6693fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        VK_SYSTEM_ALLOCATION_SCOPE_OBJECT));
67003b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    if (!pool)
67103b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall        return VK_ERROR_OUT_OF_HOST_MEMORY;
67203b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    pool->allocator = *allocator;
6733fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    *cmd_pool = GetHandleToCommandPool(pool);
67403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    return VK_SUCCESS;
67503b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall}
67603b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall
67703b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hallvoid DestroyCommandPool(VkDevice /*device*/,
6783fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                        VkCommandPool cmd_pool,
6793fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                        const VkAllocationCallbacks* /*allocator*/) {
6803fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    CommandPool* pool = GetCommandPoolFromHandle(cmd_pool);
68103b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    pool->allocator.pfnFree(pool->allocator.pUserData, pool);
68203b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall}
68303b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall
68403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall// -----------------------------------------------------------------------------
685c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall// CmdBuffer
686c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall
6873fbc856120217247c72fb5ed88500000f3881c45Jesse HallVkResult AllocateCommandBuffers(VkDevice /*device*/,
6883fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                                const VkCommandBufferAllocateInfo* alloc_info,
6893fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                                VkCommandBuffer* cmdbufs) {
690fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall    VkResult result = VK_SUCCESS;
6913fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    CommandPool& pool = *GetCommandPoolFromHandle(alloc_info->commandPool);
6923dd678a6a30e2d94bfd570ec43ffd379e9c5d409Jesse Hall    std::fill(cmdbufs, cmdbufs + alloc_info->commandBufferCount, nullptr);
6933dd678a6a30e2d94bfd570ec43ffd379e9c5d409Jesse Hall    for (uint32_t i = 0; i < alloc_info->commandBufferCount; i++) {
6943fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        cmdbufs[i] =
6953fbc856120217247c72fb5ed88500000f3881c45Jesse Hall            static_cast<VkCommandBuffer_T*>(pool.allocator.pfnAllocation(
6963fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                pool.allocator.pUserData, sizeof(VkCommandBuffer_T),
6973fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                alignof(VkCommandBuffer_T), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT));
698fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall        if (!cmdbufs[i]) {
699fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall            result = VK_ERROR_OUT_OF_HOST_MEMORY;
700fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall            break;
701fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall        }
702fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall        cmdbufs[i]->dispatch.magic = HWVULKAN_DISPATCH_MAGIC;
703fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall    }
704fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall    if (result != VK_SUCCESS) {
7053dd678a6a30e2d94bfd570ec43ffd379e9c5d409Jesse Hall        for (uint32_t i = 0; i < alloc_info->commandBufferCount; i++) {
706fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall            if (!cmdbufs[i])
707fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall                break;
70803b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall            pool.allocator.pfnFree(pool.allocator.pUserData, cmdbufs[i]);
709fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall        }
710fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall    }
711fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall    return result;
712c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall}
713c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall
71403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hallvoid FreeCommandBuffers(VkDevice /*device*/,
7153fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                        VkCommandPool cmd_pool,
716fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall                        uint32_t count,
7173fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                        const VkCommandBuffer* cmdbufs) {
7183fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    CommandPool& pool = *GetCommandPoolFromHandle(cmd_pool);
719fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse Hall    for (uint32_t i = 0; i < count; i++)
72003b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall        pool.allocator.pfnFree(pool.allocator.pUserData, cmdbufs[i]);
721c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall}
722c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall
723c7a6eb56a2c967685f70d30c643f899b0425c0eaJesse Hall// -----------------------------------------------------------------------------
7242077ce0c0d7ca716c408826449314ac799eda650Jesse Hall// DeviceMemory
7252077ce0c0d7ca716c408826449314ac799eda650Jesse Hall
7262077ce0c0d7ca716c408826449314ac799eda650Jesse Hallstruct DeviceMemory {
7272077ce0c0d7ca716c408826449314ac799eda650Jesse Hall    typedef VkDeviceMemory HandleType;
7282077ce0c0d7ca716c408826449314ac799eda650Jesse Hall    VkDeviceSize size;
7292077ce0c0d7ca716c408826449314ac799eda650Jesse Hall    alignas(16) uint8_t data[0];
7302077ce0c0d7ca716c408826449314ac799eda650Jesse Hall};
731a3a7a1d37bdfad56245b75edac49f8aceded321dJesse HallDEFINE_OBJECT_HANDLE_CONVERSION(DeviceMemory)
7322077ce0c0d7ca716c408826449314ac799eda650Jesse Hall
7333fbc856120217247c72fb5ed88500000f3881c45Jesse HallVkResult AllocateMemory(VkDevice device,
7343fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                        const VkMemoryAllocateInfo* alloc_info,
7353fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                        const VkAllocationCallbacks* allocator,
7363fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                        VkDeviceMemory* mem_handle) {
7372077ce0c0d7ca716c408826449314ac799eda650Jesse Hall    if (SIZE_MAX - sizeof(DeviceMemory) <= alloc_info->allocationSize)
7382077ce0c0d7ca716c408826449314ac799eda650Jesse Hall        return VK_ERROR_OUT_OF_HOST_MEMORY;
73903b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    if (!allocator)
74003b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall        allocator = &device->allocator;
7412077ce0c0d7ca716c408826449314ac799eda650Jesse Hall
7422077ce0c0d7ca716c408826449314ac799eda650Jesse Hall    size_t size = sizeof(DeviceMemory) + size_t(alloc_info->allocationSize);
7433fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    DeviceMemory* mem = static_cast<DeviceMemory*>(allocator->pfnAllocation(
7443fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        allocator->pUserData, size, alignof(DeviceMemory),
7453fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        VK_SYSTEM_ALLOCATION_SCOPE_OBJECT));
7462077ce0c0d7ca716c408826449314ac799eda650Jesse Hall    if (!mem)
7472077ce0c0d7ca716c408826449314ac799eda650Jesse Hall        return VK_ERROR_OUT_OF_HOST_MEMORY;
7482077ce0c0d7ca716c408826449314ac799eda650Jesse Hall    mem->size = size;
749a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    *mem_handle = GetHandleToDeviceMemory(mem);
7502077ce0c0d7ca716c408826449314ac799eda650Jesse Hall    return VK_SUCCESS;
7512077ce0c0d7ca716c408826449314ac799eda650Jesse Hall}
7522077ce0c0d7ca716c408826449314ac799eda650Jesse Hall
75303b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hallvoid FreeMemory(VkDevice device,
75403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall                VkDeviceMemory mem_handle,
7553fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                const VkAllocationCallbacks* allocator) {
75603b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    if (!allocator)
75703b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall        allocator = &device->allocator;
758a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    DeviceMemory* mem = GetDeviceMemoryFromHandle(mem_handle);
75903b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    allocator->pfnFree(allocator->pUserData, mem);
7602077ce0c0d7ca716c408826449314ac799eda650Jesse Hall}
7612077ce0c0d7ca716c408826449314ac799eda650Jesse Hall
7622077ce0c0d7ca716c408826449314ac799eda650Jesse HallVkResult MapMemory(VkDevice,
7632077ce0c0d7ca716c408826449314ac799eda650Jesse Hall                   VkDeviceMemory mem_handle,
7642077ce0c0d7ca716c408826449314ac799eda650Jesse Hall                   VkDeviceSize offset,
7652077ce0c0d7ca716c408826449314ac799eda650Jesse Hall                   VkDeviceSize,
7662077ce0c0d7ca716c408826449314ac799eda650Jesse Hall                   VkMemoryMapFlags,
7672077ce0c0d7ca716c408826449314ac799eda650Jesse Hall                   void** out_ptr) {
768a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    DeviceMemory* mem = GetDeviceMemoryFromHandle(mem_handle);
7692077ce0c0d7ca716c408826449314ac799eda650Jesse Hall    *out_ptr = &mem->data[0] + offset;
7702077ce0c0d7ca716c408826449314ac799eda650Jesse Hall    return VK_SUCCESS;
7712077ce0c0d7ca716c408826449314ac799eda650Jesse Hall}
7722077ce0c0d7ca716c408826449314ac799eda650Jesse Hall
7732077ce0c0d7ca716c408826449314ac799eda650Jesse Hall// -----------------------------------------------------------------------------
774f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall// Buffer
775f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall
776f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hallstruct Buffer {
777f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall    typedef VkBuffer HandleType;
778f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall    VkDeviceSize size;
779f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall};
780a3a7a1d37bdfad56245b75edac49f8aceded321dJesse HallDEFINE_OBJECT_HANDLE_CONVERSION(Buffer)
781f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall
782f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse HallVkResult CreateBuffer(VkDevice device,
783f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall                      const VkBufferCreateInfo* create_info,
7843fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                      const VkAllocationCallbacks* allocator,
785f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall                      VkBuffer* buffer_handle) {
786bde8ee3037ed1e26d4e603332137c88e6c6d55cbJesse Hall    ALOGW_IF(create_info->size > kMaxDeviceMemory,
787bde8ee3037ed1e26d4e603332137c88e6c6d55cbJesse Hall             "CreateBuffer: requested size 0x%" PRIx64
788bde8ee3037ed1e26d4e603332137c88e6c6d55cbJesse Hall             " exceeds max device memory size 0x%" PRIx64,
789bde8ee3037ed1e26d4e603332137c88e6c6d55cbJesse Hall             create_info->size, kMaxDeviceMemory);
79003b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    if (!allocator)
79103b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall        allocator = &device->allocator;
7923fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    Buffer* buffer = static_cast<Buffer*>(allocator->pfnAllocation(
7933fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        allocator->pUserData, sizeof(Buffer), alignof(Buffer),
7943fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        VK_SYSTEM_ALLOCATION_SCOPE_OBJECT));
795f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall    if (!buffer)
796f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall        return VK_ERROR_OUT_OF_HOST_MEMORY;
797f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall    buffer->size = create_info->size;
798a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    *buffer_handle = GetHandleToBuffer(buffer);
799f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall    return VK_SUCCESS;
800f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall}
801f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall
802606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetBufferMemoryRequirements(VkDevice,
803606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hall                                 VkBuffer buffer_handle,
804606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hall                                 VkMemoryRequirements* requirements) {
805a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    Buffer* buffer = GetBufferFromHandle(buffer_handle);
806f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall    requirements->size = buffer->size;
807f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall    requirements->alignment = 16;  // allow fast Neon/SSE memcpy
808f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall    requirements->memoryTypeBits = 0x1;
809f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall}
810f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall
81103b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hallvoid DestroyBuffer(VkDevice device,
81203b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall                   VkBuffer buffer_handle,
8133fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                   const VkAllocationCallbacks* allocator) {
81403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    if (!allocator)
81503b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall        allocator = &device->allocator;
816a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    Buffer* buffer = GetBufferFromHandle(buffer_handle);
81703b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    allocator->pfnFree(allocator->pUserData, buffer);
818f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall}
819f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall
820f6578743278da9b55d96a4984f4fcaa9d73eda8dJesse Hall// -----------------------------------------------------------------------------
82185c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall// Image
82285c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall
82385c05b60435ef61e833bcedced9ff0699e829f7cJesse Hallstruct Image {
82485c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    typedef VkImage HandleType;
82585c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    VkDeviceSize size;
82685c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall};
827a3a7a1d37bdfad56245b75edac49f8aceded321dJesse HallDEFINE_OBJECT_HANDLE_CONVERSION(Image)
82885c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall
82985c05b60435ef61e833bcedced9ff0699e829f7cJesse HallVkResult CreateImage(VkDevice device,
83085c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall                     const VkImageCreateInfo* create_info,
8313fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                     const VkAllocationCallbacks* allocator,
83285c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall                     VkImage* image_handle) {
83385c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    if (create_info->imageType != VK_IMAGE_TYPE_2D ||
83485c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall        create_info->format != VK_FORMAT_R8G8B8A8_UNORM ||
83585c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall        create_info->mipLevels != 1) {
83685c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall        ALOGE("CreateImage: not yet implemented: type=%d format=%d mips=%u",
83785c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall              create_info->imageType, create_info->format,
83885c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall              create_info->mipLevels);
839a15a4bf4bafd6114ae8f28c2df2fc622cb3baaceJesse Hall        return VK_ERROR_OUT_OF_HOST_MEMORY;
84085c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    }
84185c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall
84285c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    VkDeviceSize size =
84385c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall        VkDeviceSize(create_info->extent.width * create_info->extent.height) *
844a15a4bf4bafd6114ae8f28c2df2fc622cb3baaceJesse Hall        create_info->arrayLayers * create_info->samples * 4u;
84585c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    ALOGW_IF(size > kMaxDeviceMemory,
84685c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall             "CreateImage: image size 0x%" PRIx64
84785c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall             " exceeds max device memory size 0x%" PRIx64,
84885c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall             size, kMaxDeviceMemory);
84985c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall
85003b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    if (!allocator)
85103b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall        allocator = &device->allocator;
8523fbc856120217247c72fb5ed88500000f3881c45Jesse Hall    Image* image = static_cast<Image*>(allocator->pfnAllocation(
8533fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        allocator->pUserData, sizeof(Image), alignof(Image),
8543fbc856120217247c72fb5ed88500000f3881c45Jesse Hall        VK_SYSTEM_ALLOCATION_SCOPE_OBJECT));
85585c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    if (!image)
85685c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall        return VK_ERROR_OUT_OF_HOST_MEMORY;
85785c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    image->size = size;
858a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    *image_handle = GetHandleToImage(image);
85985c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    return VK_SUCCESS;
86085c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall}
86185c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall
862606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetImageMemoryRequirements(VkDevice,
863606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hall                                VkImage image_handle,
864606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hall                                VkMemoryRequirements* requirements) {
865a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    Image* image = GetImageFromHandle(image_handle);
86685c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    requirements->size = image->size;
86785c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    requirements->alignment = 16;  // allow fast Neon/SSE memcpy
86885c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall    requirements->memoryTypeBits = 0x1;
86985c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall}
87085c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall
87103b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hallvoid DestroyImage(VkDevice device,
87203b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall                  VkImage image_handle,
8733fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                  const VkAllocationCallbacks* allocator) {
87403b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    if (!allocator)
87503b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall        allocator = &device->allocator;
876a3a7a1d37bdfad56245b75edac49f8aceded321dJesse Hall    Image* image = GetImageFromHandle(image_handle);
87703b6fe1b099764c6010c173c1416ea102cdfe5a4Jesse Hall    allocator->pfnFree(allocator->pUserData, image);
87885c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall}
87985c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall
88057f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse HallVkResult GetSwapchainGrallocUsageANDROID(VkDevice,
88157f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                         VkFormat,
88257f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                         VkImageUsageFlags,
88357f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                         int* grallocUsage) {
88457f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    // The null driver never reads or writes the gralloc buffer
88557f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    *grallocUsage = 0;
88657f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    return VK_SUCCESS;
88757f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall}
88857f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall
88957f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse HallVkResult AcquireImageANDROID(VkDevice,
89057f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                             VkImage,
89157f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                             int fence,
89257f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                             VkSemaphore,
89357f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                             VkFence) {
89457f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    close(fence);
89557f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    return VK_SUCCESS;
89657f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall}
89757f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall
89857f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse HallVkResult QueueSignalReleaseImageANDROID(VkQueue,
89957f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                        uint32_t,
90057f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                        const VkSemaphore*,
90157f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                        VkImage,
90257f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall                                        int* fence) {
90357f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    *fence = -1;
90457f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall    return VK_SUCCESS;
90557f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall}
90657f7f8c140c4b665f05c17866ebf201e9f4f46a4Jesse Hall
90785c05b60435ef61e833bcedced9ff0699e829f7cJesse Hall// -----------------------------------------------------------------------------
908f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// No-op types
90904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
910f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateBufferView(VkDevice device,
911f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                          const VkBufferViewCreateInfo*,
9123fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                          const VkAllocationCallbacks* /*allocator*/,
913f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                          VkBufferView* view) {
9143fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *view = AllocHandle<VkBufferView>(device, HandleType::kBufferView);
91504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
91604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
91704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
918f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateDescriptorPool(VkDevice device,
919f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                              const VkDescriptorPoolCreateInfo*,
9203fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                              const VkAllocationCallbacks* /*allocator*/,
921f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                              VkDescriptorPool* pool) {
9223fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *pool = AllocHandle<VkDescriptorPool>(device, HandleType::kDescriptorPool);
92304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
92404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
92504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
9263fbc856120217247c72fb5ed88500000f3881c45Jesse HallVkResult AllocateDescriptorSets(VkDevice device,
9273fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                                const VkDescriptorSetAllocateInfo* alloc_info,
9283fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                                VkDescriptorSet* descriptor_sets) {
9293dd678a6a30e2d94bfd570ec43ffd379e9c5d409Jesse Hall    for (uint32_t i = 0; i < alloc_info->descriptorSetCount; i++)
9303fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine        descriptor_sets[i] =
9313fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine            AllocHandle<VkDescriptorSet>(device, HandleType::kDescriptorSet);
93204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
93304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
93404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
935f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateDescriptorSetLayout(VkDevice device,
936f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                                   const VkDescriptorSetLayoutCreateInfo*,
9373fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                                   const VkAllocationCallbacks* /*allocator*/,
938f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                                   VkDescriptorSetLayout* layout) {
9393fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *layout = AllocHandle<VkDescriptorSetLayout>(
9403fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine        device, HandleType::kDescriptorSetLayout);
94104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
94204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
94304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
944f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateEvent(VkDevice device,
945f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                     const VkEventCreateInfo*,
9463fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                     const VkAllocationCallbacks* /*allocator*/,
947f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                     VkEvent* event) {
9483fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *event = AllocHandle<VkEvent>(device, HandleType::kEvent);
94904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
95004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
95104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
952f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateFence(VkDevice device,
953f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                     const VkFenceCreateInfo*,
9543fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                     const VkAllocationCallbacks* /*allocator*/,
955f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                     VkFence* fence) {
9563fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *fence = AllocHandle<VkFence>(device, HandleType::kFence);
95704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
95804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
95904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
960f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateFramebuffer(VkDevice device,
961f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                           const VkFramebufferCreateInfo*,
9623fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                           const VkAllocationCallbacks* /*allocator*/,
963f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                           VkFramebuffer* framebuffer) {
9643fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *framebuffer = AllocHandle<VkFramebuffer>(device, HandleType::kFramebuffer);
96504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
96604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
96704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
968f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateImageView(VkDevice device,
969f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                         const VkImageViewCreateInfo*,
9703fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                         const VkAllocationCallbacks* /*allocator*/,
971f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                         VkImageView* view) {
9723fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *view = AllocHandle<VkImageView>(device, HandleType::kImageView);
97304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
97404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
97504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
976f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateGraphicsPipelines(VkDevice device,
977f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                                 VkPipelineCache,
978f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                                 uint32_t count,
979f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                                 const VkGraphicsPipelineCreateInfo*,
9803fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                                 const VkAllocationCallbacks* /*allocator*/,
981f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                                 VkPipeline* pipelines) {
982f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall    for (uint32_t i = 0; i < count; i++)
9833fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine        pipelines[i] = AllocHandle<VkPipeline>(device, HandleType::kPipeline);
98404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
98504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
98604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
987f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateComputePipelines(VkDevice device,
988f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                                VkPipelineCache,
989f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                                uint32_t count,
990f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                                const VkComputePipelineCreateInfo*,
9913fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                                const VkAllocationCallbacks* /*allocator*/,
992f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                                VkPipeline* pipelines) {
993f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall    for (uint32_t i = 0; i < count; i++)
9943fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine        pipelines[i] = AllocHandle<VkPipeline>(device, HandleType::kPipeline);
99504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
99604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
99704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
998f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreatePipelineCache(VkDevice device,
999f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                             const VkPipelineCacheCreateInfo*,
10003fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                             const VkAllocationCallbacks* /*allocator*/,
1001f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                             VkPipelineCache* cache) {
10023fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *cache = AllocHandle<VkPipelineCache>(device, HandleType::kPipelineCache);
100304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
100404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
100504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1006f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreatePipelineLayout(VkDevice device,
1007f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                              const VkPipelineLayoutCreateInfo*,
10083fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                              const VkAllocationCallbacks* /*allocator*/,
1009f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                              VkPipelineLayout* layout) {
10103fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *layout =
10113fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine        AllocHandle<VkPipelineLayout>(device, HandleType::kPipelineLayout);
101204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
101304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
101404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1015f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateQueryPool(VkDevice device,
1016f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                         const VkQueryPoolCreateInfo*,
10173fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                         const VkAllocationCallbacks* /*allocator*/,
1018f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                         VkQueryPool* pool) {
10193fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *pool = AllocHandle<VkQueryPool>(device, HandleType::kQueryPool);
102004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
102104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
102204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1023f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateRenderPass(VkDevice device,
1024f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                          const VkRenderPassCreateInfo*,
10253fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                          const VkAllocationCallbacks* /*allocator*/,
1026f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                          VkRenderPass* renderpass) {
10273fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *renderpass = AllocHandle<VkRenderPass>(device, HandleType::kRenderPass);
102804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
102904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
103004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1031f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateSampler(VkDevice device,
1032f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                       const VkSamplerCreateInfo*,
10333fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                       const VkAllocationCallbacks* /*allocator*/,
1034f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                       VkSampler* sampler) {
10353fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *sampler = AllocHandle<VkSampler>(device, HandleType::kSampler);
103604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
103704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
103804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1039f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateSemaphore(VkDevice device,
1040f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                         const VkSemaphoreCreateInfo*,
10413fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                         const VkAllocationCallbacks* /*allocator*/,
1042f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                         VkSemaphore* semaphore) {
10433fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *semaphore = AllocHandle<VkSemaphore>(device, HandleType::kSemaphore);
104404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
104504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
104604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1047f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult CreateShaderModule(VkDevice device,
1048f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                            const VkShaderModuleCreateInfo*,
10493fbc856120217247c72fb5ed88500000f3881c45Jesse Hall                            const VkAllocationCallbacks* /*allocator*/,
1050f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall                            VkShaderModule* module) {
10513fec89ea37127fe292a6766b5320fcbf9574c0edMichael Lentine    *module = AllocHandle<VkShaderModule>(device, HandleType::kShaderModule);
105204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
105304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
105404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1055715b86ac7d0853131b375ff786c87d8d87a762a1Jesse HallVkResult CreateDebugReportCallbackEXT(VkInstance instance,
1056715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall                                      const VkDebugReportCallbackCreateInfoEXT*,
1057715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall                                      const VkAllocationCallbacks*,
1058715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall                                      VkDebugReportCallbackEXT* callback) {
1059715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    *callback = AllocHandle<VkDebugReportCallbackEXT>(
1060715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall        instance, HandleType::kDebugReportCallbackEXT);
1061715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall    return VK_SUCCESS;
1062715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall}
1063715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall
1064f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// -----------------------------------------------------------------------------
1065f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// No-op entrypoints
1066f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall
1067f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall// clang-format off
1068f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall#pragma clang diagnostic push
1069f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall#pragma clang diagnostic ignored "-Wunused-parameter"
1070f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse Hall
1071606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties) {
107273ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
107304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
107404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1075a9e5703e380d9d7f096d177adb792621a1e8d4baJesse HallVkResult GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties) {
107673ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
1077a9e5703e380d9d7f096d177adb792621a1e8d4baJesse Hall    return VK_SUCCESS;
107804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
107904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
10805ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse HallVkResult EnumerateInstanceLayerProperties(uint32_t* pCount, VkLayerProperties* pProperties) {
108173ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
108204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
108304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
108404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1085a366a5186ea941c5653cbdb8df18dc19318912b6Jesse HallVkResult QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmitInfo, VkFence fence) {
108604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
108704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
108804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1089f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult QueueWaitIdle(VkQueue queue) {
109073ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
109104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
109204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
109304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1094f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult DeviceWaitIdle(VkDevice device) {
109573ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
109604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
109704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
109804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1099cf25c4174dca708032ea83ac7ae2baad9e575b29Jesse Hallvoid UnmapMemory(VkDevice device, VkDeviceMemory mem) {
110004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
110104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1102f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult FlushMappedMemoryRanges(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges) {
110373ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
110404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
110504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
110604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1107f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult InvalidateMappedMemoryRanges(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges) {
110873ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
110904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
111004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
111104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1112606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes) {
111373ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
111404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
111504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1116f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memOffset) {
111704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
111804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
111904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1120f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memOffset) {
112104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
112204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
112304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1124606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t* pNumRequirements, VkSparseImageMemoryRequirements* pSparseMemoryRequirements) {
112573ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
112604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
112704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1128091ed9e69400edcc549c9b11635d1a305d6b5a83Jesse Hallvoid GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, uint32_t* pNumProperties, VkSparseImageFormatProperties* pProperties) {
112973ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
113004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
113104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1132a64292517b1876c4bbe5d3e62c577812f40bd922Jesse HallVkResult QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence) {
113373ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
113404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
113504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
113604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
11373fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks* allocator) {
113804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
113904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1140f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult ResetFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences) {
114104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
114204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
114304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1144f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult GetFenceStatus(VkDevice device, VkFence fence) {
114573ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
114604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
114704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
114804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1149f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout) {
115004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
115104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
115204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
11533fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* allocator) {
115404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
115504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
11563fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks* allocator) {
115704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
115804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1159f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult GetEventStatus(VkDevice device, VkEvent event) {
116073ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
116104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
116204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
116304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1164f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult SetEvent(VkDevice device, VkEvent event) {
116573ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
116604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
116704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
116804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1169f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult ResetEvent(VkDevice device, VkEvent event) {
117073ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
117104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
117204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
117304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
11743fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* allocator) {
117504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
117604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1177a9bb62b44be381292b893055cd01cdc89ba55c97Jesse HallVkResult GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags) {
117873ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
117904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
118004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
118104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
11823fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* allocator) {
118304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
118404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1185606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout) {
118673ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
118704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
118804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
11893fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* allocator) {
119004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
119104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
11923fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* allocator) {
119304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
119404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
11953fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* allocator) {
119604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
119704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1198a9bb62b44be381292b893055cd01cdc89ba55c97Jesse HallVkResult GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t* pDataSize, void* pData) {
119973ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
120004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
120104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
120204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1203f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult MergePipelineCaches(VkDevice device, VkPipelineCache destCache, uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches) {
120473ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
120504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
120604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
120704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12083fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* allocator) {
120904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
121004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12113fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* allocator) {
121204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
121304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12143fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* allocator) {
121504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
121604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12173fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* allocator) {
121804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
121904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12203fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* allocator) {
122104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
122204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1223fbf97b0e5e25349b951dce1016b263ec3acbf376Jesse HallVkResult ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) {
122473ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
122504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
122604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
122704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1228cf25c4174dca708032ea83ac7ae2baad9e575b29Jesse Hallvoid UpdateDescriptorSets(VkDevice device, uint32_t writeCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t copyCount, const VkCopyDescriptorSet* pDescriptorCopies) {
122973ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
123004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
123104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1232f8faf0ce17a6435e58c7d2744d9e0e84f3b25bd7Jesse HallVkResult FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet* pDescriptorSets) {
123373ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
123404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
123504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
123604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12373fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* allocator) {
123804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
123904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12403fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* allocator) {
124104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
124204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1243606a54e194a5884c628130ba2eda1b3bfbc157d7Jesse Hallvoid GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity) {
124473ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
124504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
124604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12473fbc856120217247c72fb5ed88500000f3881c45Jesse HallVkResult ResetCommandPool(VkDevice device, VkCommandPool cmdPool, VkCommandPoolResetFlags flags) {
124873ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
124904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
125004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
125104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12523fbc856120217247c72fb5ed88500000f3881c45Jesse HallVkResult BeginCommandBuffer(VkCommandBuffer cmdBuffer, const VkCommandBufferBeginInfo* pBeginInfo) {
125304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
125404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
125504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12563fbc856120217247c72fb5ed88500000f3881c45Jesse HallVkResult EndCommandBuffer(VkCommandBuffer cmdBuffer) {
125704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
125804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
125904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12603fbc856120217247c72fb5ed88500000f3881c45Jesse HallVkResult ResetCommandBuffer(VkCommandBuffer cmdBuffer, VkCommandBufferResetFlags flags) {
126173ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall    ALOGV("TODO: vk%s", __FUNCTION__);
126204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall    return VK_SUCCESS;
126304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
126404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12653fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdBindPipeline(VkCommandBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) {
126604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
126704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1268f9fa9a50d5e87dacce36ef2a56b392fc053cf8ceJesse Hallvoid CmdSetViewport(VkCommandBuffer cmdBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports) {
12695ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall}
12705ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
1271f9fa9a50d5e87dacce36ef2a56b392fc053cf8ceJesse Hallvoid CmdSetScissor(VkCommandBuffer cmdBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors) {
12725ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall}
12735ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
12743fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdSetLineWidth(VkCommandBuffer cmdBuffer, float lineWidth) {
12755ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall}
12765ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
12773fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdSetDepthBias(VkCommandBuffer cmdBuffer, float depthBias, float depthBiasClamp, float slopeScaledDepthBias) {
12785ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall}
12795ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
12803fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdSetBlendConstants(VkCommandBuffer cmdBuffer, const float blendConst[4]) {
12815ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall}
12825ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall
12833fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdSetDepthBounds(VkCommandBuffer cmdBuffer, float minDepthBounds, float maxDepthBounds) {
128404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
128504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12863fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdSetStencilCompareMask(VkCommandBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilCompareMask) {
128704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
128804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12893fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdSetStencilWriteMask(VkCommandBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilWriteMask) {
129004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
129104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12923fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdSetStencilReference(VkCommandBuffer cmdBuffer, VkStencilFaceFlags faceMask, uint32_t stencilReference) {
129304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
129404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12953fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdBindDescriptorSets(VkCommandBuffer cmdBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets) {
129604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
129704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
12983fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdBindIndexBuffer(VkCommandBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) {
129904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
130004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13013fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdBindVertexBuffers(VkCommandBuffer cmdBuffer, uint32_t startBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets) {
130204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
130304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13043fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdDraw(VkCommandBuffer cmdBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
130504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
130604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13073fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdDrawIndexed(VkCommandBuffer cmdBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
130804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
130904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13103fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdDrawIndirect(VkCommandBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
131104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
131204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13133fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdDrawIndexedIndirect(VkCommandBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) {
131404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
131504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13163fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdDispatch(VkCommandBuffer cmdBuffer, uint32_t x, uint32_t y, uint32_t z) {
131704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
131804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13193fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdDispatchIndirect(VkCommandBuffer cmdBuffer, VkBuffer buffer, VkDeviceSize offset) {
132004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
132104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13223fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdCopyBuffer(VkCommandBuffer cmdBuffer, VkBuffer srcBuffer, VkBuffer destBuffer, uint32_t regionCount, const VkBufferCopy* pRegions) {
132304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
132404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13253fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdCopyImage(VkCommandBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageCopy* pRegions) {
132604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
132704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13283fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdBlitImage(VkCommandBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkFilter filter) {
132904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
133004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13313fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdCopyBufferToImage(VkCommandBuffer cmdBuffer, VkBuffer srcBuffer, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions) {
133204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
133304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13343fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdCopyImageToBuffer(VkCommandBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer destBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions) {
133504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
133604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13373fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdUpdateBuffer(VkCommandBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData) {
133804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
133904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13403fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdFillBuffer(VkCommandBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data) {
134104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
134204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13433fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdClearColorImage(VkCommandBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
134404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
134504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13463fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdClearDepthStencilImage(VkCommandBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges) {
134704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
134804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13493fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdClearAttachments(VkCommandBuffer cmdBuffer, uint32_t attachmentCount, const VkClearAttachment* pAttachments, uint32_t rectCount, const VkClearRect* pRects) {
135004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
135104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13523fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdResolveImage(VkCommandBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions) {
135304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
135404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13553fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdSetEvent(VkCommandBuffer cmdBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
135604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
135704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13583fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdResetEvent(VkCommandBuffer cmdBuffer, VkEvent event, VkPipelineStageFlags stageMask) {
135904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
136004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13613dd678a6a30e2d94bfd570ec43ffd379e9c5d409Jesse Hallvoid CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) {
136204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
136304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13643dd678a6a30e2d94bfd570ec43ffd379e9c5d409Jesse Hallvoid CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers) {
136504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
136604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13673fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdBeginQuery(VkCommandBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) {
136804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
136904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13703fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdEndQuery(VkCommandBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot) {
137104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
137204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13733fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdResetQueryPool(VkCommandBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount) {
137404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
137504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13763fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdWriteTimestamp(VkCommandBuffer cmdBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t slot) {
137704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
137804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13793fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdCopyQueryPoolResults(VkCommandBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize destStride, VkQueryResultFlags flags) {
138004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
138104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13823fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdPushConstants(VkCommandBuffer cmdBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t start, uint32_t length, const void* values) {
138304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
138404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
138565ab552c18df3e94c5d275294a20dd4d20dda119Jesse Hallvoid CmdBeginRenderPass(VkCommandBuffer cmdBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents) {
138604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
138704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
138865ab552c18df3e94c5d275294a20dd4d20dda119Jesse Hallvoid CmdNextSubpass(VkCommandBuffer cmdBuffer, VkSubpassContents contents) {
138904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
139004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13913fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdEndRenderPass(VkCommandBuffer cmdBuffer) {
139204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
139304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
13943fbc856120217247c72fb5ed88500000f3881c45Jesse Hallvoid CmdExecuteCommands(VkCommandBuffer cmdBuffer, uint32_t cmdBuffersCount, const VkCommandBuffer* pCmdBuffers) {
139504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}
139604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
1397715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hallvoid DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator) {
1398715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall}
1399715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall
1400715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hallvoid DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage) {
1401715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall}
1402715b86ac7d0853131b375ff786c87d8d87a762a1Jesse Hall
140304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#pragma clang diagnostic pop
140404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall// clang-format on
140504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall
140604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall}  // namespace null_driver
1407