diff --git a/scripts/templates/ze_loader_internal.h.mako b/scripts/templates/ze_loader_internal.h.mako index cf0537a8..084ff315 100644 --- a/scripts/templates/ze_loader_internal.h.mako +++ b/scripts/templates/ze_loader_internal.h.mako @@ -76,6 +76,10 @@ namespace loader ze_result_t zetddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED; ze_result_t zesddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED; ze_result_t zerddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED; + + // Resolved gate hook; null = driver doesn't support extension tracing. + zel_pfnDriverEnableTracing_t pfnDriverEnableTracing = nullptr; + bool driverEnableTracingResolved = false; }; using driver_vector_t = std::vector< driver_t >; @@ -132,6 +136,7 @@ namespace loader bool debugTraceAdvanced = false; // true when ZE_ENABLE_LOADER_DEBUG_TRACE=2 or ZEL_ENABLE_LOADER_LOGGING=2 bool driverDDIPathDefault = false; bool tracingLayerEnabled = false; + std::atomic anyExtensionCallbackRegistered{false}; std::once_flag coreDriverSortOnce; std::once_flag sysmanDriverSortOnce; std::atomic sortingInProgress = {false}; @@ -146,4 +151,7 @@ namespace loader extern ze_handle_t* loaderDispatch; extern zer_dditable_t* defaultZerDdiTable; extern context_t *context; + + // Toggles one driver's "zelDriverEnableTracing" gate; UNSUPPORTED if absent. + ze_result_t enableDriverExtensionTracing(driver_t &driver, ze_bool_t enable); } diff --git a/source/loader/ze_loader_internal.h b/source/loader/ze_loader_internal.h index fe656ec0..2f80f492 100644 --- a/source/loader/ze_loader_internal.h +++ b/source/loader/ze_loader_internal.h @@ -67,14 +67,8 @@ namespace loader ze_result_t zetddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED; ze_result_t zesddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED; ze_result_t zerddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED; - // This driver's "zelDriverEnableTracing" gate hook, resolved once at - // driver-init time. A null pointer means the driver does not support - // extension-function tracing, so every runtime enable/disable toggle - // (which a perf tool like VTune calls frequently) is a simple null check - // plus a call - no by-name GetExtensionFunctionAddress lookup on the hot - // path. driverEnableTracingResolved guards the one-time capability probe: - // init_driver can run more than once per driver, and the probe call - // mutates the gate, so it must fire exactly once (before any real enable). + + // Resolved gate hook; null = driver doesn't support extension tracing. zel_pfnDriverEnableTracing_t pfnDriverEnableTracing = nullptr; bool driverEnableTracingResolved = false; }; @@ -200,9 +194,6 @@ namespace loader extern zer_dditable_t* defaultZerDdiTable; extern context_t *context; - // Enable/disable extension-function tracing on a single driver by resolving - // its "zelDriverEnableTracing" hook by name. No-op (returns UNSUPPORTED) for - // drivers that don't implement it. Used to propagate the tracing-layer - // enable/disable state (env + dynamic) down to each driver. + // Toggles one driver's "zelDriverEnableTracing" gate; UNSUPPORTED if absent. ze_result_t enableDriverExtensionTracing(driver_t &driver, ze_bool_t enable); }