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