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