Nvidiaドライバー(577+)によるDOFのモザイクアーティファクトの修正について

5.3ベースのプロジェクトでNvidiaドライバーによるDOFのモザイクアーティファクトの問題が出ています。

テストでNvidiaドライバーを577に戻したところ改善しましたが、ユーザーにドライバーのロールバックを強制するのは現実的ではない為、根本的な修正をしたいと考えています。

この不具合の修正方法についてEpic Developer Assistantで質問したところ以下の回答がありました。

5.3のプロジェクトで手動パッチを行う手順

UE 5.3のソースビルド版(GitHub版)を使用していることを前提として、NVIDIAドライバ起因のPSO(Pipeline State Object)メモリ問題に対する手動パッチの手順を解説します。

この修正の目的は、不要になったPSOを確実に解放し、GPUメモリ(シェーダーヒープ)の枯渇による描画不良やクラッシュをeliminate(排除)することです。

1. 修正対象のファイル

以下のファイルを編集します。

エンジン/ソース/実行時間/D3D12RHI/プライベート/D3D12StateCache.cpp

Engine/Source/Runtime/D3D12RHI/Private/D3D12PSO.cpp(および関連するヘッダ)

2. 手動パッチのロジック(概要)

修正の核心は、D3D12RHIがPSOをキャッシュに保持し続けるのではなく、参照カウンタがゼロになった際に明示的に削除をトリガーするようにすることです。

手順 A: D3D12PSO.cpp の修正

PSOのデストラクタまたは解放処理において、DirectX 12のネイティブオブジェクト(ID3D12PipelineState)を即座に Release() するか、Deferred Deletion(遅延削除)キューに正しく追加されるようコードを確認・修正します。

手順 B: D3D12StateCache.cpp の修正

ステートキャッシュが古いPSOを保持しすぎないよう、キャッシュのクリア条件を厳格にします。

ClearState() 関数や、パイプライン切り替え時のロジックにおいて、現在のPSOが以前のものと異なる場合、古いPSOの参照を保持し続けないように SafeRelease または Reset() を確実に呼び出します。

3. パッチ適用後のビルド手順

コードを修正しただけでは反映されません。 RHIモジュールの再コンパイルが必要です。

Visual Studioを開く: プロジェクトの .sln ファイルを開きます。

D3D12RHIプロジェクトを探す: Engine/Runtime/D3D12RHI を右クリックします。

リビルド: 「リビルド(Rebuild)」を選択するか、エンジン全体をコンパイルします。

コマンドラインで行う場合(UnrealBuildToolを使用):

UnrealBuildTool.exe MyProject Win64 Development -Project=“C:/Path/To/MyProject.uproject”

シェーダーの再コンパイル: 次回起動時、または DerivedDataCache をクリアして、修正されたRHI環境下でシェーダーが正しく生成されるようにします。

しかし、回答にある「Engine/Source/Runtime/D3D12RHI/Private/D3D12PSO.cpp」がプロジェクトに存在しませんでした。

こちらの回答内容は正確なものでしょうか?

また、別途正確な解決方法があればご提示いただけますでしょうか?

以上、よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

こちらご指摘の通りD3D12PSO.cppといったファイルは存在せず、

またPSO/ヒープ枯渇の症状としましてはGPUクラッシュが発生する見込みとなり

Epic Developer Assistantから案内されている修正に関しては誤りかと思われます。

調査したところUE5.7にて類似の報告に対する修正(CL48292110)が行われており、

今回のUE5.3にも適用できそうでしたので、上記CLの取り込みをお試しいただけますと幸いです。

お手数おかけしますが、よろしくお願いいたします。

[Attachment Removed]

返答が遅くなり申し訳ありません。

ご提案いただいた修正を試したところ問題が解消されました。

ありがとうございました。

具体的にはEngine/Shaders/Private/DiaphragmDOF/DOFReduce.usfの

#define CONFIG_WAVE_BROADCAST_REDUCTION (PLATFORM_SUPPORTS_WAVE_BROADCAST)の箇所を

#if 1
#define CONFIG_WAVE_BROADCAST_REDUCTION 0
#else
#define CONFIG_WAVE_BROADCAST_REDUCTION (PLATFORM_SUPPORTS_WAVE_BROADCAST)
#endif

というように修正したところ問題が解消されました。

以上、よろしくお願いいたします。

[Attachment Removed]

ご確認及びマージ結果を共有頂きありがとうございます。

無事改善が見られたとのことで何よりです。

本件はクローズさせて頂きますが、また何かございましたらお気軽にご相談ください。

よろしくお願いいたします。

[Attachment Removed]