mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-11-30 22:24:15 +01:00
56 lines
1.3 KiB
C++
56 lines
1.3 KiB
C++
|
#include <iterator>
|
||
|
#include <fstream>
|
||
|
|
||
|
#include <d3dcompiler.h>
|
||
|
|
||
|
#include <dxbc_module.h>
|
||
|
#include <dxvk_shader.h>
|
||
|
|
||
|
#include <shellapi.h>
|
||
|
#include <windows.h>
|
||
|
#include <windowsx.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) {
|
||
|
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<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);
|
||
|
|
||
|
Com<ID3DBlob> 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;
|
||
|
}
|