| // Copyright (c) 2021 Google Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| [[fuchsia-external-memory]] |
| === Fuchsia External Memory |
| |
| On Fuchsia, when allocating memory that may: be imported from another |
| device, process or Vulkan instance, add a |
| slink:VkImportMemoryZirconHandleInfoFUCHSIA structure to the pname:pNext |
| chain of the slink:VkMemoryAllocateInfo structure. |
| |
| External memory on Fuchsia is imported and exported using VMO handles of |
| type code:zx_handle_t. |
| VMO handles to external memory are canonically obtained from Fuchsia's |
| Sysmem service or from syscalls such as sname:zx_vmo_create(). |
| VMO handles for import can also be obtained by exporting them from another |
| Vulkan instance as described in <<exporting-fuchsia-device-memory,exporting |
| fuchsia device memory>>. |
| |
| Importing VMO handles to the Vulkan instance transfers ownership of the |
| handle to the instance from the application. |
| The application must: not perform any operations on the handle after |
| successful import. |
| |
| Applications can: import the same underlying memory into multiple instances |
| of Vulkan, into the same instance from which it was exported, and multiple |
| times into a given Vulkan instance. |
| In all cases, each import operation must: create a distinct |
| sname:VkDeviceMemory object. |
| |
| |
| [[importing-fuchsia-external-memory]] |
| ==== Importing Fuchsia External Memory |
| |
| [open,refpage='VkImportMemoryZirconHandleInfoFUCHSIA',desc='Structure specifying import parameters for Zircon handle to external memory',type='structs'] |
| -- |
| The sname:VkImportMemoryZirconHandleInfoFUCHSIA structure is defined as: |
| |
| include::{generated}/api/structs/VkImportMemoryZirconHandleInfoFUCHSIA.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value |
| specifying the type of pname:handle. |
| * pname:handle is a code:zx_handle_t (Zircon) handle to the external |
| memory. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkImportMemoryZirconHandleInfoFUCHSIA-handleType-04771]] |
| pname:handleType must: be |
| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA |
| * [[VUID-VkImportMemoryZirconHandleInfoFUCHSIA-handle-04772]] |
| pname:handle must be a valid VMO handle |
| **** |
| |
| include::{generated}/validity/structs/VkImportMemoryZirconHandleInfoFUCHSIA.txt[] |
| -- |
| |
| [open,refpage='vkGetMemoryZirconHandlePropertiesFUCHSIA',desc='Get a Zircon handle properties for an external memory object',type='protos'] |
| -- |
| To obtain the memoryTypeIndex for the slink:VkMemoryAllocateInfo structure, |
| call fname:vkGetMemoryZirconHandlePropertiesFUCHSIA: |
| |
| include::{generated}/api/protos/vkGetMemoryZirconHandlePropertiesFUCHSIA.txt[] |
| |
| * pname:device is the slink:VkDevice. |
| * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value |
| specifying the type of pname:zirconHandle |
| * pname:zirconHandle is a code:zx_handle_t (Zircon) handle to the external |
| resource. |
| * pname:pMemoryZirconHandleProperties is a pointer to a |
| slink:VkMemoryZirconHandlePropertiesFUCHSIA structure in which the |
| result will be stored. |
| |
| .Valid Usage |
| **** |
| * [[VUID-vkGetMemoryZirconHandlePropertiesFUCHSIA-handleType-04773]] |
| pname:handleType must: be |
| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA |
| * [[VUID-vkGetMemoryZirconHandlePropertiesFUCHSIA-zirconHandle-04774]] |
| pname:zirconHandle must reference a valid VMO |
| **** |
| |
| include::{generated}/validity/protos/vkGetMemoryZirconHandlePropertiesFUCHSIA.txt[] |
| -- |
| |
| [open,refpage='VkMemoryZirconHandlePropertiesFUCHSIA',desc='Structure specifying Zircon handle compatible external memory',type='structs'] |
| -- |
| The sname:VkMemoryZirconHandlePropertiesFUCHSIA structure is defined as: |
| |
| include::{generated}/api/structs/VkMemoryZirconHandlePropertiesFUCHSIA.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:memoryTypeBits a bitmask containing one bit set for every memory |
| type which the specified handle can be imported as. |
| |
| include::{generated}/validity/structs/VkMemoryZirconHandlePropertiesFUCHSIA.txt[] |
| -- |
| |
| With pname:pMemoryZirconHandleProperties now successfully populated by |
| flink:vkGetMemoryZirconHandlePropertiesFUCHSIA, assign the |
| slink:VkMemoryAllocateInfo memoryTypeIndex field to a memory type which has |
| a bit set in the slink:VkMemoryZirconHandlePropertiesFUCHSIA memoryTypeBits |
| field. |
| |
| |
| [[exporting-fuchsia-device-memory]] |
| ==== Exporting Fuchsia Device Memory |
| Similar to importing, exporting a VMO handle from Vulkan transfers ownership |
| of the handle from the Vulkan instance to the application. |
| The application is responsible for closing the handle with |
| code:zx_handle_close() when it is no longer in use. |
| |
| |
| [open,refpage='vkGetMemoryZirconHandleFUCHSIA',desc='Get a Zircon handle for an external memory object',type='protos'] |
| -- |
| To export device memory as a Zircon handle that can be used by another |
| instance, device, or process, the handle to the slink:VkDeviceMemory must be |
| retrieved using flink:vkGetMemoryZirconHandleFUCHSIA: |
| |
| include::{generated}/api/protos/vkGetMemoryZirconHandleFUCHSIA.txt[] |
| |
| * pname:device is the slink:VkDevice. |
| * pname:pGetZirconHandleInfo is a pointer to a |
| slink:VkMemoryGetZirconHandleInfoFUCHSIA structure. |
| * pname:pZirconHandle is a pointer to a code:zx_handle_t which holds the |
| resulting Zircon handle. |
| |
| include::{generated}/validity/protos/vkGetMemoryZirconHandleFUCHSIA.txt[] |
| -- |
| |
| [open,refpage='VkMemoryGetZirconHandleInfoFUCHSIA',desc='Structure specifying export parameters for Zircon handle to device memory',type='structs'] |
| -- |
| sname:VkMemoryGetZirconHandleInfoFUCHSIA is defined as: |
| |
| include::{generated}/api/structs/VkMemoryGetZirconHandleInfoFUCHSIA.txt[] |
| |
| * pname:sType is the type of this structure. |
| * pname:pNext is `NULL` or a pointer to a structure extending this |
| structure. |
| * pname:memory the slink:VkDeviceMemory being exported. |
| * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value |
| specifying the type of the handle pointed to by |
| flink:vkGetMemoryZirconHandleFUCHSIA::pname:pZirconHandle. |
| |
| .Valid Usage |
| **** |
| * [[VUID-VkMemoryGetZirconHandleInfoFUCHSIA-handleType-04775]] |
| pname:handleType must: be |
| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA |
| * [[VUID-VkMemoryGetZirconHandleInfoFUCHSIA-handleType-04776]] |
| pname:handleType must: have been included in the sname:handleTypes field |
| of the sname:VkExportMemoryAllocateInfo structure when the external |
| memory was allocated |
| **** |
| |
| include::{generated}/validity/structs/VkMemoryGetZirconHandleInfoFUCHSIA.txt[] |
| -- |
| |
| With the result pname:pZirconHandle now obtained, the memory properties for |
| the handle can be retrieved using |
| flink:vkGetMemoryZirconHandlePropertiesFUCHSIA as documented above |
| substituting the dereferenced, retrieved pname:pZirconHandle in for the |
| pname:zirconHandle argument. |