問題タブ [vulkan]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
memory - malloc/free() で実装された Vulkan の VkAllocationCallbacks
私はVulkan Memory Allocation - Memory Hostを読んでおり、単純な malloc/realloc/free 関数を使用して VkAllocationCallbacks を実装できるようです。
しかし、独自の vkAllocationCallback を実装する理由として考えられるのは、次の 2 つだけです。
- Vulkan API によるメモリ使用量のログと追跡。
- 一種のヒープ メモリ管理を実装します。これは、何度も何度も使用および再利用される大量のメモリです。明らかに、これはやり過ぎであり、マネージ メモリと同じ種類の問題 (Java JVM の場合) に悩まされる可能性があります。
ここで何か不足していますか?vkAllocationCallbacks を実装する価値があるのは、どのような種類のアプリケーションですか?
graphics - イメージをそのバインド ポイントにバインドせずに、Vulkan で不変サンプラーを作成できますか?
Vulkan 仕様と Khronos のいくつかの例を読んでいますが、不変サンプラー全般に関する多くの情報を見つけることができません。
私がやろうとしているのは、不変のサンプラー (タイプ VK_DESCRIPTOR_TYPE_SAMPLER であり、...COMBINED_IMAGE_SAMPLER ではない) でいっぱいの記述子セットを用意することです。テクスチャをサンプリングする場合は、シェーダーで次のようにサンプラーにアクセスします。
このシェーダーのアイデアは次のとおりです。
- パイプライン レイアウトでは、セット 0 のバインド ポイント 0 に不変のサンプラーがあります。
- また、コマンド バッファーの一部としてバインドするバインディング ポイント 0 に記述されたイメージを含む記述子セット (3) もあります。
- 不変サンプラーをシェーダーの画像に適用します
- 次に、実際に画像にアクセスします
sampler2D
ただし、クロノスのサンプルで見た方法は次のとおりです。
- パイプライン レイアウトのバインド ポイントで VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER の不変サンプラーを記述します (サンプラーのみを提供します)。
- イメージを作成し、同じバインディング ポイントにバインドします (サンプラーなし)。
sampler2D
シェーダーでとしてイメージにアクセスします。バインドした画像は、そのバインディングで不変のサンプラーとペアになっています
Vulkan の仕様では、どちらが「正しい」かは述べていませんが、次の点に注意してください。
または型記述子を
descriptorType
指定する場合、一連の不変サンプラーを初期化するために使用できます。VK_DESCRIPTOR_TYPE_SAMPLER
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
pImmutableSamplers
シェーダーが期待どおりに機能した場合、この質問をする必要はありません。私が直面している問題は、検証時に Vulkan レイヤーが、私の VkPipeline がバインドされたことのない記述子セット (セット 0、サンプラーが存在するバインディング 0) を使用していると不平を言うことです! そこにガベージ データをバインドしたとしても、別の検証エラーを抑制するためだけに、記述子セットをガベージで (少なくとも 1 回は) 更新する必要があります。ただし、同時に Vulkan の仕様には次のように記載されています。
不変のサンプラーはセット レイアウトに永続的にバインドされます。後でサンプラーを記述子セットの不変サンプラー スロットにバインドすることは許可されていません
そのため、そのバインド ポイントにデータをバインドすることさえ許可されません。
不変サンプラーへの私のアプローチがあいまいであるため、有効であると想定されているかどうかは、今のところ非常に確信が持てません。仕様には、画像なしでサンプラーをバインドできると書かれていますが、そうすると文句が言い、私が見つけたいくつかの例は結合された画像サンプラーをバインドしています。私はこれを間違っているだけですか?
DirectX 12 と Vulkan の両方のシステムを構築しようとしているので、私のアプローチが有効で機能する可能性がある場合は、それが本当に好きです。DX12 の「ルート レイアウト」(パイプライン レイアウト) には、すべての不変サンプラーが関連付けられたイメージなしでバインドされる場所があります。レンダラー間のパリティを維持するためにこの動作をエミュレートしたいのですが、それが Vulkan で本当に可能かどうかは非常に確信が持てず、仕様も非常にあいまいです。
nvidia - vkCmdBlitImage のセグメンテーション違反
にセグメンテーション違反がありvkCmdBlitImage
ます。Valgrind によると、アドレスが 0x48 のサイズ 8 の無効な読み取りです。レイヤーを無効にしても問題は解決しません。
使用されるドライバーは、Nvidia Linux ドライバー バージョン 364.19 です。GPU は GeForce GTX 970 です。
関連コード:
残りのコードはhttps://gitlab.com/pendingchaos/WIP29/tree/00f348f2ef588e5f724fcb1f695e7692128cac4c/srcにあります。
http://pastebin.com/JaHqCy98で vulkaninfo の出力を切り詰めることができます。
vulkan - サーフェス形式は B8G8R8A8_UNORM ですが、vkCmdClearColorImage は float を使用しますか?
スワップチェーンでサポートされているイメージ形式を取得するために使用vkGetPhysicalDeviceSurfaceFormatsKHR
し、(Linux+Nvidia では SDL を使用して)VK_FORMAT_B8G8R8A8_UNORM
最初のオプションとして取得し、先に進み、その形式でスワップチェーンを作成します。
これまでのところ、それはすべて理にかなっています。画面に描画するために使用される画像フォーマットは、通常のチャネルあたり 8 ビットの BGRA です。
私の学習プロセスの一環として、私はこれまで多くのものを設定することに到達しましたが、まだグラフィックス パイプライン1を設定していません。したがって、パイプラインを必要としない、使用できる唯一のコマンドを試しています: vkCmdClearColorImage
2。
VkClearColorValue
クリア カラーを定義するために使用される は、イメージの形式に応じて 、または として色を取得できfloat
ますuint32_t
。int32_t
スワップチェーンに指定された画像形式に基づいて、値を指定する必要があると予想していましたuint32_t
が、それは正しくないようです。画面の色が変わらないのでわかります。私はそれを与えてみましたがfloat
、うまくいきます。
float
私の質問は、画像形式が s の場合、なぜクリアカラーを s で指定する必要があるのVK_FORMAT_B8G8R8A8_UNORM
ですか?
1 実際には持っていますが、最初にパイプラインのない単純なケースを試してみようと思いました. 私は Vulkan を段階的に使用しようとしています (その冗長性を考慮して) 特に、学習しながら Vulkan に関するチュートリアルも書いているためです。
2 実際には、技術的にはレンダー パスは必要ありませんが、ここではパイプラインを使用していないので、パイプラインなしで試してみましょう。
私のレンダリングループは基本的に次のとおりです。
- スワップチェーンから画像を取得
- 次のコマンド バッファを作成します。
VK_IMAGE_LAYOUT_UNDEFINED
からへの移行VK_IMAGE_LAYOUT_GENERAL
(レンダー パスの外側のイメージをクリアしているため)- 画像をクリア
VK_IMAGE_LAYOUT_GENERAL
からへの移行VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
- コマンドバッファをキューに送信します(セマフォを使用したスワップチェーンとの同期を処理します)
- プレゼンテーションのために提出する
glsl - 手動パースペクティブ分割
結果がずれていることに気付いたとき、 gl_Position以外で手動のパースペクティブ除算を行う必要があったため、いくつかの実験を行いました。
デフォルトの変換を使用すると、結果の深度値 ( gl_Position.z ) が正しいことに気付きました。
ただし、パースペクティブ分割を手動で実行しようとすると、同等であるはずの深度値が同じではありません(?):
では、Vulkan ではパースペクティブ分割の動作が異なるのでしょうか? もしそうなら、どのように?
ビューポートの深度範囲は、これに影響を与える場合に備えて [0,1] に設定されます。
c - Wayland、Xlib、XCB、MIR ウィンドウ システムのプリプロセッサ シンボル
Vulkan のドキュメントには、WSI プラットフォームに関する次の記述があります。
Vulkan API は、どのタイプのプラットフォーム オブジェクトも定義しません。プラットフォーム固有の WSI 拡張機能が定義されています。これには、WSI を使用するためのプラットフォーム固有の機能が含まれています。これらの拡張機能の使用は、プリプロセッサ シンボルによって保護されています。
• VK_USE_PLATFORM_ANDROID_KHR - Android
• VK_USE_PLATFORM_MIR_KHR - ミール
• VK_USE_PLATFORM_WAYLAND_KHR - ウェイランド
• VK_USE_PLATFORM_WIN32_KHR - Microsoft Windows
• VK_USE_PLATFORM_XCB_KHR - XCB ライブラリを使用した X Window System
• VK_USE_PLATFORM_XLIB_KHR - Xlib ライブラリを使用した X ウィンドウ システム
プラットフォームまたはウィンドウ システムを選択し、コンパイル前に正しいシンボルを定義する必要があることを理解しています。Android または Windows に対してコンパイルする場合、次のように記述できます。
これまでのところ、OK。Android と Windows には独自のウィンドウ システムがあり、これで十分です。しかし、Linuxにはいくつかのウィンドウシステムがあります-Xlib、XCB、Wayland、およびMIRです。
どのウィンドウ システムがその環境で使用されているかを知るのに役立つ可能性がある C/C++プリプロセッサ シンボルがあるかどうかを知りたいので、混乱することなく各 API を処理できる汎用コードを記述できます。