Bufferにデータをコピーする方法について
サンプルコード
git hubで公開されている、android + vulkanでのbufferにデータをコピーするの部分について考察してみた。
android-vulkan-tutorials/tutorial05_triangle at master · googlesamples/android-vulkan-tutorials · GitHub
サンプルとしては以上を上げているが、Androidに関わらずvulkan API共通の処理でもある。
vkMapMemory()
仕様書には以下のように書かれている。vkMapMemory(3)
vkMapMemory - Map a memory object into application address space
To retrieve a host virtual address pointer to a region of a mappable memory object, call (vkMapMemory)
After a successful call to vkMapMemory the memory object memory is considered to be currently host mapped.
// Provided by VK_VERSION_1_0 VkResult vkMapMemory( VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData);
パラメーターの説明は以下の通り。
Parameters
- memory is the VkDeviceMemory object to be mapped.
- ppData is a pointer to a void * variable in which is returned a host-accessible pointer to the beginning of the mapped range. This pointer minus offset must be aligned to at least VkPhysicalDeviceLimits::minMemoryMapAlignment.
関数実行後、VkDeviceMemoryのmemoryがapplication addressのppDataにマップされる。これにより、device側のメモリにデータを書き込むことができる。
memcpy()
これはC++の標準関数で、Vulkan APIの関数ではない。Microsoft Docsには以下のように記載されている。
memcpy、wmemcpy | Microsoft Docs
バッファー間でバイトをコピーします。これらの関数のより安全なバージョンを使用できます。 wmemcpy_sしてください。
void *memcpy( void *dest, const void *src, size_t count ); wchar_t *wmemcpy( wchar_t *dest, const wchar_t *src, size_t count );
パラメーター
- dest
- コピー先のバッファー。
- src
- コピー元のバッファー。
- count
- コピーする文字数。
よくあるmemcpy()の例で言えば
vkMapMemory(device.device_, deviceMemory, 0, allocInfo.allocationSize, 0, &data) memcpy(data, vertexData, sizeof(vertexData));
があるが、これはvertexDataというapp側の配列をdataにコピーしている。vkMapMemory()によってdataは事前にdevice memoryにmapされているので、結果device側のメモリにvertex dataを書き込むことができている。
vkUnmapMemory
Vulkan® 1.2.203 - A Specification (with all registered Vulkan extensions)
To unmap a memory object once host access to it is no longer needed by the application, call: (vkUnmapMemory)
data<->device memory間のマップが不要になれば、vkUnmapMemoryでunmapする。