xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/vulkan_enc/Resources.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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