Aqoole_Hateenaの技術日記

vulkan+raytraceで色々描いてます

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する。