From 46909f82fcaafa56c25ced85713d894ffe9b40a0 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 6 Dec 2017 18:53:25 +0100 Subject: [PATCH] [tests] Added DXBC disassembler --- tests/dxbc/meson.build | 3 +- tests/dxbc/test_dxbc_disasm.cpp | 55 +++++++++++++++++++++++++++++++++ tests/meson.build | 4 +++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 tests/dxbc/test_dxbc_disasm.cpp diff --git a/tests/dxbc/meson.build b/tests/dxbc/meson.build index fb37fd6b..01c71fb0 100644 --- a/tests/dxbc/meson.build +++ b/tests/dxbc/meson.build @@ -1,3 +1,4 @@ test_dxbc_deps = [ dxbc_dep, dxvk_dep ] -executable('dxbc-compiler', files('test_dxbc_compiler.cpp'), dependencies : test_dxbc_deps, install : true) \ No newline at end of file +executable('dxbc-compiler', files('test_dxbc_compiler.cpp'), dependencies : test_dxbc_deps, install : true) +executable('dxbc-disasm', files('test_dxbc_disasm.cpp'), dependencies : [ test_dxbc_deps, lib_d3dcompiler_47 ], install : true) \ No newline at end of file diff --git a/tests/dxbc/test_dxbc_disasm.cpp b/tests/dxbc/test_dxbc_disasm.cpp new file mode 100644 index 00000000..7c5967ba --- /dev/null +++ b/tests/dxbc/test_dxbc_disasm.cpp @@ -0,0 +1,55 @@ +#include +#include + +#include + +#include +#include + +#include +#include +#include + +using namespace dxvk; + +int WINAPI WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) { + int argc = 0; + LPWSTR* argv = CommandLineToArgvW( + GetCommandLineW(), &argc); + + if (argc < 2) { + std::cerr << "Usage: dxbc-disasm input.dxbc" << std::endl; + return 1; + } + + std::ifstream ifile(str::fromws(argv[1]), std::ios::binary); + ifile.ignore(std::numeric_limits::max()); + std::streamsize length = ifile.gcount(); + ifile.clear(); + + ifile.seekg(0, std::ios_base::beg); + std::vector dxbcCode(length); + ifile.read(dxbcCode.data(), length); + + Com assembly; + + HRESULT hr = D3DDisassemble( + dxbcCode.data(), + dxbcCode.size(), + D3D_DISASM_ENABLE_INSTRUCTION_NUMBERING, nullptr, + &assembly); + + if (FAILED(hr)) { + std::cerr << "Failed to disassemble shader" << std::endl; + return 1; + } + + std::string data; + data.resize(assembly->GetBufferSize()); + std::memcpy(data.data(), assembly->GetBufferPointer(), data.size()); + std::cout << data; + return 0; +} diff --git a/tests/meson.build b/tests/meson.build index 096cbfdd..b6efa377 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1,3 +1,7 @@ +lib_d3d11 = dxvk_compiler.find_library('d3d11') +lib_dxgi = dxvk_compiler.find_library('dxgi') +lib_d3dcompiler_47 = dxvk_compiler.find_library('d3dcompiler_47') + subdir('d3d11') subdir('dxbc') subdir('dxgi')