Open1
C-WebGL: GPUへのデータ転送(Vulkan)
ちょっと描画は悩みどころが多すぎるので、一旦データのアップロードから。。
手順
チュートリアル通りにやるとして:
-
vkCreateBuffer
でバッファを用意する。バッファにはメモリ領域は付いてこないので、後でbindしてやる必要がある -
vkAllocateMemory
で、VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
かつVK_MEMORY_PROPERTY_HOST_COHERENT_BIT
なメモリを確保する -
vkMapMemory
で、ホスト(CPU)側のメモリ空間にマップする - memcpyなりなんなりで転送する
-
vkUnmapMemory
で、ホスト側のメモリ空間からアンマップする -
vkBindBufferMemory
でバッファとメモリを関連づける
テクスチャ
テクスチャはさらに複雑で、
のように、
- 通常のバッファと同様に、一旦LinearレイアウトのままGPUにアップロードする
- Imageを確保してメモリをbindしておく
-
vkCmdCopyBufferToImage
を実行してImage内にコピーする
と、一旦中間バッファを経由してやる必要がある。近代的なGPUはテクスチャを単純なビットマップ形式で扱うことは殆どなく、 Z階数曲線 のような空間局所性の良いアドレッシングを採用していることがある。Vulkan(を始め多くのグラフィックスAPIでは)GPU独自のアドレッシングルールは隠蔽されているため、CPU側でアドレス変換を行うのではなく、コピーの形でGPU(またはドライバ)側に変換を行わせている。
...更に悪いことにWebGLには UNPACK_FLIP_Y_WEBGL
が有り、上下の反転も行える必要がある。これは流石にどうしようもないので、ホスト側で上下反転コピーすることになる。