From ed5ea28fb3311beb734bf663b334f740f9260a8e Mon Sep 17 00:00:00 2001 From: Jon Campbell Date: Mon, 13 Jan 2025 13:38:30 -0800 Subject: [PATCH] Fix QNN options parsing, respecting existing defaults --- js/node/src/session_options_helper.cc | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/js/node/src/session_options_helper.cc b/js/node/src/session_options_helper.cc index 8c1d7ca06b..5e777fc8e1 100644 --- a/js/node/src/session_options_helper.cc +++ b/js/node/src/session_options_helper.cc @@ -46,6 +46,9 @@ void ParseExecutionProviders(const Napi::Array epList, Ort::SessionOptions& sess #endif #ifdef USE_WEBGPU std::unordered_map webgpu_options; +#endif +#ifdef USE_QNN + std::unordered_map qnn_options; #endif if (epValue.IsString()) { name = epValue.As().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().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().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 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 {