diff options
Diffstat (limited to 'src/libs/dxvk-native-1.9.2a/tests/dxbc')
4 files changed, 233 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/tests/dxbc/meson.build b/src/libs/dxvk-native-1.9.2a/tests/dxbc/meson.build new file mode 100644 index 00000000..3bd0912a --- /dev/null +++ b/src/libs/dxvk-native-1.9.2a/tests/dxbc/meson.build @@ -0,0 +1,6 @@ +test_dxbc_deps = [ dxbc_dep, dxvk_dep ] + +executable('dxbc-compiler'+exe_ext, files('test_dxbc_compiler.cpp'), dependencies : test_dxbc_deps, install : true, gui_app : true, override_options: ['cpp_std='+dxvk_cpp_std]) +executable('dxbc-disasm'+exe_ext, files('test_dxbc_disasm.cpp'), dependencies : [ test_dxbc_deps, lib_d3dcompiler_47 ], install : true, gui_app : true, override_options: ['cpp_std='+dxvk_cpp_std]) +executable('hlsl-compiler'+exe_ext, files('test_hlsl_compiler.cpp'), dependencies : [ test_dxbc_deps, lib_d3dcompiler_47 ], install : true, gui_app : true, override_options: ['cpp_std='+dxvk_cpp_std]) + diff --git a/src/libs/dxvk-native-1.9.2a/tests/dxbc/test_dxbc_compiler.cpp b/src/libs/dxvk-native-1.9.2a/tests/dxbc/test_dxbc_compiler.cpp new file mode 100644 index 00000000..735604d7 --- /dev/null +++ b/src/libs/dxvk-native-1.9.2a/tests/dxbc/test_dxbc_compiler.cpp @@ -0,0 +1,58 @@ +#include <iterator> +#include <fstream> + +#include "../../src/dxbc/dxbc_module.h" +#include "../../src/dxvk/dxvk_shader.h" + +#include <shellapi.h> +#include <windows.h> +#include <windowsx.h> + +namespace dxvk { + Logger Logger::s_instance("dxbc-compiler.log"); +} + +using namespace dxvk; + +int WINAPI WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) { + int argc = 0; + LPWSTR* argv = CommandLineToArgvW( + GetCommandLineW(), &argc); + + if (argc < 3) { + Logger::err("Usage: dxbc-compiler input.dxbc output.spv"); + return 1; + } + + try { + std::string ifileName = str::fromws(argv[1]); + std::ifstream ifile(ifileName, std::ios::binary); + ifile.ignore(std::numeric_limits<std::streamsize>::max()); + std::streamsize length = ifile.gcount(); + ifile.clear(); + + ifile.seekg(0, std::ios_base::beg); + std::vector<char> dxbcCode(length); + ifile.read(dxbcCode.data(), length); + + DxbcReader reader(dxbcCode.data(), dxbcCode.size()); + DxbcModule module(reader); + + DxbcModuleInfo moduleInfo; + moduleInfo.options.useSubgroupOpsForAtomicCounters = true; + moduleInfo.options.useDemoteToHelperInvocation = true; + moduleInfo.options.minSsboAlignment = 4; + moduleInfo.xfb = nullptr; + + Rc<DxvkShader> shader = module.compile(moduleInfo, ifileName); + std::ofstream ofile(str::fromws(argv[2]), std::ios::binary); + shader->dump(ofile); + return 0; + } catch (const DxvkError& e) { + Logger::err(e.message()); + return 1; + } +} diff --git a/src/libs/dxvk-native-1.9.2a/tests/dxbc/test_dxbc_disasm.cpp b/src/libs/dxvk-native-1.9.2a/tests/dxbc/test_dxbc_disasm.cpp new file mode 100644 index 00000000..c87ec352 --- /dev/null +++ b/src/libs/dxvk-native-1.9.2a/tests/dxbc/test_dxbc_disasm.cpp @@ -0,0 +1,60 @@ +#include <iostream> +#include <string> + +#include <d3dcompiler.h> + +#include <shellapi.h> +#include <windows.h> +#include <windowsx.h> + +#include "../../src/util/com/com_pointer.h" + +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 || argc > 3) { + std::cerr << "Usage: dxbc-disasm input.dxbc [output]" << std::endl; + return 1; + } + + Com<ID3DBlob> assembly; + Com<ID3DBlob> binary; + + // input file + if (FAILED(D3DReadFileToBlob(argv[1], &binary))) { + std::cerr << "Failed to read shader" << std::endl; + return 1; + } + + HRESULT hr = D3DDisassemble( + binary->GetBufferPointer(), + binary->GetBufferSize(), + D3D_DISASM_ENABLE_INSTRUCTION_NUMBERING, nullptr, + &assembly); + + if (FAILED(hr)) { + std::cerr << "Failed to disassemble shader" << std::endl; + return 1; + } + + // output file variant + if (argc == 3 && FAILED(D3DWriteBlobToFile(assembly.ptr(), argv[2], 1))) { + std::cerr << "Failed to write shader" << std::endl; + return 1; + } + + // stdout variant + if (argc == 2) { + std::string data((const char *)assembly->GetBufferPointer(), assembly->GetBufferSize()); + std::cout << data; + } + + return 0; +} diff --git a/src/libs/dxvk-native-1.9.2a/tests/dxbc/test_hlsl_compiler.cpp b/src/libs/dxvk-native-1.9.2a/tests/dxbc/test_hlsl_compiler.cpp new file mode 100644 index 00000000..b1670878 --- /dev/null +++ b/src/libs/dxvk-native-1.9.2a/tests/dxbc/test_hlsl_compiler.cpp @@ -0,0 +1,109 @@ +#include <cstring> +#include <fstream> +#include <vector> + +#include <d3dcompiler.h> + +#include <shellapi.h> +#include <windows.h> +#include <windowsx.h> + +#include "../test_utils.h" + +using namespace dxvk; + +int WINAPI WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) { + int argc = 0; + LPWSTR* argv = CommandLineToArgvW( + GetCommandLineW(), &argc); + + if (argc < 5) { + std::cerr << "Usage: hlsl-compiler target entrypoint input.hlsl output.dxbc [--strip] [--text]" << std::endl; + return 1; + } + + bool strip = false; + bool text = false; + + for (int i = 5; i < argc; i++) { + strip |= str::fromws(argv[i]) == "--strip"; + text |= str::fromws(argv[i]) == "--text"; + } + + const LPWSTR target = argv[1]; + const LPWSTR entryPoint = argv[2]; + const LPWSTR inputFile = argv[3]; + const LPWSTR outputFile = argv[4]; + + std::ifstream ifile(str::fromws(inputFile), std::ios::binary); + ifile.ignore(std::numeric_limits<std::streamsize>::max()); + std::streamsize length = ifile.gcount(); + ifile.clear(); + + ifile.seekg(0, std::ios_base::beg); + std::vector<char> hlslCode(length); + ifile.read(hlslCode.data(), length); + + Com<ID3DBlob> binary; + Com<ID3DBlob> errors; + + HRESULT hr = D3DCompile( + hlslCode.data(), + hlslCode.size(), + "Shader", nullptr, nullptr, + str::fromws(entryPoint).c_str(), + str::fromws(target).c_str(), + D3DCOMPILE_OPTIMIZATION_LEVEL3 | + D3DCOMPILE_ENABLE_UNBOUNDED_DESCRIPTOR_TABLES, + 0, &binary, &errors); + + if (FAILED(hr)) { + if (errors != nullptr) + std::cerr << reinterpret_cast<const char*>(errors->GetBufferPointer()) << std::endl; + return 1; + } + + if (strip) { + Com<ID3DBlob> strippedBlob; + + hr = D3DStripShader(binary->GetBufferPointer(), binary->GetBufferSize(), + D3DCOMPILER_STRIP_REFLECTION_DATA | D3DCOMPILER_STRIP_DEBUG_INFO, + &strippedBlob); + + if (FAILED(hr)) { + std::cerr << "Failed to strip shader" << std::endl; + return 1; + } + + binary = strippedBlob; + } + + std::ofstream file; + + if (str::fromws(outputFile) != "-") + file = std::ofstream(str::fromws(outputFile), std::ios::binary | std::ios::trunc); + + std::ostream& outputStream = file.is_open() ? file : std::cout; + + if (text) { + auto data = reinterpret_cast<const uint32_t*>(binary->GetBufferPointer()); + auto size = binary->GetBufferSize() / sizeof(uint32_t); + + outputStream << std::hex; + + for (uint32_t i = 0; i < size; i++) { + if (i && !(i & 0x7)) + outputStream << std::endl; + outputStream << "0x" << std::setfill('0') << std::setw(8) << data[i] << ", "; + } + + outputStream << std::endl; + } else { + outputStream.write(reinterpret_cast<const char*>(binary->GetBufferPointer()), binary->GetBufferSize()); + } + + return 0; +} |