1 /* 2 * Copyright 2018 Google 3 * SPDX-License-Identifier: MIT 4 */ 5 #pragma once 6 #include "util/detect_os.h" 7 8 #if DETECT_OS_ANDROID || DETECT_OS_FUCHSIA 9 #include <hardware/hwvulkan.h> 10 #elif DETECT_OS_LINUX 11 #include <vulkan/vk_icd.h> 12 #endif 13 #include <inttypes.h> 14 #include <vulkan/vulkan.h> 15 16 #include <functional> 17 18 #include "VulkanHandles.h" 19 20 namespace gfxstream { 21 namespace guest { 22 class IOStream; 23 } // namespace guest 24 } // namespace gfxstream 25 26 namespace gfxstream { 27 namespace vk { 28 class VkEncoder; 29 struct DescriptorPoolAllocationInfo; 30 struct ReifiedDescriptorSet; 31 struct DescriptorSetLayoutInfo; 32 } // namespace vk 33 } // namespace gfxstream 34 35 extern "C" { 36 37 struct goldfish_vk_object_list { 38 void* obj; 39 struct goldfish_vk_object_list* next; 40 }; 41 42 #if DETECT_OS_ANDROID || DETECT_OS_FUCHSIA 43 #define DECLARE_HWVULKAN_DISPATCH hwvulkan_dispatch_t dispatch; 44 #elif DETECT_OS_LINUX 45 #define DECLARE_HWVULKAN_DISPATCH VK_LOADER_DATA loaderData; 46 #else 47 #define DECLARE_HWVULKAN_DISPATCH 48 #endif 49 50 #define GOLDFISH_VK_DEFINE_DISPATCHABLE_HANDLE_STRUCT(type) \ 51 struct goldfish_##type { \ 52 DECLARE_HWVULKAN_DISPATCH \ 53 uint64_t underlying; \ 54 gfxstream::vk::VkEncoder* lastUsedEncoder; \ 55 uint32_t sequenceNumber; \ 56 gfxstream::vk::VkEncoder* privateEncoder; \ 57 gfxstream::guest::IOStream* privateStream; \ 58 uint32_t flags; \ 59 struct goldfish_vk_object_list* poolObjects; \ 60 struct goldfish_vk_object_list* subObjects; \ 61 struct goldfish_vk_object_list* superObjects; \ 62 void* userPtr; \ 63 }; 64 65 #define GOLDFISH_VK_DEFINE_TRIVIAL_NON_DISPATCHABLE_HANDLE_STRUCT(type) \ 66 struct goldfish_##type { \ 67 uint64_t underlying; \ 68 struct goldfish_vk_object_list* poolObjects; \ 69 struct goldfish_vk_object_list* subObjects; \ 70 struct goldfish_vk_object_list* superObjects; \ 71 void* userPtr; \ 72 }; 73 74 #define GOLDFISH_VK_NEW_FROM_HOST_DECL(type) type new_from_host_##type(type); 75 76 #define GOLDFISH_VK_AS_GOLDFISH_DECL(type) struct goldfish_##type* as_goldfish_##type(type); 77 78 #define GOLDFISH_VK_GET_HOST_DECL(type) type get_host_##type(type); 79 80 #define GOLDFISH_VK_DELETE_GOLDFISH_DECL(type) void delete_goldfish_##type(type); 81 82 #define GOLDFISH_VK_IDENTITY_DECL(type) type vk_handle_identity_##type(type); 83 84 #define GOLDFISH_VK_NEW_FROM_HOST_U64_DECL(type) type new_from_host_u64_##type(uint64_t); 85 86 #define GOLDFISH_VK_GET_HOST_U64_DECL(type) uint64_t get_host_u64_##type(type); 87 88 GOLDFISH_VK_LIST_AUTODEFINED_STRUCT_DISPATCHABLE_HANDLE_TYPES( 89 GOLDFISH_VK_DEFINE_DISPATCHABLE_HANDLE_STRUCT) 90 GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_NEW_FROM_HOST_DECL) 91 GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_AS_GOLDFISH_DECL) 92 GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_GET_HOST_DECL) 93 GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_DELETE_GOLDFISH_DECL) 94 GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_IDENTITY_DECL) 95 GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_NEW_FROM_HOST_U64_DECL) 96 GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_GET_HOST_U64_DECL) 97 98 GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_NEW_FROM_HOST_DECL) 99 GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_AS_GOLDFISH_DECL) 100 GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_GET_HOST_DECL) 101 GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_DELETE_GOLDFISH_DECL) 102 GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_IDENTITY_DECL) 103 GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_NEW_FROM_HOST_U64_DECL) 104 GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES(GOLDFISH_VK_GET_HOST_U64_DECL) 105 GOLDFISH_VK_LIST_AUTODEFINED_STRUCT_NON_DISPATCHABLE_HANDLE_TYPES( 106 GOLDFISH_VK_DEFINE_TRIVIAL_NON_DISPATCHABLE_HANDLE_STRUCT) 107 108 struct goldfish_VkDescriptorPool { 109 uint64_t underlying; 110 gfxstream::vk::DescriptorPoolAllocationInfo* allocInfo; 111 }; 112 113 struct goldfish_VkDescriptorSet { 114 uint64_t underlying; 115 gfxstream::vk::ReifiedDescriptorSet* reified; 116 }; 117 118 struct goldfish_VkDescriptorSetLayout { 119 uint64_t underlying; 120 gfxstream::vk::DescriptorSetLayoutInfo* layoutInfo; 121 }; 122 123 struct goldfish_VkCommandBuffer { 124 DECLARE_HWVULKAN_DISPATCH 125 uint64_t underlying; 126 gfxstream::vk::VkEncoder* lastUsedEncoder; 127 uint32_t sequenceNumber; 128 gfxstream::vk::VkEncoder* privateEncoder; 129 gfxstream::guest::IOStream* privateStream; 130 uint32_t flags; 131 struct goldfish_vk_object_list* poolObjects; 132 struct goldfish_vk_object_list* subObjects; 133 struct goldfish_vk_object_list* superObjects; 134 void* userPtr; 135 bool isSecondary; 136 VkDevice device; 137 }; 138 139 } // extern "C" 140 141 namespace gfxstream { 142 namespace vk { 143 144 void appendObject(struct goldfish_vk_object_list** begin, void* val); 145 void eraseObject(struct goldfish_vk_object_list** begin, void* val); 146 void eraseObjects(struct goldfish_vk_object_list** begin); 147 void forAllObjects(struct goldfish_vk_object_list* begin, std::function<void(void*)> func); 148 149 } // namespace vk 150 } // namespace gfxstream 151