From 7491058ffdc8d43983df1c283282230fe1cfa683 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Sat, 16 Nov 2013 04:39:16 -0800 Subject: [PATCH] Adding --dump_shaders=path/. --- src/xenia/gpu/d3d11/d3d11_shader.cc | 22 ++++++++++++++++++---- src/xenia/gpu/gpu-private.h | 1 + src/xenia/gpu/gpu.cc | 2 ++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/xenia/gpu/d3d11/d3d11_shader.cc b/src/xenia/gpu/d3d11/d3d11_shader.cc index e63704539..0951a836f 100644 --- a/src/xenia/gpu/d3d11/d3d11_shader.cc +++ b/src/xenia/gpu/d3d11/d3d11_shader.cc @@ -9,6 +9,7 @@ #include +#include #include #include @@ -88,13 +89,26 @@ ID3D10Blob* D3D11Shader::Compile(const char* shader_source) { uint32_t flags2 = 0; // Create a name. - char file_name[64]; + const char* base_path = ""; + if (FLAGS_dump_shaders.size()) { + base_path = FLAGS_dump_shaders.c_str(); + } + char file_name[XE_MAX_PATH]; xesnprintfa(file_name, XECOUNT(file_name), - "gen_%.16XLL.%s", + "%s/gen_%.16XLL.%s", + base_path, hash_, type_ == XE_GPU_SHADER_TYPE_VERTEX ? "vs" : "ps"); - // TODO(benvanik): dump to disk so tools can find it. + if (FLAGS_dump_shaders.size()) { + FILE* f = fopen(file_name, "w"); + fprintf(f, shader_source); + fprintf(f, "\n\n"); + fprintf(f, "/*\n"); + fprintf(f, disasm_src_); + fprintf(f, " */\n"); + fclose(f); + } // Compile shader to bytecode blob. ID3D10Blob* shader_blob = 0; @@ -1089,7 +1103,7 @@ int TranslateALU( // Disassemble scalar op. xe_gpu_translate_alu_info_t& is = scalar_alu_instrs[alu->scalar_opc]; output->append(" // "); - output->append(" \t"); + output->append("\t"); if (is.name) { output->append("\t \t%s\t", is.name); } else { diff --git a/src/xenia/gpu/gpu-private.h b/src/xenia/gpu/gpu-private.h index 92774e08a..6bd36d298 100644 --- a/src/xenia/gpu/gpu-private.h +++ b/src/xenia/gpu/gpu-private.h @@ -16,6 +16,7 @@ DECLARE_string(gpu); DECLARE_bool(trace_ring_buffer); +DECLARE_string(dump_shaders); #endif // XENIA_GPU_PRIVATE_H_ diff --git a/src/xenia/gpu/gpu.cc b/src/xenia/gpu/gpu.cc index c87211aa2..f6133c1e5 100644 --- a/src/xenia/gpu/gpu.cc +++ b/src/xenia/gpu/gpu.cc @@ -22,6 +22,8 @@ DEFINE_string(gpu, "any", DEFINE_bool(trace_ring_buffer, false, "Trace GPU ring buffer packets."); +DEFINE_string(dump_shaders, "", + "Path to write GPU shaders to as they are compiled."); #include