protonscr

Unreal Engine 5: Valley of the Ancients

vkd3dclosed
HansKristian-Work/vkd3d-proton#678 · opened 2021-05-27 by ZeroFault · updated 2023-11-07 · 4 comments · github
ZZeroFault 2021-05-27 github

The new UE5 tech demo seems to require uint 64 bit image atomics in shaders for its new nanite feature.
Tested on Windows with a RTX 2080 ti

Checking the source code, it uses NVAPI and AGS to detect support for this. I don't think vkd3d supports these extended opcodes.

NVAPI
NvAPI_D3D12_IsNvShaderExtnOpCodeSupported(GetAdapter().GetD3DDevice(), NV_EXTN_OP_UINT64_ATOMIC, &GRHISupportsAtomicUInt64);

AMD AGS
AGS_DX12_EXTENSION_INTRINSIC_ATOMIC_U64 and AGS_DX12_EXTENSION_INTRINSIC_UAV_BIND_SLOT

The demo disables rendering all meshes that uses nanite if you don't support it. However, I am still getting a hang a couple seconds after finishing the loading the demo that I believe might be unrelated the image atomics. I dumped the shaders for the demo and seen some spir-v validation errors

error: line 1225: block <ID> 3337[%3337] exits the loop headed by <ID> 3330[%3330], but not via a structured exit %3337 = OpLabel

error: line 2204: Expected arithmetic operands to have the same dimension as Result Type: ISub operand index 2 %1748 = OpISub %v2uint %uint_31 %1746

Shaders with validation errors:
shaders.zip

I haven't been able to get apitrace to work on this yet

vkd3d.log

SSveSop 2021-12-02 github

@ZeroFault
Been a while since this post, but i did try.. I downloaded some pre-compiled thing of this demo that was "only" 25GB or so, but i think its not really working cos when running it (without UINT64_ATOMIC) everything is just a huge blue ocean, with a few spots of shrubbery here and there, and the bonfire at the "players" feet, so i kinda gave up on that.

I attach a experimental version of nvapi with this feature enabled, so you can test and see what crashes when the game tries to use UINT64_ATOMIC.

0194:fixme:vkd3d_dxbc_compiler_emit_sync: Unhandled sync flags 0x8.
0194:fixme:vkd3d_dxbc_compiler_emit_sync: Unhandled sync flags 0x8.
0194:fixme:vkd3d_dxbc_compiler_emit_sync: Unhandled sync flags 0x8.
0194:fixme:vkd3d_dxbc_compiler_emit_sync: Unhandled sync flags 0x8.
0194:fixme:vkd3d_dxbc_compiler_emit_sync: Unhandled sync flags 0x8.
0194:fixme:vkd3d_dxbc_compiler_emit_sync: Unhandled sync flags 0x8.
0194:fixme:vkd3d_dxbc_compiler_emit_sync: Unhandled sync flags 0x8.
0194:fixme:vkd3d_dxbc_compiler_emit_sync: Unhandled sync flags 0x8.
0194:fixme:vkd3d_dxbc_compiler_emit_sync: Unhandled sync flags 0x8.
0194:fixme:vkd3d_dxbc_compiler_emit_sync: Unhandled sync flags 0x8.
0194:err:vkd3d_memory_allocator_flush_clears_locked: Failed to submit command buffer, vr -4.
0194:warn:d3d12_device_mark_as_removed: Device 000000001f520030 is lost (reason 0x80004005, "Failed to execute pending memory clears.
").
0194:err:vkd3d_memory_allocator_flush_clears_locked: Failed to submit command buffer, vr -4.
0194:warn:d3d12_device_mark_as_removed: Device 000000001f520030 is lost (reason 0x80004005, "Failed to execute pending memory clears.
").

nvapi.tar.gz

ZZeroFault 2022-03-28 github

I made a small example project in UE5 to demonstrate the SM6.6 atomics for Nanite.
link to download

I tested this on native dx12 and it works, but when running with vkd3d-proton it reaches an assert in cfg_structurizer.cpp and crashes on line 3466

You need VKD3D_FEATURE_LEVEL=12_1 and pass the arguments -sm6 -novendordevice to the executable in order to force it to use the SM6 atomics.

BBlisto91 2023-11-06 github

@ZeroFault Hi there. I believe this should work correctly now. If you want to retest.

ZZeroFault 2023-11-07 github

Yes, it does seem to be working now. Thank you

Launch options

Error codes