int main(int argc, char** argv) { if(argc < 2) { usage(); return 1; } std::vector<char> data; std::ifstream in(argv[1]); char c; in >> std::noskipws; while(in >> c) data.push_back(c); in.close(); dxbc_container* dxbc = dxbc_parse(&data[0], data.size()); if(dxbc) { std::cout << *dxbc; dxbc_chunk_header* sm4_chunk = dxbc_find_shader_bytecode(&data[0], data.size()); if(sm4_chunk) { sm4_program* sm4 = sm4_parse(sm4_chunk + 1, bswap_le32(sm4_chunk->size)); if(sm4) { std::cout << *sm4; delete sm4; } } delete dxbc; } }
int main(int argc, char** argv) { if(argc < 2) { usage(); return EXIT_FAILURE; } std::vector<char> data; FILE *pFile = NULL; #ifdef _MSC_VER fopen_s(&pFile, argv[1], "rb" ); #else pFile = fopen(argv[1], "rb" ); #endif if ( !pFile ) { printf("Could not open file: %s\n", pFile ); return EXIT_FAILURE; } fseek(pFile, 0, SEEK_END); uint32_t nFileSize = ftell(pFile); fseek(pFile, 0, SEEK_SET); if (nFileSize < sizeof(dxbc_container_header)) { printf("File is too small!\n"); return EXIT_FAILURE; } data.resize(nFileSize); if (fread(&data[0], 1, nFileSize, pFile) != nFileSize) { printf("Failed reading file!\n"); return EXIT_FAILURE; } fclose(pFile); dxbc_container* dxbc = dxbc_parse(&data[0], data.size()); if(dxbc) { std::cout << *dxbc; dxbc_chunk_header* sm4_chunk = dxbc_find_shader_bytecode(&data[0], data.size()); if(sm4_chunk) { sm4_program* sm4 = sm4_parse(sm4_chunk + 1, bswap_le32(sm4_chunk->size)); if(sm4) { std::cout << *sm4; delete sm4; } } delete dxbc; } return EXIT_SUCCESS; }
HRESULT d3dcompiler_strip_shader(const void *data, SIZE_T data_size, UINT flags, ID3DBlob **blob) { struct dxbc src_dxbc, dst_dxbc; HRESULT hr; unsigned int i; if (!blob) { WARN("NULL for blob specified\n"); return E_FAIL; } if (!data || !data_size) { WARN("Invalid arguments: data %p, data_size %lu\n", data, data_size); return D3DERR_INVALIDCALL; } hr = dxbc_parse(data, data_size, &src_dxbc); if (FAILED(hr)) { WARN("Failed to parse blob part\n"); return hr; } /* src_dxbc.count >= dst_dxbc.count */ hr = dxbc_init(&dst_dxbc, src_dxbc.count); if (FAILED(hr)) { dxbc_destroy(&src_dxbc); WARN("Failed to init dxbc\n"); return hr; } for (i = 0; i < src_dxbc.count; ++i) { struct dxbc_section *section = &src_dxbc.sections[i]; if (check_blob_strip(section->tag, flags)) { hr = dxbc_add_section(&dst_dxbc, section->tag, section->data, section->data_size); if (FAILED(hr)) { dxbc_destroy(&src_dxbc); dxbc_destroy(&dst_dxbc); WARN("Failed to add section to dxbc\n"); return hr; } } } hr = dxbc_write_blob(&dst_dxbc, blob); if (FAILED(hr)) { WARN("Failed to write blob part\n"); } dxbc_destroy(&src_dxbc); dxbc_destroy(&dst_dxbc); return hr; }
HRESULT d3dcompiler_get_blob_part(const void *data, SIZE_T data_size, D3D_BLOB_PART part, UINT flags, ID3DBlob **blob) { struct dxbc src_dxbc, dst_dxbc; HRESULT hr; unsigned int i, count; if (!data || !data_size || flags || !blob) { WARN("Invalid arguments: data %p, data_size %lu, flags %#x, blob %p\n", data, data_size, flags, blob); return D3DERR_INVALIDCALL; } if (part > D3D_BLOB_TEST_COMPILE_PERF || (part < D3D_BLOB_TEST_ALTERNATE_SHADER && part > D3D_BLOB_XNA_SHADER)) { WARN("Invalid D3D_BLOB_PART: part %s\n", debug_d3dcompiler_d3d_blob_part(part)); return D3DERR_INVALIDCALL; } hr = dxbc_parse(data, data_size, &src_dxbc); if (FAILED(hr)) { WARN("Failed to parse blob part\n"); return hr; } hr = dxbc_init(&dst_dxbc, 0); if (FAILED(hr)) { dxbc_destroy(&src_dxbc); WARN("Failed to init dxbc\n"); return hr; } for (i = 0; i < src_dxbc.count; ++i) { struct dxbc_section *section = &src_dxbc.sections[i]; if (check_blob_part(section->tag, part)) { hr = dxbc_add_section(&dst_dxbc, section->tag, section->data, section->data_size); if (FAILED(hr)) { dxbc_destroy(&src_dxbc); dxbc_destroy(&dst_dxbc); WARN("Failed to add section to dxbc\n"); return hr; } } } count = dst_dxbc.count; switch(part) { case D3D_BLOB_INPUT_SIGNATURE_BLOB: case D3D_BLOB_OUTPUT_SIGNATURE_BLOB: case D3D_BLOB_PATCH_CONSTANT_SIGNATURE_BLOB: case D3D_BLOB_DEBUG_INFO: case D3D_BLOB_LEGACY_SHADER: case D3D_BLOB_XNA_PREPASS_SHADER: case D3D_BLOB_XNA_SHADER: if (count != 1) count = 0; break; case D3D_BLOB_INPUT_AND_OUTPUT_SIGNATURE_BLOB: if (count != 2) count = 0; break; case D3D_BLOB_ALL_SIGNATURE_BLOB: if (count != 3) count = 0; break; default: FIXME("Unhandled D3D_BLOB_PART %s.\n", debug_d3dcompiler_d3d_blob_part(part)); break; } if (count == 0) { dxbc_destroy(&src_dxbc); dxbc_destroy(&dst_dxbc); WARN("Nothing to write into the blob (count = 0)\n"); return E_FAIL; } /* some parts aren't full DXBCs, they contain only the data */ if (count == 1 && (part == D3D_BLOB_DEBUG_INFO || part == D3D_BLOB_LEGACY_SHADER || part == D3D_BLOB_XNA_PREPASS_SHADER || part == D3D_BLOB_XNA_SHADER)) { hr = D3DCreateBlob(dst_dxbc.sections[0].data_size, blob); if (SUCCEEDED(hr)) { memcpy(ID3D10Blob_GetBufferPointer(*blob), dst_dxbc.sections[0].data, dst_dxbc.sections[0].data_size); } else { WARN("Could not create blob\n"); } } else { hr = dxbc_write_blob(&dst_dxbc, blob); if (FAILED(hr)) { WARN("Failed to write blob part\n"); } } dxbc_destroy(&src_dxbc); dxbc_destroy(&dst_dxbc); return hr; }