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