From e4a5517d4618e925c03722a8ba8d3e8154b1f1e0 Mon Sep 17 00:00:00 2001 From: Lukasz Dorau Date: Mon, 14 Sep 2026 11:55:46 +0200 Subject: [PATCH] Track zeEventCounterBasedCreate in basic_leak_checker The basic_leak_checker validation layer tracked zeEventCreate and the deprecated zexCounterBasedEventCreate2 extension for event create/destroy leak detection, but not the core zeEventCounterBasedCreate API added in spec v1.15. Applications migrating from the deprecated extension to the core API saw false-positive LEAK reports because zeEventDestroy calls were counted while the corresponding create calls were not. Add zeEventCounterBasedCreate to the tracked create/destroy set and implement its Epilogue hook to count successful calls. Fixes: #512 Fixes: LZL-2723 Signed-off-by: Lukasz Dorau --- .../checkers/basic_leak/zel_basic_leak_checker.cpp | 9 ++++++++- .../checkers/basic_leak/zel_basic_leak_checker.h | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.cpp b/source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.cpp index 45aa181d..9ec46a5f 100644 --- a/source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.cpp +++ b/source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.cpp @@ -54,7 +54,7 @@ namespace validation_layer {{"zeKernelCreate"}, {"zeKernelDestroy"}}, {{"zeEventPoolCreate"}, {"zeEventPoolDestroy"}}, {{"zeCommandListCreateImmediate", "zeCommandListCreate"}, {"zeCommandListDestroy"}}, - {{"zeEventCreate", "zexCounterBasedEventCreate2"}, {"zeEventDestroy"}}, + {{"zeEventCreate", "zeEventCounterBasedCreate", "zexCounterBasedEventCreate2"}, {"zeEventDestroy"}}, {{"zeFenceCreate"}, {"zeFenceDestroy"}}, {{"zeImageCreate", "zeImageViewCreateExt"}, {"zeImageDestroy"}}, {{"zeSamplerCreate"}, {"zeSamplerDestroy"}}, @@ -173,6 +173,13 @@ namespace validation_layer return result; } + ze_result_t basic_leakChecker::ZEbasic_leakChecker::zeEventCounterBasedCreateEpilogue(ze_context_handle_t, ze_device_handle_t, const ze_event_counter_based_desc_t *, ze_event_handle_t *, ze_result_t result) { + if (result == ZE_RESULT_SUCCESS) { + countFunctionCall("zeEventCounterBasedCreate"); + } + return result; + } + ze_result_t basic_leakChecker::ZEbasic_leakChecker::zeEventDestroyEpilogue(ze_event_handle_t, ze_result_t result) { if (result == ZE_RESULT_SUCCESS) { countFunctionCall("zeEventDestroy"); diff --git a/source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.h b/source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.h index 64036c35..06b27ab5 100644 --- a/source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.h +++ b/source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.h @@ -34,7 +34,8 @@ namespace validation_layer // zeEventPoolCreate = 1 \---> zeEventPoolDestroy = 1 // zeCommandListCreateImmediate = 1 | // zeCommandListCreate = 1 \---> zeCommandListDestroy = 1 ---> LEAK = 1 - // zeEventCreate = 2 \---> zeEventDestroy = 2 + // zeEventCreate = 2 | + // zeEventCounterBasedCreate = 0 \---> zeEventDestroy = 2 // zeFenceCreate = 1 \---> zeFenceDestroy = 1 // zeImageCreate = 0 \---> zeImageDestroy = 0 // zeSamplerCreate = 0 \---> zeSamplerDestroy = 0 @@ -67,6 +68,7 @@ namespace validation_layer ze_result_t zeCommandListCreateEpilogue(ze_context_handle_t, ze_device_handle_t, const ze_command_list_desc_t*, ze_command_list_handle_t*, ze_result_t result) override; ze_result_t zeCommandListDestroyEpilogue(ze_command_list_handle_t, ze_result_t result) override; ze_result_t zeEventCreateEpilogue(ze_event_pool_handle_t, const ze_event_desc_t *, ze_event_handle_t *, ze_result_t result) override; + ze_result_t zeEventCounterBasedCreateEpilogue(ze_context_handle_t, ze_device_handle_t, const ze_event_counter_based_desc_t *, ze_event_handle_t *, ze_result_t result) override; ze_result_t zeEventDestroyEpilogue(ze_event_handle_t, ze_result_t result) override; ze_result_t zeFenceCreateEpilogue(ze_command_queue_handle_t, const ze_fence_desc_t *, ze_fence_handle_t*, ze_result_t result) override; ze_result_t zeFenceDestroyEpilogue(ze_fence_handle_t, ze_result_t result) override;