// code->bytecode bool CompileGeometryShader(const std::string& code, D3DBlob** blob, const D3D_SHADER_MACRO* pDefines) { ID3D10Blob* shaderBuffer = nullptr; ID3D10Blob* errorBuffer = nullptr; #if defined(_DEBUG) || defined(DEBUGFAST) UINT flags = D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY | D3D10_SHADER_DEBUG; #else UINT flags = D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY | D3D10_SHADER_OPTIMIZATION_LEVEL3 | D3D10_SHADER_SKIP_VALIDATION; #endif HRESULT hr = PD3DCompile(code.c_str(), code.length(), nullptr, pDefines, nullptr, "main", D3D::GeometryShaderVersionString(), flags, 0, &shaderBuffer, &errorBuffer); if (errorBuffer) { INFO_LOG(VIDEO, "Geometry shader compiler messages:\n%s\n", (const char*)errorBuffer->GetBufferPointer()); } if (FAILED(hr)) { static int num_failures = 0; std::string filename = StringFromFormat("%sbad_gs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), num_failures++); std::ofstream file; OpenFStream(file, filename, std::ios_base::out); file << code; file.close(); PanicAlert("Failed to compile geometry shader: %s\nDebug info (%s):\n%s", filename.c_str(), D3D::GeometryShaderVersionString(), (const char*)errorBuffer->GetBufferPointer()); *blob = nullptr; errorBuffer->Release(); } else { *blob = new D3DBlob(shaderBuffer); shaderBuffer->Release(); } return SUCCEEDED(hr); }
HRESULT HLSLCompiler::CompileShader(LPCVOID pSrcData, SIZE_T SrcDataSize, LPCSTR pSourceName, const D3D_SHADER_MACRO *pDefines, ID3DInclude *pInclude, LPCSTR pEntrypoint, LPCSTR pTarget, UINT Flags1, UINT Flags2, ID3DBlob **ppCode, ID3DBlob **ppErrorMsgs) { return PD3DCompile(pSrcData, SrcDataSize, pSourceName, pDefines, pInclude, pEntrypoint, pTarget, Flags1, Flags2, ppCode, ppErrorMsgs); }
bool HLSLAsyncCompiler::NextTask() { ShaderCompilerWorkUnit* unit; if (m_input.try_pop(unit)) { if (unit->GenerateCodeHandler) { unit->GenerateCodeHandler(unit); } unit->cresult = PD3DCompile(unit->code.data(), unit->codesize, nullptr, (const D3D_SHADER_MACRO*)unit->defines, nullptr, unit->entrypoint, unit->target, unit->flags, 0, &unit->shaderbytecode, &unit->error); m_output.push(unit); return true; } return false; }