Vulkanプログラムの作成開始
VulkanプログラムをAndroid Studioで作成することを始めてみた。
サンプルコード
https://github.com/googlesamples/android-vulkan-tutorials
三角形の表示やテクスチャの使用がチュートリアルとして提供されている。
windowの表示
tutorial4まで進めると、何もない青いwindowが表示できるところまで進めることができる。
triangleの表示(Hello World)
グラフィクス関連のhallo worldと言えば三角形の表示だが、tutorial5のtriangleの表示を進めていると、memcpy関数でエラーする。
void* data; CALL_VK(vkMapMemory(device.device_, deviceMemory, 0, allocInfo.allocationSize, 0, &data)); memcpy(data, vertexData, sizeof(vertexData)); vkUnmapMemory(device.device_, deviceMemory); CALL_VK(vkBindBufferMemory(device.device_, buffers.vertexBuf_, deviceMemory, 0));
この部分のコード自体はバッファ領域をmapするときによく見かけるコードである。どうもデバッグした感じ、memcpy実行時にエラーしている模様だが、プログラムが実行不能になりエラーコードの確認もできないので、現状調査中というステータス。
何かわかれば、このページを更新するか、新たに内容をまとめたページを起こす予定。
まとめ
Samsungの次期スマートフォンのSocはRay Tracingをサポートするかも、ということでVulkan on Androidに手を出してみたが、APIのバージョンであるとかJava上でC++のモジュールを動かす仕組みとかの理解が必要で、前途多難の予感。
https://www.lowyat.net/2021/254890/samsung-confirms-ray-tracing-support-with-exynos-2200-soc/
しかしながらスマートフォンの上でRay Tracingをレンダリングできれば色々面白いことができると思うので、基礎から少しずつ仕組みを調査していきたい所存。
2021/12/3追記
memcpyの原因については結局不明で、どうもGPUドライバー関係の可能性あり。
私はLinux + AMD GPUの環境で構築しており、32bit版のドライバパッケージが昔からうまく入ってなかったが、これが悪さをしていた可能性があるので、OSをWindowsの環境に変更した。
変更後、git hubに置かれているコードは実行可能だが、
・画像が期待通りのものが出力されない
・validation layerをinstance extensionで有効にすると、最初のvkQueueSubmit()で失敗する
色々問題があるので、基礎から調べ直す所存。
(2022/02/02追記)
Virtual Emulatorだとうまく描かれないが、physical deviceだと正常に描かれる。
低レイアーのプログラムを動かすときは、仮想マシンは避けた方がよさそう。