Browse Source

Added debug info for shaders build with DX11 compiler.

bkaradzic 12 years ago
parent
commit
e05d250948
1 changed files with 36 additions and 22 deletions
  1. 36 22
      tools/shaderc/shaderc.cpp

+ 36 - 22
tools/shaderc/shaderc.cpp

@@ -589,11 +589,11 @@ bool compileHLSLShaderDx9(bx::CommandLine& _cmdLine, const std::string& _code, b
 	// file path.
 	if (debug)
 	{
-		std::string ofp = _cmdLine.findOption('o');
-		ofp += ".hlsl";
-		writeFile(ofp.c_str(), _code.c_str(), (int32_t)_code.size() );
+		std::string hlslfp = _cmdLine.findOption('o');
+		hlslfp += ".hlsl";
+		writeFile(hlslfp.c_str(), _code.c_str(), (int32_t)_code.size() );
 
-		hr = D3DXCompileShaderFromFileA(ofp.c_str()
+		hr = D3DXCompileShaderFromFileA(hlslfp.c_str()
 				, NULL
 				, NULL
 				, "main"
@@ -716,10 +716,10 @@ bool compileHLSLShaderDx9(bx::CommandLine& _cmdLine, const std::string& _code, b
 
 		if (NULL != disasm)
 		{
-			std::string ofp = _cmdLine.findOption('o');
-			ofp += ".disasm";
+			std::string disasmfp = _cmdLine.findOption('o');
+			disasmfp += ".disasm";
 
-			writeFile(ofp.c_str(), disasm->GetBufferPointer(), disasm->GetBufferSize() );
+			writeFile(disasmfp.c_str(), disasm->GetBufferPointer(), disasm->GetBufferSize() );
 			disasm->Release();
 		}
 	}
@@ -756,8 +756,10 @@ bool compileHLSLShaderDx11(bx::CommandLine& _cmdLine, const std::string& _code,
 		return false;
 	}
 
+	bool debug = _cmdLine.hasArg('\0', "debug");
+
 	uint32_t flags = D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY;
-	flags |= _cmdLine.hasArg('\0', "debug") ? D3DCOMPILE_DEBUG : 0;
+	flags |= debug ? D3DCOMPILE_DEBUG : 0;
 	flags |= _cmdLine.hasArg('\0', "avoid-flow-control") ? D3DCOMPILE_AVOID_FLOW_CONTROL : 0;
 	flags |= _cmdLine.hasArg('\0', "no-preshader") ? D3DCOMPILE_NO_PRESHADER : 0;
 	flags |= _cmdLine.hasArg('\0', "partial-precision") ? D3DCOMPILE_PARTIAL_PRECISION : 0;
@@ -788,18 +790,30 @@ bool compileHLSLShaderDx11(bx::CommandLine& _cmdLine, const std::string& _code,
 	ID3DBlob* code;
 	ID3DBlob* errorMsg;
 
+	// Output preprocessed shader so that HLSL can be debugged via GPA
+	// or PIX. Compiling through memory won't embed preprocessed shader
+	// file path.
+	std::string hlslfp;
+
+	if (debug)
+	{
+		hlslfp = _cmdLine.findOption('o');
+		hlslfp += ".hlsl";
+		writeFile(hlslfp.c_str(), _code.c_str(), (int32_t)_code.size() );
+	}
+
 	HRESULT hr = D3DCompile(_code.c_str()
-		, _code.size()
-		, NULL
-		, NULL
-		, NULL
-		, "main"
-		, profile
-		, flags
-		, 0
-		, &code
-		, &errorMsg
-		);
+					, _code.size()
+					, hlslfp.c_str()
+					, NULL
+					, NULL
+					, "main"
+					, profile
+					, flags
+					, 0
+					, &code
+					, &errorMsg
+					);
 	if (FAILED(hr)
 	|| (werror && NULL != errorMsg) )
 	{
@@ -992,10 +1006,10 @@ bool compileHLSLShaderDx11(bx::CommandLine& _cmdLine, const std::string& _code,
 
 		if (NULL != disasm)
 		{
-			std::string ofp = _cmdLine.findOption('o');
-			ofp += ".disasm";
+			std::string disasmfp = _cmdLine.findOption('o');
+			disasmfp += ".disasm";
 
-			writeFile(ofp.c_str(), disasm->GetBufferPointer(), (uint32_t)disasm->GetBufferSize() );
+			writeFile(disasmfp.c_str(), disasm->GetBufferPointer(), (uint32_t)disasm->GetBufferSize() );
 			disasm->Release();
 		}
 	}