• 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_vkGetPhysicalDeviceProperties(
86         void* context,
87         VkPhysicalDevice physicalDevice,
88         VkPhysicalDeviceProperties* pProperties);
89     void on_vkGetPhysicalDeviceProperties2(
90         void* context,
91         VkPhysicalDevice physicalDevice,
92         VkPhysicalDeviceProperties2* pProperties);
93     void on_vkGetPhysicalDeviceProperties2KHR(
94         void* context,
95         VkPhysicalDevice physicalDevice,
96         VkPhysicalDeviceProperties2* pProperties);
97 
98     void on_vkGetPhysicalDeviceMemoryProperties(
99         void* context,
100         VkPhysicalDevice physicalDevice,
101         VkPhysicalDeviceMemoryProperties* pMemoryProperties);
102     void on_vkGetPhysicalDeviceMemoryProperties2(
103         void* context,
104         VkPhysicalDevice physicalDevice,
105         VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
106     void on_vkGetPhysicalDeviceMemoryProperties2KHR(
107         void* context,
108         VkPhysicalDevice physicalDevice,
109         VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
110     void on_vkGetDeviceQueue(void* context,
111                              VkDevice device,
112                              uint32_t queueFamilyIndex,
113                              uint32_t queueIndex,
114                              VkQueue* pQueue);
115     void on_vkGetDeviceQueue2(void* context,
116                               VkDevice device,
117                               const VkDeviceQueueInfo2* pQueueInfo,
118                               VkQueue* pQueue);
119 
120     VkResult on_vkCreateInstance(
121         void* context,
122         VkResult input_result,
123         const VkInstanceCreateInfo* createInfo,
124         const VkAllocationCallbacks* pAllocator,
125         VkInstance* pInstance);
126     VkResult on_vkCreateDevice(
127         void* context,
128         VkResult input_result,
129         VkPhysicalDevice physicalDevice,
130         const VkDeviceCreateInfo* pCreateInfo,
131         const VkAllocationCallbacks* pAllocator,
132         VkDevice* pDevice);
133     void on_vkDestroyDevice_pre(
134         void* context,
135         VkDevice device,
136         const VkAllocationCallbacks* pAllocator);
137 
138     VkResult on_vkAllocateMemory(
139         void* context,
140         VkResult input_result,
141         VkDevice device,
142         const VkMemoryAllocateInfo* pAllocateInfo,
143         const VkAllocationCallbacks* pAllocator,
144         VkDeviceMemory* pMemory);
145     void on_vkFreeMemory(
146         void* context,
147         VkDevice device,
148         VkDeviceMemory memory,
149         const VkAllocationCallbacks* pAllocator);
150 
151     VkResult on_vkMapMemory(
152         void* context,
153         VkResult input_result,
154         VkDevice device,
155         VkDeviceMemory memory,
156         VkDeviceSize offset,
157         VkDeviceSize size,
158         VkMemoryMapFlags,
159         void** ppData);
160 
161     void on_vkUnmapMemory(
162         void* context,
163         VkDevice device,
164         VkDeviceMemory memory);
165 
166     VkResult on_vkCreateImage(
167         void* context, VkResult input_result,
168         VkDevice device, const VkImageCreateInfo *pCreateInfo,
169         const VkAllocationCallbacks *pAllocator,
170         VkImage *pImage);
171     void on_vkDestroyImage(
172         void* context,
173         VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator);
174 
175     void on_vkGetImageMemoryRequirements(
176         void *context, VkDevice device, VkImage image,
177         VkMemoryRequirements *pMemoryRequirements);
178     void on_vkGetImageMemoryRequirements2(
179         void *context, VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
180         VkMemoryRequirements2 *pMemoryRequirements);
181     void on_vkGetImageMemoryRequirements2KHR(
182         void *context, VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
183         VkMemoryRequirements2 *pMemoryRequirements);
184 
185     VkResult on_vkBindImageMemory(
186         void* context, VkResult input_result,
187         VkDevice device, VkImage image, VkDeviceMemory memory,
188         VkDeviceSize memoryOffset);
189     VkResult on_vkBindImageMemory2(
190         void* context, VkResult input_result,
191         VkDevice device, uint32_t bindingCount, const VkBindImageMemoryInfo* pBindInfos);
192     VkResult on_vkBindImageMemory2KHR(
193         void* context, VkResult input_result,
194         VkDevice device, uint32_t bindingCount, const VkBindImageMemoryInfo* pBindInfos);
195 
196     VkResult on_vkCreateBuffer(
197         void* context, VkResult input_result,
198         VkDevice device, const VkBufferCreateInfo *pCreateInfo,
199         const VkAllocationCallbacks *pAllocator,
200         VkBuffer *pBuffer);
201     void on_vkDestroyBuffer(
202         void* context,
203         VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator);
204 
205     void on_vkGetBufferMemoryRequirements(
206         void* context, VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements);
207     void on_vkGetBufferMemoryRequirements2(
208         void* context, VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo,
209         VkMemoryRequirements2* pMemoryRequirements);
210     void on_vkGetBufferMemoryRequirements2KHR(
211         void* context, VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo,
212         VkMemoryRequirements2* pMemoryRequirements);
213 
214     VkResult on_vkBindBufferMemory(
215         void* context, VkResult input_result,
216         VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset);
217     VkResult on_vkBindBufferMemory2(
218         void* context, VkResult input_result,
219         VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo *pBindInfos);
220     VkResult on_vkBindBufferMemory2KHR(
221         void* context, VkResult input_result,
222         VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo *pBindInfos);
223 
224     VkResult on_vkCreateSemaphore(
225         void* context, VkResult,
226         VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo,
227         const VkAllocationCallbacks* pAllocator,
228         VkSemaphore* pSemaphore);
229     void on_vkDestroySemaphore(
230         void* context,
231         VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator);
232     VkResult on_vkGetSemaphoreFdKHR(
233         void* context, VkResult,
234         VkDevice device,
235         const VkSemaphoreGetFdInfoKHR* pGetFdInfo,
236         int* pFd);
237     VkResult on_vkImportSemaphoreFdKHR(
238         void* context, VkResult,
239         VkDevice device,
240         const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo);
241 
242     VkResult on_vkQueueSubmit(
243         void* context, VkResult input_result,
244         VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
245 
246     VkResult on_vkQueueWaitIdle(
247         void* context, VkResult input_result,
248         VkQueue queue);
249 
250     void unwrap_VkNativeBufferANDROID(
251         const VkImageCreateInfo* pCreateInfo,
252         VkImageCreateInfo* local_pCreateInfo);
253     void unwrap_vkAcquireImageANDROID_nativeFenceFd(int fd, int* fd_out);
254 
255 #ifdef VK_USE_PLATFORM_FUCHSIA
256     VkResult on_vkGetMemoryZirconHandleFUCHSIA(
257         void* context, VkResult input_result,
258         VkDevice device,
259         const VkMemoryGetZirconHandleInfoFUCHSIA* pInfo,
260         uint32_t* pHandle);
261     VkResult on_vkGetMemoryZirconHandlePropertiesFUCHSIA(
262         void* context, VkResult input_result,
263         VkDevice device,
264         VkExternalMemoryHandleTypeFlagBits handleType,
265         uint32_t handle,
266         VkMemoryZirconHandlePropertiesFUCHSIA* pProperties);
267     VkResult on_vkGetSemaphoreZirconHandleFUCHSIA(
268         void* context, VkResult input_result,
269         VkDevice device,
270         const VkSemaphoreGetZirconHandleInfoFUCHSIA* pInfo,
271         uint32_t* pHandle);
272     VkResult on_vkImportSemaphoreZirconHandleFUCHSIA(
273         void* context, VkResult input_result,
274         VkDevice device,
275         const VkImportSemaphoreZirconHandleInfoFUCHSIA* pInfo);
276     VkResult on_vkCreateBufferCollectionFUCHSIA(
277         void* context, VkResult input_result,
278         VkDevice device,
279         const VkBufferCollectionCreateInfoFUCHSIA* pInfo,
280         const VkAllocationCallbacks* pAllocator,
281         VkBufferCollectionFUCHSIA* pCollection);
282     void on_vkDestroyBufferCollectionFUCHSIA(
283         void* context, VkResult input_result,
284         VkDevice device,
285         VkBufferCollectionFUCHSIA collection,
286         const VkAllocationCallbacks* pAllocator);
287     VkResult on_vkSetBufferCollectionConstraintsFUCHSIA(
288         void* context, VkResult input_result,
289         VkDevice device,
290         VkBufferCollectionFUCHSIA collection,
291         const VkImageCreateInfo* pImageInfo);
292     VkResult on_vkSetBufferCollectionBufferConstraintsFUCHSIA(
293         void* context,
294         VkResult input_result,
295         VkDevice device,
296         VkBufferCollectionFUCHSIA collection,
297         const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo);
298     VkResult on_vkSetBufferCollectionImageConstraintsFUCHSIA(
299         void* context,
300         VkResult input_result,
301         VkDevice device,
302         VkBufferCollectionFUCHSIA collection,
303         const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo);
304     VkResult on_vkGetBufferCollectionPropertiesFUCHSIA(
305         void* context, VkResult input_result,
306         VkDevice device,
307         VkBufferCollectionFUCHSIA collection,
308         VkBufferCollectionPropertiesFUCHSIA* pProperties);
309     VkResult on_vkGetBufferCollectionProperties2FUCHSIA(
310         void* context,
311         VkResult input_result,
312         VkDevice device,
313         VkBufferCollectionFUCHSIA collection,
314         VkBufferCollectionProperties2FUCHSIA* pProperties);
315 #endif
316 
317     VkResult on_vkGetAndroidHardwareBufferPropertiesANDROID(
318         void* context, VkResult input_result,
319         VkDevice device,
320         const AHardwareBuffer* buffer,
321         VkAndroidHardwareBufferPropertiesANDROID* pProperties);
322     VkResult on_vkGetMemoryAndroidHardwareBufferANDROID(
323         void* context, VkResult input_result,
324         VkDevice device,
325         const VkMemoryGetAndroidHardwareBufferInfoANDROID *pInfo,
326         struct AHardwareBuffer** pBuffer);
327 
328     VkResult on_vkCreateSamplerYcbcrConversion(
329         void* context, VkResult input_result,
330         VkDevice device,
331         const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
332         const VkAllocationCallbacks* pAllocator,
333         VkSamplerYcbcrConversion* pYcbcrConversion);
334     void on_vkDestroySamplerYcbcrConversion(
335         void* context,
336         VkDevice device,
337         VkSamplerYcbcrConversion ycbcrConversion,
338         const VkAllocationCallbacks* pAllocator);
339     VkResult on_vkCreateSamplerYcbcrConversionKHR(
340         void* context, VkResult input_result,
341         VkDevice device,
342         const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
343         const VkAllocationCallbacks* pAllocator,
344         VkSamplerYcbcrConversion* pYcbcrConversion);
345     void on_vkDestroySamplerYcbcrConversionKHR(
346         void* context,
347         VkDevice device,
348         VkSamplerYcbcrConversion ycbcrConversion,
349         const VkAllocationCallbacks* pAllocator);
350 
351     VkResult on_vkCreateSampler(
352         void* context, VkResult input_result,
353         VkDevice device,
354         const VkSamplerCreateInfo* pCreateInfo,
355         const VkAllocationCallbacks* pAllocator,
356         VkSampler* pSampler);
357 
358     void on_vkGetPhysicalDeviceExternalFenceProperties(
359         void* context,
360         VkPhysicalDevice physicalDevice,
361         const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
362         VkExternalFenceProperties* pExternalFenceProperties);
363 
364     void on_vkGetPhysicalDeviceExternalFencePropertiesKHR(
365         void* context,
366         VkPhysicalDevice physicalDevice,
367         const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
368         VkExternalFenceProperties* pExternalFenceProperties);
369 
370     VkResult on_vkCreateFence(
371         void* context,
372         VkResult input_result,
373         VkDevice device,
374         const VkFenceCreateInfo* pCreateInfo,
375         const VkAllocationCallbacks* pAllocator, VkFence* pFence);
376 
377     void on_vkDestroyFence(
378         void* context,
379         VkDevice device,
380         VkFence fence,
381         const VkAllocationCallbacks* pAllocator);
382 
383     VkResult on_vkResetFences(
384         void* context,
385         VkResult input_result,
386         VkDevice device,
387         uint32_t fenceCount,
388         const VkFence* pFences);
389 
390     VkResult on_vkImportFenceFdKHR(
391         void* context,
392         VkResult input_result,
393         VkDevice device,
394         const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
395 
396     VkResult on_vkGetFenceFdKHR(
397         void* context,
398         VkResult input_result,
399         VkDevice device,
400         const VkFenceGetFdInfoKHR* pGetFdInfo,
401         int* pFd);
402 
403     VkResult on_vkWaitForFences(
404         void* context,
405         VkResult input_result,
406         VkDevice device,
407         uint32_t fenceCount,
408         const VkFence* pFences,
409         VkBool32 waitAll,
410         uint64_t timeout);
411 
412     VkResult on_vkCreateDescriptorPool(
413         void* context,
414         VkResult input_result,
415         VkDevice device,
416         const VkDescriptorPoolCreateInfo* pCreateInfo,
417         const VkAllocationCallbacks* pAllocator,
418         VkDescriptorPool* pDescriptorPool);
419 
420     void on_vkDestroyDescriptorPool(
421         void* context,
422         VkDevice device,
423         VkDescriptorPool descriptorPool,
424         const VkAllocationCallbacks* pAllocator);
425 
426     VkResult on_vkResetDescriptorPool(
427         void* context,
428         VkResult input_result,
429         VkDevice device,
430         VkDescriptorPool descriptorPool,
431         VkDescriptorPoolResetFlags flags);
432 
433     VkResult on_vkAllocateDescriptorSets(
434         void* context,
435         VkResult input_result,
436         VkDevice                                    device,
437         const VkDescriptorSetAllocateInfo*          pAllocateInfo,
438         VkDescriptorSet*                            pDescriptorSets);
439 
440     VkResult on_vkFreeDescriptorSets(
441         void* context,
442         VkResult input_result,
443         VkDevice                                    device,
444         VkDescriptorPool                            descriptorPool,
445         uint32_t                                    descriptorSetCount,
446         const VkDescriptorSet*                      pDescriptorSets);
447 
448     VkResult on_vkCreateDescriptorSetLayout(
449         void* context,
450         VkResult input_result,
451         VkDevice device,
452         const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
453         const VkAllocationCallbacks* pAllocator,
454         VkDescriptorSetLayout* pSetLayout);
455 
456     void on_vkUpdateDescriptorSets(
457         void* context,
458         VkDevice device,
459         uint32_t descriptorWriteCount,
460         const VkWriteDescriptorSet* pDescriptorWrites,
461         uint32_t descriptorCopyCount,
462         const VkCopyDescriptorSet* pDescriptorCopies);
463 
464     VkResult on_vkMapMemoryIntoAddressSpaceGOOGLE_pre(
465         void* context,
466         VkResult input_result,
467         VkDevice device,
468         VkDeviceMemory memory,
469         uint64_t* pAddress);
470     VkResult on_vkMapMemoryIntoAddressSpaceGOOGLE(
471         void* context,
472         VkResult input_result,
473         VkDevice device,
474         VkDeviceMemory memory,
475         uint64_t* pAddress);
476 
477     VkResult on_vkCreateDescriptorUpdateTemplate(
478         void* context, VkResult input_result,
479         VkDevice device,
480         const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
481         const VkAllocationCallbacks* pAllocator,
482         VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);
483 
484     VkResult on_vkCreateDescriptorUpdateTemplateKHR(
485         void* context, VkResult input_result,
486         VkDevice device,
487         const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
488         const VkAllocationCallbacks* pAllocator,
489         VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);
490 
491     void on_vkUpdateDescriptorSetWithTemplate(
492         void* context,
493         VkDevice device,
494         VkDescriptorSet descriptorSet,
495         VkDescriptorUpdateTemplate descriptorUpdateTemplate,
496         const void* pData);
497 
498     VkResult on_vkGetPhysicalDeviceImageFormatProperties2(
499         void* context, VkResult input_result,
500         VkPhysicalDevice physicalDevice,
501         const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
502         VkImageFormatProperties2* pImageFormatProperties);
503 
504     VkResult on_vkGetPhysicalDeviceImageFormatProperties2KHR(
505         void* context, VkResult input_result,
506         VkPhysicalDevice physicalDevice,
507         const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
508         VkImageFormatProperties2* pImageFormatProperties);
509 
510     void on_vkGetPhysicalDeviceExternalSemaphoreProperties(
511         void* context,
512         VkPhysicalDevice physicalDevice,
513         const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
514         VkExternalSemaphoreProperties* pExternalSemaphoreProperties);
515 
516     void on_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
517         void* context,
518         VkPhysicalDevice physicalDevice,
519         const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
520         VkExternalSemaphoreProperties* pExternalSemaphoreProperties);
521 
522     void registerEncoderCleanupCallback(const VkEncoder* encoder, void* handle, CleanupCallback callback);
523     void unregisterEncoderCleanupCallback(const VkEncoder* encoder, void* handle);
524     void onEncoderDeleted(const VkEncoder* encoder);
525 
526     uint32_t syncEncodersForCommandBuffer(VkCommandBuffer commandBuffer, VkEncoder* current);
527     uint32_t syncEncodersForQueue(VkQueue queue, VkEncoder* current);
528 
529     VkResult on_vkBeginCommandBuffer(
530         void* context, VkResult input_result,
531         VkCommandBuffer commandBuffer,
532         const VkCommandBufferBeginInfo* pBeginInfo);
533     VkResult on_vkEndCommandBuffer(
534         void* context, VkResult input_result,
535         VkCommandBuffer commandBuffer);
536     VkResult on_vkResetCommandBuffer(
537         void* context, VkResult input_result,
538         VkCommandBuffer commandBuffer,
539         VkCommandBufferResetFlags flags);
540 
541     VkResult on_vkCreateImageView(
542         void* context, VkResult input_result,
543         VkDevice device,
544         const VkImageViewCreateInfo* pCreateInfo,
545         const VkAllocationCallbacks* pAllocator,
546         VkImageView* pView);
547 
548     void on_vkCmdExecuteCommands(
549         void* context,
550         VkCommandBuffer commandBuffer,
551         uint32_t commandBufferCount,
552         const VkCommandBuffer* pCommandBuffers);
553 
554     void on_vkCmdBindDescriptorSets(
555         void* context,
556         VkCommandBuffer commandBuffer,
557         VkPipelineBindPoint pipelineBindPoint,
558         VkPipelineLayout layout,
559         uint32_t firstSet,
560         uint32_t descriptorSetCount,
561         const VkDescriptorSet* pDescriptorSets,
562         uint32_t dynamicOffsetCount,
563         const uint32_t* pDynamicOffsets);
564 
565     void on_vkDestroyDescriptorSetLayout(
566         void* context,
567         VkDevice device,
568         VkDescriptorSetLayout descriptorSetLayout,
569         const VkAllocationCallbacks* pAllocator);
570 
571     VkResult on_vkAllocateCommandBuffers(
572         void* context,
573         VkResult input_result,
574         VkDevice device,
575         const VkCommandBufferAllocateInfo* pAllocateInfo,
576         VkCommandBuffer* pCommandBuffers);
577 
578     bool isMemoryTypeHostVisible(VkDevice device, uint32_t typeIndex) const;
579     uint8_t* getMappedPointer(VkDeviceMemory memory);
580     VkDeviceSize getMappedSize(VkDeviceMemory memory);
581     VkDeviceSize getNonCoherentExtendedSize(VkDevice device, VkDeviceSize basicSize) const;
582     bool isValidMemoryRange(const VkMappedMemoryRange& range) const;
583     void setupFeatures(const EmulatorFeatureInfo* features);
584     void setThreadingCallbacks(const ThreadingCallbacks& callbacks);
585     bool hostSupportsVulkan() const;
586     bool usingDirectMapping() const;
587     uint32_t getStreamFeatures() const;
588     uint32_t getApiVersionFromInstance(VkInstance instance) const;
589     uint32_t getApiVersionFromDevice(VkDevice device) const;
590     bool hasInstanceExtension(VkInstance instance, const std::string& name) const;
591     bool hasDeviceExtension(VkDevice instance, const std::string& name) const;
592     void addToCommandPool(VkCommandPool commandPool,
593                           uint32_t commandBufferCount,
594                           VkCommandBuffer* pCommandBuffers);
595     void resetCommandPoolStagingInfo(VkCommandPool commandPool);
596 
597 
598     static VkEncoder* getCommandBufferEncoder(VkCommandBuffer commandBuffer);
599     static VkEncoder* getQueueEncoder(VkQueue queue);
600     static VkEncoder* getThreadLocalEncoder();
601 
602     static void setSeqnoPtr(uint32_t* seqnoptr);
603     static __attribute__((always_inline)) uint32_t nextSeqno();
604     static __attribute__((always_inline)) uint32_t getSeqno();
605 
606     // Transforms
607     void deviceMemoryTransform_tohost(
608         VkDeviceMemory* memory, uint32_t memoryCount,
609         VkDeviceSize* offset, uint32_t offsetCount,
610         VkDeviceSize* size, uint32_t sizeCount,
611         uint32_t* typeIndex, uint32_t typeIndexCount,
612         uint32_t* typeBits, uint32_t typeBitsCount);
613     void deviceMemoryTransform_fromhost(
614         VkDeviceMemory* memory, uint32_t memoryCount,
615         VkDeviceSize* offset, uint32_t offsetCount,
616         VkDeviceSize* size, uint32_t sizeCount,
617         uint32_t* typeIndex, uint32_t typeIndexCount,
618         uint32_t* typeBits, uint32_t typeBitsCount);
619 
620     void transformImpl_VkExternalMemoryProperties_fromhost(
621         VkExternalMemoryProperties* pProperties,
622         uint32_t);
623     void transformImpl_VkExternalMemoryProperties_tohost(
624         VkExternalMemoryProperties* pProperties,
625         uint32_t);
626 
627 #define DEFINE_TRANSFORMED_TYPE_PROTOTYPE(type)          \
628     void transformImpl_##type##_tohost(type*, uint32_t); \
629     void transformImpl_##type##_fromhost(type*, uint32_t);
630 
631     LIST_TRIVIAL_TRANSFORMED_TYPES(DEFINE_TRANSFORMED_TYPE_PROTOTYPE)
632 
633 private:
634     class Impl;
635     std::unique_ptr<Impl> mImpl;
636 };
637 
638 } // namespace goldfish_vk
639