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