protonscr

control flow debugger for vkd3d

vkd3dclosed
HansKristian-Work/vkd3d-proton#2942 · opened 2026-04-17 by arlack9 · updated 2026-04-17 · 1 comments · github
Aarlack9 2026-04-17 github

I have made a control flow debugger for vkd3d works wih titles like hitman 3 ;

it will generate 3 files

the dxil_direct_extraction files will show all instructions , calls , branhces , jumps for each shaders ,from raw DXIL.

hope it will useful ,

the dlls are attached in it v0.0.6b release direct copy paste to test with aaa titiles with dxgi.dll.

link github.com/arlack9/vkd3d-proton
branch : feature/build-clangcl

I am using custom clang-cl build without mingw and it uses widl from wsl , easy to build and test in windows system.

also can visit my dxil-spirv

github.com/arlack9/dxil-spirv

branch:feature/cfg_logger

Hope this helps someway or other , also hope suggestions for fixes , features, bugs will come

thank you

sample log file :dxil_direct_extraction.txt file

=== Shader: RaytracedReflections_MS ===

[Block 0]
[0:0] Load
[1:1] Load
[2:2] Load
[3:3] Load
[4:4] Load
[5:5] Call
[6:6] GEP
[7:7] Load
[8:8] Call
[9:9] Call
[10:10] Call
[11:11] Call
[12:12] Call
[13:13] ExtractValue
[14:14] FCmp(pred=4)
[15:15] Other(kind=32)

[Block 1]
[16:0] Call
[17:1] Call
[18:2] Call
[19:3] Call
[20:4] Call
[21:5] Call
[22:6] Other(kind=32)

[Block 2]
[23:0] Store
[24:1] Other(kind=30)
-> [RETURN]

--- Branches ---
Block 0 -> [IF: True->1, False->2]
Block 1 -> [JUMP to 2]

Total Blocks: 3
Total Instructions: 25

DXIL FLow only

=== Shader: RaytracedCSMShadows_MS ===
Block 0 -> [RETURN/EXIT]
Total Blocks: 1

=== Shader: RaytracedCSMShadows_CH ===
Block 3 -> [RETURN/EXIT]
Block 0 -> [IF/ELSE: True->Block 3, False->Block 1]
Block 1 -> [IF/ELSE: True->Block 2, False->Block 3]
Block 2 -> [JUMP to Block 3]
Total Blocks: 4

=== Shader: RaytracedReflections_MS ===
Block 2 -> [RETURN/EXIT]
Block 0 -> [IF/ELSE: True->Block 1, False->Block 2]
Block 1 -> [JUMP to Block 2]
Total Blocks: 3

=== Shader: RaytracedReflections_RS ===
Block 9 -> [RETURN/EXIT]
Block 0 -> [IF/ELSE: True->Block 9, False->Block 1]
Block 1 -> [IF/ELSE: True->Block 5, False->Block 2]
Block 2 -> [IF/ELSE: True->Block 3, False->Block 5]
Block 3 -> [IF/ELSE: True->Block 4, False->Block 9]
Block 4 -> [JUMP to Block 9]
Block 5 -> [IF/ELSE: True->Block 6, False->Block 7]
Block 6 -> [JUMP to Block 9]
Block 7 -> [IF/ELSE: True->Block 8, False->Block 9]
Block 8 -> [JUMP to Block 9]
Total Blocks: 10

=== Shader: RaytracedCSMShadows_RG ===
Block 3 -> [RETURN/EXIT]
Block 0 -> [IF/ELSE: True->Block 2, False->Block 1]
Block 1 -> [JUMP to Block 3]
Block 2 -> [JUMP to Block 3]
Total Blocks: 4

=== Shader: RaytracedReflectionsNV_SER_RS ===
Block 9 -> [RETURN/EXIT]
Block 0 -> [IF/ELSE: True->Block 9, False->Block 1]
Block 1 -> [IF/ELSE: True->Block 5, False->Block 2]
Block 2 -> [IF/ELSE: True->Block 3, False->Block 5]
Block 3 -> [IF/ELSE: True->Block 4, False->Block 9]
Block 4 -> [JUMP to Block 9]
Block 5 -> [IF/ELSE: True->Block 6, False->Block 7]
Block 6 -> [JUMP to Block 9]
Block 7 -> [IF/ELSE: True->Block 8, False->Block 9]
Block 8 -> [JUMP to Block 9]
Total Blocks: 10

also note this is happening real-time while u play games , enabling direct DXIL flow observation , not SPIRV

HHansKristian-Work maintainer 2026-04-17 github

We already have this in dxil-spirv with graphviz output. I don't see the point of this.

DLLs