• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2018 The Android Open Source Project
2 // Copyright (C) 2018 Google Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 #pragma once
16 
17 #include "android/base/Tracing.h"
18 
19 #include <vulkan/vulkan.h>
20 
21 #include "VulkanHandleMapping.h"
22 #include "VulkanHandles.h"
23 #include <functional>
24 #include <memory>
25 
26 #include "goldfish_vk_transform_guest.h"
27 
28 struct EmulatorFeatureInfo;
29 
30 class HostConnection;
31 
32 namespace goldfish_vk {
33 
34 class VkEncoder;
35 
36 class ResourceTracker {
37 public:
38     ResourceTracker();
39     virtual ~ResourceTracker();
40     static ResourceTracker* get();
41 
42     VulkanHandleMapping* createMapping();
43     VulkanHandleMapping* unwrapMapping();
44     VulkanHandleMapping* destroyMapping();
45     VulkanHandleMapping* defaultMapping();
46 
47     using HostConnectionGetFunc = HostConnection* (*)();
48     using VkEncoderGetFunc = VkEncoder* (*)(HostConnection*);
49     using CleanupCallback = std::function<void()>;
50 
51     struct ThreadingCallbacks {
52         HostConnectionGetFunc hostConnectionGetFunc = 0;
53         VkEncoderGetFunc vkEncoderGetFunc = 0;
54     };
55 
56     static uint32_t streamFeatureBits;
57     static ThreadingCallbacks threadingCallbacks;
58 
59 #define HANDLE_REGISTER_DECL(type) \
60     void register_##type(type); \
61     void unregister_##type(type); \
62 
63     GOLDFISH_VK_LIST_HANDLE_TYPES(HANDLE_REGISTER_DECL)
64 
65     VkResult on_vkEnumerateInstanceExtensionProperties(
66         void* context,
67         VkResult input_result,
68         const char* pLayerName,
69         uint32_t* pPropertyCount,
70         VkExtensionProperties* pProperties);
71 
72     VkResult on_vkEnumerateDeviceExtensionProperties(
73         void* context,
74         VkResult input_result,
75         VkPhysicalDevice physicalDevice,
76         const char* pLayerName,
77         uint32_t* pPropertyCount,
78         VkExtensionProperties* pProperties);
79 
80     VkResult on_vkEnumeratePhysicalDevices(
81         void* context, VkResult input_result,
82         VkInstance instance, uint32_t* pPhysicalDeviceCount,
83         VkPhysicalDevice* pPhysicalDevices);
84 
85     void on_vkGetPhysicalDeviceFeatures2(
86         void* context,
87         VkPhysicalDevice physicalDevice,
88         VkPhysicalDeviceFeatures2* pFeatures);
89     void on_vkGetPhysicalDeviceFeatures2KHR(
90         void* context,
91         VkPhysicalDevice physicalDevice,
92         VkPhysicalDeviceFeatures2* pFeatures);
93     void on_vkGetPhysicalDeviceProperties(
94         void* context,
95         VkPhysicalDevice physicalDevice,
96         VkPhysicalDeviceProperties* pProperties);
97     void on_vkGetPhysicalDeviceProperties2(
98         void* context,
99         VkPhysicalDevice physicalDevice,
100         VkPhysicalDeviceProperties2* pProperties);
101     void on_vkGetPhysicalDeviceProperties2KHR(
102         void* context,
103         VkPhysicalDevice physicalDevice,
104         VkPhysicalDeviceProperties2* pProperties);
105 
106     void on_vkGetPhysicalDeviceMemoryProperties(
107         void* context,
108         VkPhysicalDevice physicalDevice,
109         VkPhysicalDeviceMemoryProperties* pMemoryProperties);
110     void on_vkGetPhysicalDeviceMemoryProperties2(
111         void* context,
112         VkPhysicalDevice physicalDevice,
113         VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
114     void on_vkGetPhysicalDeviceMemoryProperties2KHR(
115         void* context,
116         VkPhysicalDevice physicalDevice,
117         VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
118     void on_vkGetDeviceQueue(void* context,
119                              VkDevice device,
120                              uint32_t queueFamilyIndex,
121                              uint32_t queueIndex,
122                              VkQueue* pQueue);
123     void on_vkGetDeviceQueue2(void* context,
124                               VkDevice device,
125                               const VkDeviceQueueInfo2* pQueueInfo,
126                               VkQueue* pQueue);
127 
128     VkResult on_vkCreateInstance(
129         void* context,
130         VkResult input_result,
131         const VkInstanceCreateInfo* createInfo,
132         const VkAllocationCallbacks* pAllocator,
133         VkInstance* pInstance);
134     VkResult on_vkCreateDevice(
135         void* context,
136         VkResult input_result,
137         VkPhysicalDevice physicalDevice,
138         const VkDeviceCreateInfo* pCreateInfo,
139         const VkAllocationCallbacks* pAllocator,
140         VkDevice* pDevice);
141     void on_vkDestroyDevice_pre(
142         void* context,
143         VkDevice device,
144         const VkAllocationCallbacks* pAllocator);
145 
146     VkResult on_vkAllocateMemory(
147         void* context,
148         VkResult input_result,
149         VkDevice device,
150         const VkMemoryAllocateInfo* pAllocateInfo,
151         const VkAllocationCallbacks* pAllocator,
152         VkDeviceMemory* pMemory);
153     void on_vkFreeMemory(
154         void* context,
155         VkDevice device,
156         VkDeviceMemory memory,
157         const VkAllocationCallbacks* pAllocator);
158 
159     VkResult on_vkMapMemory(
160         void* context,
161         VkResult input_result,
162         VkDevice device,
163         VkDeviceMemory memory,
164         VkDeviceSize offset,
165         VkDeviceSize size,
166         VkMemoryMapFlags,
167         void** ppData);
168 
169     void on_vkUnmapMemory(
170         void* context,
171         VkDevice device,
172         VkDeviceMemory memory);
173 
174     VkResult on_vkCreateImage(
175         void* context, VkResult input_result,
176         VkDevice device, const VkImageCreateInfo *pCreateInfo,
177         const VkAllocationCallbacks *pAllocator,
178         VkImage *pImage);
179     void on_vkDestroyImage(
180         void* context,
181         VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator);
182 
183     void on_vkGetImageMemoryRequirements(
184         void *context, VkDevice device, VkImage image,
185         VkMemoryRequirements *pMemoryRequirements);
186     void on_vkGetImageMemoryRequirements2(
187         void *context, VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
188         VkMemoryRequirements2 *pMemoryRequirements);
189     void on_vkGetImageMemoryRequirements2KHR(
190         void *context, VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
191         VkMemoryRequirements2 *pMemoryRequirements);
192 
193     VkResult on_vkBindImageMemory(
194         void* context, VkResult input_result,
195         VkDevice device, VkImage image, VkDeviceMemory memory,
196         VkDeviceSize memoryOffset);
197     VkResult on_vkBindImageMemory2(
198         void* context, VkResult input_result,
199         VkDevice device, uint32_t bindingCount, const VkBindImageMemoryInfo* pBindInfos);
200     VkResult on_vkBindImageMemory2KHR(
201         void* context, VkResult input_result,
202         VkDevice device, uint32_t bindingCount, const VkBindImageMemoryInfo* pBindInfos);
203 
204     VkResult on_vkCreateBuffer(
205         void* context, VkResult input_result,
206         VkDevice device, const VkBufferCreateInfo *pCreateInfo,
207         const VkAllocationCallbacks *pAllocator,
208         VkBuffer *pBuffer);
209     void on_vkDestroyBuffer(
210         void* context,
211         VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator);
212 
213     void on_vkGetBufferMemoryRequirements(
214         void* context, VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements);
215     void on_vkGetBufferMemoryRequirements2(
216         void* context, VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo,
217         VkMemoryRequirements2* pMemoryRequirements);
218     void on_vkGetBufferMemoryRequirements2KHR(
219         void* context, VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo,
220         VkMemoryRequirements2* pMemoryRequirements);
221 
222     VkResult on_vkBindBufferMemory(
223         void* context, VkResult input_result,
224         VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset);
225     VkResult on_vkBindBufferMemory2(
226         void* context, VkResult input_result,
227         VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo *pBindInfos);
228     VkResult on_vkBindBufferMemory2KHR(
229         void* context, VkResult input_result,
230         VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo *pBindInfos);
231 
232     VkResult on_vkCreateSemaphore(
233         void* context, VkResult,
234         VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo,
235         const VkAllocationCallbacks* pAllocator,
236         VkSemaphore* pSemaphore);
237     void on_vkDestroySemaphore(
238         void* context,
239         VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator);
240     VkResult on_vkGetSemaphoreFdKHR(
241         void* context, VkResult,
242         VkDevice device,
243         const VkSemaphoreGetFdInfoKHR* pGetFdInfo,
244         int* pFd);
245     VkResult on_vkImportSemaphoreFdKHR(
246         void* context, VkResult,
247         VkDevice device,
248         const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo);
249 
250     VkResult on_vkQueueSubmit(
251         void* context, VkResult input_result,
252         VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
253 
254     VkResult on_vkQueueWaitIdle(
255         void* context, VkResult input_result,
256         VkQueue queue);
257 
258     void unwrap_VkNativeBufferANDROID(
259         const VkImageCreateInfo* pCreateInfo,
260         VkImageCreateInfo* local_pCreateInfo);
261     void unwrap_vkAcquireImageANDROID_nativeFenceFd(int fd, int* fd_out);
262 
263 #ifdef VK_USE_PLATFORM_FUCHSIA
264     VkResult on_vkGetMemoryZirconHandleFUCHSIA(
265         void* context, VkResult input_result,
266         VkDevice device,
267         const VkMemoryGetZirconHandleInfoFUCHSIA* pInfo,
268         uint32_t* pHandle);
269     VkResult on_vkGetMemoryZirconHandlePropertiesFUCHSIA(
270         void* context, VkResult input_result,
271         VkDevice device,
272         VkExternalMemoryHandleTypeFlagBits handleType,
273         uint32_t handle,
274         VkMemoryZirconHandlePropertiesFUCHSIA* pProperties);
275     VkResult on_vkGetSemaphoreZirconHandleFUCHSIA(
276         void* context, VkResult input_result,
277         VkDevice device,
278         const VkSemaphoreGetZirconHandleInfoFUCHSIA* pInfo,
279         uint32_t* pHandle);
280     VkResult on_vkImportSemaphoreZirconHandleFUCHSIA(
281         void* context, VkResult input_result,
282         VkDevice device,
283         const VkImportSemaphoreZirconHandleInfoFUCHSIA* pInfo);
284     VkResult on_vkCreateBufferCollectionFUCHSIA(
285         void* context,
286         VkResult input_result,
287         VkDevice device,
288         const VkBufferCollectionCreateInfoFUCHSIA* pInfo,
289         const VkAllocationCallbacks* pAllocator,
290         VkBufferCollectionFUCHSIA* pCollection);
291     void on_vkDestroyBufferCollectionFUCHSIA(
292         void* context,
293         VkResult input_result,
294         VkDevice device,
295         VkBufferCollectionFUCHSIA collection,
296         const VkAllocationCallbacks* pAllocator);
297     VkResult on_vkSetBufferCollectionBufferConstraintsFUCHSIA(
298         void* context,
299         VkResult input_result,
300         VkDevice device,
301         VkBufferCollectionFUCHSIA collection,
302         const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo);
303     VkResult on_vkSetBufferCollectionImageConstraintsFUCHSIA(
304         void* context,
305         VkResult input_result,
306         VkDevice device,
307         VkBufferCollectionFUCHSIA collection,
308         const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo);
309     VkResult on_vkGetBufferCollectionPropertiesFUCHSIA(
310         void* context,
311         VkResult input_result,
312         VkDevice device,
313         VkBufferCollectionFUCHSIA collection,
314         VkBufferCollectionPropertiesFUCHSIA* pProperties);
315     VkResult on_vkCreateBufferCollectionFUCHSIAX(
316         void* context,
317         VkResult input_result,
318         VkDevice device,
319         const VkBufferCollectionCreateInfoFUCHSIAX* pInfo,
320         const VkAllocationCallbacks* pAllocator,
321         VkBufferCollectionFUCHSIAX* pCollection);
322     void on_vkDestroyBufferCollectionFUCHSIAX(
323         void* context,
324         VkResult input_result,
325         VkDevice device,
326         VkBufferCollectionFUCHSIAX collection,
327         const VkAllocationCallbacks* pAllocator);
328     VkResult on_vkSetBufferCollectionConstraintsFUCHSIAX(
329         void* context,
330         VkResult input_result,
331         VkDevice device,
332         VkBufferCollectionFUCHSIAX collection,
333         const VkImageCreateInfo* pImageInfo);
334     VkResult on_vkSetBufferCollectionBufferConstraintsFUCHSIAX(
335         void* context,
336         VkResult input_result,
337         VkDevice device,
338         VkBufferCollectionFUCHSIAX collection,
339         const VkBufferConstraintsInfoFUCHSIAX* pBufferConstraintsInfo);
340     VkResult on_vkSetBufferCollectionImageConstraintsFUCHSIAX(
341         void* context,
342         VkResult input_result,
343         VkDevice device,
344         VkBufferCollectionFUCHSIAX collection,
345         const VkImageConstraintsInfoFUCHSIAX* pImageConstraintsInfo);
346     VkResult on_vkGetBufferCollectionPropertiesFUCHSIAX(
347         void* context,
348         VkResult input_result,
349         VkDevice device,
350         VkBufferCollectionFUCHSIAX collection,
351         VkBufferCollectionPropertiesFUCHSIAX* pProperties);
352     VkResult on_vkGetBufferCollectionProperties2FUCHSIAX(
353         void* context,
354         VkResult input_result,
355         VkDevice device,
356         VkBufferCollectionFUCHSIAX collection,
357         VkBufferCollectionProperties2FUCHSIAX* pProperties);
358 #endif
359 
360     VkResult on_vkGetAndroidHardwareBufferPropertiesANDROID(
361         void* context, VkResult input_result,
362         VkDevice device,
363         const AHardwareBuffer* buffer,
364         VkAndroidHardwareBufferPropertiesANDROID* pProperties);
365     VkResult on_vkGetMemoryAndroidHardwareBufferANDROID(
366         void* context, VkResult input_result,
367         VkDevice device,
368         const VkMemoryGetAndroidHardwareBufferInfoANDROID *pInfo,
369         struct AHardwareBuffer** pBuffer);
370 
371     VkResult on_vkCreateSamplerYcbcrConversion(
372         void* context, VkResult input_result,
373         VkDevice device,
374         const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
375         const VkAllocationCallbacks* pAllocator,
376         VkSamplerYcbcrConversion* pYcbcrConversion);
377     void on_vkDestroySamplerYcbcrConversion(
378         void* context,
379         VkDevice device,
380         VkSamplerYcbcrConversion ycbcrConversion,
381         const VkAllocationCallbacks* pAllocator);
382     VkResult on_vkCreateSamplerYcbcrConversionKHR(
383         void* context, VkResult input_result,
384         VkDevice device,
385         const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
386         const VkAllocationCallbacks* pAllocator,
387         VkSamplerYcbcrConversion* pYcbcrConversion);
388     void on_vkDestroySamplerYcbcrConversionKHR(
389         void* context,
390         VkDevice device,
391         VkSamplerYcbcrConversion ycbcrConversion,
392         const VkAllocationCallbacks* pAllocator);
393 
394     VkResult on_vkCreateSampler(
395         void* context, VkResult input_result,
396         VkDevice device,
397         const VkSamplerCreateInfo* pCreateInfo,
398         const VkAllocationCallbacks* pAllocator,
399         VkSampler* pSampler);
400 
401     void on_vkGetPhysicalDeviceExternalFenceProperties(
402         void* context,
403         VkPhysicalDevice physicalDevice,
404         const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
405         VkExternalFenceProperties* pExternalFenceProperties);
406 
407     void on_vkGetPhysicalDeviceExternalFencePropertiesKHR(
408         void* context,
409         VkPhysicalDevice physicalDevice,
410         const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
411         VkExternalFenceProperties* pExternalFenceProperties);
412 
413     VkResult on_vkCreateFence(
414         void* context,
415         VkResult input_result,
416         VkDevice device,
417         const VkFenceCreateInfo* pCreateInfo,
418         const VkAllocationCallbacks* pAllocator, VkFence* pFence);
419 
420     void on_vkDestroyFence(
421         void* context,
422         VkDevice device,
423         VkFence fence,
424         const VkAllocationCallbacks* pAllocator);
425 
426     VkResult on_vkResetFences(
427         void* context,
428         VkResult input_result,
429         VkDevice device,
430         uint32_t fenceCount,
431         const VkFence* pFences);
432 
433     VkResult on_vkImportFenceFdKHR(
434         void* context,
435         VkResult input_result,
436         VkDevice device,
437         const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
438 
439     VkResult on_vkGetFenceFdKHR(
440         void* context,
441         VkResult input_result,
442         VkDevice device,
443         const VkFenceGetFdInfoKHR* pGetFdInfo,
444         int* pFd);
445 
446     VkResult on_vkWaitForFences(
447         void* context,
448         VkResult input_result,
449         VkDevice device,
450         uint32_t fenceCount,
451         const VkFence* pFences,
452         VkBool32 waitAll,
453         uint64_t timeout);
454 
455     VkResult on_vkCreateDescriptorPool(
456         void* context,
457         VkResult input_result,
458         VkDevice device,
459         const VkDescriptorPoolCreateInfo* pCreateInfo,
460         const VkAllocationCallbacks* pAllocator,
461         VkDescriptorPool* pDescriptorPool);
462 
463     void on_vkDestroyDescriptorPool(
464         void* context,
465         VkDevice device,
466         VkDescriptorPool descriptorPool,
467         const VkAllocationCallbacks* pAllocator);
468 
469     VkResult on_vkResetDescriptorPool(
470         void* context,
471         VkResult input_result,
472         VkDevice device,
473         VkDescriptorPool descriptorPool,
474         VkDescriptorPoolResetFlags flags);
475 
476     VkResult on_vkAllocateDescriptorSets(
477         void* context,
478         VkResult input_result,
479         VkDevice                                    device,
480         const VkDescriptorSetAllocateInfo*          pAllocateInfo,
481         VkDescriptorSet*                            pDescriptorSets);
482 
483     VkResult on_vkFreeDescriptorSets(
484         void* context,
485         VkResult input_result,
486         VkDevice                                    device,
487         VkDescriptorPool                            descriptorPool,
488         uint32_t                                    descriptorSetCount,
489         const VkDescriptorSet*                      pDescriptorSets);
490 
491     VkResult on_vkCreateDescriptorSetLayout(
492         void* context,
493         VkResult input_result,
494         VkDevice device,
495         const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
496         const VkAllocationCallbacks* pAllocator,
497         VkDescriptorSetLayout* pSetLayout);
498 
499     void on_vkUpdateDescriptorSets(
500         void* context,
501         VkDevice device,
502         uint32_t descriptorWriteCount,
503         const VkWriteDescriptorSet* pDescriptorWrites,
504         uint32_t descriptorCopyCount,
505         const VkCopyDescriptorSet* pDescriptorCopies);
506 
507     VkResult on_vkMapMemoryIntoAddressSpaceGOOGLE_pre(
508         void* context,
509         VkResult input_result,
510         VkDevice device,
511         VkDeviceMemory memory,
512         uint64_t* pAddress);
513     VkResult on_vkMapMemoryIntoAddressSpaceGOOGLE(
514         void* context,
515         VkResult input_result,
516         VkDevice device,
517         VkDeviceMemory memory,
518         uint64_t* pAddress);
519 
520     VkResult on_vkCreateDescriptorUpdateTemplate(
521         void* context, VkResult input_result,
522         VkDevice device,
523         const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
524         const VkAllocationCallbacks* pAllocator,
525         VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);
526 
527     VkResult on_vkCreateDescriptorUpdateTemplateKHR(
528         void* context, VkResult input_result,
529         VkDevice device,
530         const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
531         const VkAllocationCallbacks* pAllocator,
532         VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);
533 
534     void on_vkUpdateDescriptorSetWithTemplate(
535         void* context,
536         VkDevice device,
537         VkDescriptorSet descriptorSet,
538         VkDescriptorUpdateTemplate descriptorUpdateTemplate,
539         const void* pData);
540 
541     VkResult on_vkGetPhysicalDeviceImageFormatProperties2(
542         void* context, VkResult input_result,
543         VkPhysicalDevice physicalDevice,
544         const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
545         VkImageFormatProperties2* pImageFormatProperties);
546 
547     VkResult on_vkGetPhysicalDeviceImageFormatProperties2KHR(
548         void* context, VkResult input_result,
549         VkPhysicalDevice physicalDevice,
550         const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
551         VkImageFormatProperties2* pImageFormatProperties);
552 
553     void on_vkGetPhysicalDeviceExternalSemaphoreProperties(
554         void* context,
555         VkPhysicalDevice physicalDevice,
556         const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
557         VkExternalSemaphoreProperties* pExternalSemaphoreProperties);
558 
559     void on_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
560         void* context,
561         VkPhysicalDevice physicalDevice,
562         const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
563         VkExternalSemaphoreProperties* pExternalSemaphoreProperties);
564 
565     void registerEncoderCleanupCallback(const VkEncoder* encoder, void* handle, CleanupCallback callback);
566     void unregisterEncoderCleanupCallback(const VkEncoder* encoder, void* handle);
567     void onEncoderDeleted(const VkEncoder* encoder);
568 
569     uint32_t syncEncodersForCommandBuffer(VkCommandBuffer commandBuffer, VkEncoder* current);
570     uint32_t syncEncodersForQueue(VkQueue queue, VkEncoder* current);
571 
572     VkResult on_vkBeginCommandBuffer(
573         void* context, VkResult input_result,
574         VkCommandBuffer commandBuffer,
575         const VkCommandBufferBeginInfo* pBeginInfo);
576     VkResult on_vkEndCommandBuffer(
577         void* context, VkResult input_result,
578         VkCommandBuffer commandBuffer);
579     VkResult on_vkResetCommandBuffer(
580         void* context, VkResult input_result,
581         VkCommandBuffer commandBuffer,
582         VkCommandBufferResetFlags flags);
583 
584     VkResult on_vkCreateImageView(
585         void* context, VkResult input_result,
586         VkDevice device,
587         const VkImageViewCreateInfo* pCreateInfo,
588         const VkAllocationCallbacks* pAllocator,
589         VkImageView* pView);
590 
591     void on_vkCmdExecuteCommands(
592         void* context,
593         VkCommandBuffer commandBuffer,
594         uint32_t commandBufferCount,
595         const VkCommandBuffer* pCommandBuffers);
596 
597     void on_vkCmdBindDescriptorSets(
598         void* context,
599         VkCommandBuffer commandBuffer,
600         VkPipelineBindPoint pipelineBindPoint,
601         VkPipelineLayout layout,
602         uint32_t firstSet,
603         uint32_t descriptorSetCount,
604         const VkDescriptorSet* pDescriptorSets,
605         uint32_t dynamicOffsetCount,
606         const uint32_t* pDynamicOffsets);
607 
608     void on_vkDestroyDescriptorSetLayout(
609         void* context,
610         VkDevice device,
611         VkDescriptorSetLayout descriptorSetLayout,
612         const VkAllocationCallbacks* pAllocator);
613 
614     VkResult on_vkAllocateCommandBuffers(
615         void* context,
616         VkResult input_result,
617         VkDevice device,
618         const VkCommandBufferAllocateInfo* pAllocateInfo,
619         VkCommandBuffer* pCommandBuffers);
620 
621     VkResult on_vkQueueSignalReleaseImageANDROID(
622         void* context,
623         VkResult input_result,
624         VkQueue queue,
625         uint32_t waitSemaphoreCount,
626         const VkSemaphore* pWaitSemaphores,
627         VkImage image,
628         int* pNativeFenceFd);
629 
630     VkResult on_vkCreateGraphicsPipelines(
631         void* context,
632         VkResult input_result,
633         VkDevice device,
634         VkPipelineCache pipelineCache,
635         uint32_t createInfoCount,
636         const VkGraphicsPipelineCreateInfo* pCreateInfos,
637         const VkAllocationCallbacks* pAllocator,
638         VkPipeline* pPipelines);
639 
640     uint8_t* getMappedPointer(VkDeviceMemory memory);
641     VkDeviceSize getMappedSize(VkDeviceMemory memory);
642     VkDeviceSize getNonCoherentExtendedSize(VkDevice device, VkDeviceSize basicSize) const;
643     bool isValidMemoryRange(const VkMappedMemoryRange& range) const;
644     void setupFeatures(const EmulatorFeatureInfo* features);
645     void setThreadingCallbacks(const ThreadingCallbacks& callbacks);
646     bool hostSupportsVulkan() const;
647     bool usingDirectMapping() const;
648     uint32_t getStreamFeatures() const;
649     uint32_t getApiVersionFromInstance(VkInstance instance) const;
650     uint32_t getApiVersionFromDevice(VkDevice device) const;
651     bool hasInstanceExtension(VkInstance instance, const std::string& name) const;
652     bool hasDeviceExtension(VkDevice instance, const std::string& name) const;
653     VkDevice getDevice(VkCommandBuffer commandBuffer) const;
654     void addToCommandPool(VkCommandPool commandPool,
655                           uint32_t commandBufferCount,
656                           VkCommandBuffer* pCommandBuffers);
657     void resetCommandPoolStagingInfo(VkCommandPool commandPool);
658 
659 #ifdef __GNUC__
660     #define ALWAYS_INLINE
661 #elif
662     #define ALWAYS_INLINE __attribute__((always_inline))
663 #endif
664 
665     static VkEncoder* getCommandBufferEncoder(VkCommandBuffer commandBuffer);
666     static VkEncoder* getQueueEncoder(VkQueue queue);
667     static VkEncoder* getThreadLocalEncoder();
668 
669     static void setSeqnoPtr(uint32_t* seqnoptr);
670     static ALWAYS_INLINE uint32_t nextSeqno();
671     static ALWAYS_INLINE uint32_t getSeqno();
672 
673     // Transforms
674     void deviceMemoryTransform_tohost(
675         VkDeviceMemory* memory, uint32_t memoryCount,
676         VkDeviceSize* offset, uint32_t offsetCount,
677         VkDeviceSize* size, uint32_t sizeCount,
678         uint32_t* typeIndex, uint32_t typeIndexCount,
679         uint32_t* typeBits, uint32_t typeBitsCount);
680     void deviceMemoryTransform_fromhost(
681         VkDeviceMemory* memory, uint32_t memoryCount,
682         VkDeviceSize* offset, uint32_t offsetCount,
683         VkDeviceSize* size, uint32_t sizeCount,
684         uint32_t* typeIndex, uint32_t typeIndexCount,
685         uint32_t* typeBits, uint32_t typeBitsCount);
686 
687     void transformImpl_VkExternalMemoryProperties_fromhost(
688         VkExternalMemoryProperties* pProperties,
689         uint32_t);
690     void transformImpl_VkExternalMemoryProperties_tohost(
691         VkExternalMemoryProperties* pProperties,
692         uint32_t);
693     void transformImpl_VkImageCreateInfo_fromhost(const VkImageCreateInfo*, uint32_t);
694     void transformImpl_VkImageCreateInfo_tohost(const VkImageCreateInfo*, uint32_t);
695 
696 #define DEFINE_TRANSFORMED_TYPE_PROTOTYPE(type)          \
697     void transformImpl_##type##_tohost(type*, uint32_t); \
698     void transformImpl_##type##_fromhost(type*, uint32_t);
699 
700     LIST_TRIVIAL_TRANSFORMED_TYPES(DEFINE_TRANSFORMED_TYPE_PROTOTYPE)
701 
702 private:
703     class Impl;
704     std::unique_ptr<Impl> mImpl;
705 };
706 
707 } // namespace goldfish_vk
708