Fix QNN options parsing, respecting existing defaults

This commit is contained in:
Jon Campbell 2025-01-13 13:38:30 -08:00
parent d57812735d
commit ed5ea28fb3

View file

@ -46,6 +46,9 @@ void ParseExecutionProviders(const Napi::Array epList, Ort::SessionOptions& sess
#endif
#ifdef USE_WEBGPU
std::unordered_map<std::string, std::string> webgpu_options;
#endif
#ifdef USE_QNN
std::unordered_map<std::string, std::string> qnn_options;
#endif
if (epValue.IsString()) {
name = epValue.As<Napi::String>().Utf8Value();
@ -75,6 +78,18 @@ void ParseExecutionProviders(const Napi::Array epList, Ort::SessionOptions& sess
webgpu_options[name] = value;
}
}
#endif
#ifdef USE_QNN
for (const auto& nameIter : obj.GetPropertyNames()) {
Napi::Value nameVar = nameIter.second;
std::string name = nameVar.As<Napi::String>().Utf8Value();
if (name != "name") {
Napi::Value valueVar = obj.Get(nameVar);
ORT_NAPI_THROW_TYPEERROR_IF(!valueVar.IsString(), epList.Env(), "Invalid argument: sessionOptions.executionProviders must be a string or an object with property 'name'.");
std::string value = valueVar.As<Napi::String>().Utf8Value();
qnn_options[name] = value;
}
}
#endif
}
@ -111,9 +126,14 @@ void ParseExecutionProviders(const Napi::Array epList, Ort::SessionOptions& sess
#endif
#ifdef USE_QNN
} else if (name == "qnn") {
std::unordered_map<std::string, std::string> qnn_options;
qnn_options["backend_path"] = "QnnHtp.dll";
qnn_options["enable_htp_fp16_precision"] = "1";
// Ensure that the backend_path and enable_htp_fp16_precision options are set to default values if not provided.
if (qnn_options.find("backend_path") == qnn_options.end()) {
qnn_options["backend_path"] = "QnnHtp.dll";
}
if (qnn_options.find("enable_htp_fp16_precision") == qnn_options.end()) {
qnn_options["enable_htp_fp16_precision"] = "1";
}
sessionOptions.AppendExecutionProvider("QNN", qnn_options);
#endif
} else {