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]
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
We already have this in dxil-spirv with graphviz output. I don't see the point of this.
dxgi.dll
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