void ezCommandLineUtils::SplitCommandLineString(const char* commandString, bool addExecutableDir, ezDynamicArray<ezString>& outArgs, ezDynamicArray<const char*>& outArgsV) { // Add application dir as first argument as customary on other platforms. if (addExecutableDir) { #if EZ_ENABLED(EZ_PLATFORM_WINDOWS) wchar_t moduleFilename[256]; GetModuleFileNameW(nullptr, moduleFilename, 256); outArgs.PushBack(ezStringUtf8(moduleFilename).GetData()); #else EZ_ASSERT_NOT_IMPLEMENTED; #endif } // Simple args splitting. Not as powerful as Win32's CommandLineToArgvW. const char* currentChar = commandString; const char* lastEnd = currentChar; bool inQuotes = false; while (*currentChar != '\0') { if (*currentChar == '\"') inQuotes = !inQuotes; else if (*currentChar == ' ' && !inQuotes) { ezStringBuilder path = ezStringView(lastEnd, currentChar); path.Trim(" \""); outArgs.PushBack(path); lastEnd = currentChar + 1; } ezUnicodeUtils::MoveToNextUtf8(currentChar); } outArgsV.Reserve(outArgsV.GetCount()); for (ezString& str : outArgs) outArgsV.PushBack(str.GetData()); }
ezResult CompileDXShader(const char* szFile, const char* szSource, bool bDebug, const char* szProfile, const char* szEntryPoint, ezDynamicArray<ezUInt8>& out_ByteCode) { out_ByteCode.Clear(); ID3DBlob* pResultBlob = nullptr; ID3DBlob* pErrorBlob = nullptr; const char* szCompileSource = szSource; ezStringBuilder sDebugSource; UINT flags1 = 0; if (bDebug) { flags1 = D3DCOMPILE_DEBUG | D3DCOMPILE_PREFER_FLOW_CONTROL | D3DCOMPILE_SKIP_OPTIMIZATION | D3DCOMPILE_ENABLE_STRICTNESS; // In debug mode we need to remove '#line' as any shader debugger won't work with them. sDebugSource = szSource; sDebugSource.ReplaceAll("#line ", "//ine "); szCompileSource = sDebugSource; } if (FAILED(D3DCompile( szCompileSource, strlen(szCompileSource), szFile, nullptr, nullptr, szEntryPoint, szProfile, flags1, 0, &pResultBlob, &pErrorBlob))) { if (bDebug) { // Try again with '#line' intact to get correct error messages with file and line info. pErrorBlob->Release(); pErrorBlob = nullptr; EZ_VERIFY(FAILED(D3DCompile( szSource, strlen(szSource), szFile, nullptr, nullptr, szEntryPoint, szProfile, flags1, 0, &pResultBlob, &pErrorBlob)), "Debug compilation with commented out '#line' failed but original version did not."); } const char* szError = static_cast<const char*>(pErrorBlob->GetBufferPointer()); EZ_LOG_BLOCK("Shader Compilation Failed", szFile); ezLog::Error("Could not compile shader '{0}' for profile '{1}'", szFile, szProfile); ezLog::Error("{0}", szError); pErrorBlob->Release(); return EZ_FAILURE; } if (pErrorBlob != nullptr) { const char* szError = static_cast<const char*>(pErrorBlob->GetBufferPointer()); EZ_LOG_BLOCK("Shader Compilation Error Message", szFile); ezLog::Dev("{0}", szError); pErrorBlob->Release(); } if (pResultBlob != nullptr) { out_ByteCode.SetCountUninitialized((ezUInt32)pResultBlob->GetBufferSize()); ezMemoryUtils::Copy(out_ByteCode.GetData(), static_cast<ezUInt8*>(pResultBlob->GetBufferPointer()), out_ByteCode.GetCount()); pResultBlob->Release(); } return EZ_SUCCESS; }