diff --git a/source/loader/ze_loader_api.cpp b/source/loader/ze_loader_api.cpp index 314ec1ba..b3abb53d 100644 --- a/source/loader/ze_loader_api.cpp +++ b/source/loader/ze_loader_api.cpp @@ -101,84 +101,176 @@ zelLoaderTranslateHandleInternal( *handleOut = handleIn; switch(handleType){ - case ZEL_HANDLE_DRIVER: - if (loader::context->ze_driver_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + case ZEL_HANDLE_DRIVER: + { + // Determine if legacy loader intercept is enabled + // i.e., loader object exists for that handle by checking two conditions: + // 1. DDI Ext is disabled in loader by default OR + // 2. The input handle's function pointer matches the loader's dispatch table pointer, + // indicating that the handle was created through the legacy loader intercept layer + + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->Driver->pfnGet == + loader::loaderDispatch->pCore->Driver->pfnGet); + if (legacy_ldr_intercept_enabled && loader::context->ze_driver_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; - case ZEL_HANDLE_DEVICE: - if (loader::context->ze_device_factory.hasInstance(reinterpret_cast(handleIn)->handle)){ - *handleOut = reinterpret_cast( handleIn )->handle; + } + case ZEL_HANDLE_DEVICE: + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->Device->pfnGet == + loader::loaderDispatch->pCore->Device->pfnGet); + if (legacy_ldr_intercept_enabled && loader::context->ze_device_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; - case ZEL_HANDLE_CONTEXT: - if (loader::context->ze_context_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + } + case ZEL_HANDLE_CONTEXT: + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->Context->pfnCreate == + loader::loaderDispatch->pCore->Context->pfnCreate); + if (legacy_ldr_intercept_enabled && + loader::context->ze_context_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_COMMAND_QUEUE: - if (loader::context->ze_command_queue_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->CommandQueue->pfnCreate == + loader::loaderDispatch->pCore->CommandQueue->pfnCreate); + if (legacy_ldr_intercept_enabled && loader::context->ze_command_queue_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_COMMAND_LIST: - if (loader::context->ze_command_list_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->CommandList->pfnCreate == + loader::loaderDispatch->pCore->CommandList->pfnCreate); + if (legacy_ldr_intercept_enabled && loader::context->ze_command_list_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_FENCE: - if (loader::context->ze_fence_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->Fence->pfnCreate == + loader::loaderDispatch->pCore->Fence->pfnCreate); + if (legacy_ldr_intercept_enabled && loader::context->ze_fence_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_EVENT_POOL: - if (loader::context->ze_event_pool_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->EventPool->pfnCreate == + loader::loaderDispatch->pCore->EventPool->pfnCreate); + if (legacy_ldr_intercept_enabled && loader::context->ze_event_pool_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_EVENT: - if (loader::context->ze_event_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->Event->pfnCreate == + loader::loaderDispatch->pCore->Event->pfnCreate); + if (legacy_ldr_intercept_enabled && loader::context->ze_event_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_IMAGE: - if (loader::context->ze_image_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->Image->pfnCreate == + loader::loaderDispatch->pCore->Image->pfnCreate); + if (legacy_ldr_intercept_enabled && loader::context->ze_image_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_MODULE: - if (loader::context->ze_module_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->Module->pfnCreate == + loader::loaderDispatch->pCore->Module->pfnCreate); + if (legacy_ldr_intercept_enabled && loader::context->ze_module_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_MODULE_BUILD_LOG: - if (loader::context->ze_module_build_log_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->ModuleBuildLog->pfnGetString == + loader::loaderDispatch->pCore->ModuleBuildLog->pfnGetString); + if (legacy_ldr_intercept_enabled && loader::context->ze_module_build_log_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_KERNEL: - if (loader::context->ze_kernel_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->Kernel->pfnCreate == + loader::loaderDispatch->pCore->Kernel->pfnCreate); + if (legacy_ldr_intercept_enabled && loader::context->ze_kernel_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_SAMPLER: - if (loader::context->ze_sampler_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->Sampler->pfnCreate == + loader::loaderDispatch->pCore->Sampler->pfnCreate); + if (legacy_ldr_intercept_enabled && loader::context->ze_sampler_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } case ZEL_HANDLE_PHYSICAL_MEM: - if (loader::context->ze_physical_mem_factory.hasInstance(reinterpret_cast(handleIn)->handle)) { - *handleOut = reinterpret_cast( handleIn )->handle; + { + bool legacy_ldr_intercept_enabled = (!loader::context->driverDDIPathDefault) || + (reinterpret_cast(handleIn)->pCore->PhysicalMem->pfnCreate == + loader::loaderDispatch->pCore->PhysicalMem->pfnCreate); + if (legacy_ldr_intercept_enabled && loader::context->ze_physical_mem_factory.hasInstance(reinterpret_cast(handleIn)->handle)) + { + *handleOut = reinterpret_cast(handleIn)->handle; } break; + } default: return ZE_RESULT_ERROR_INVALID_ENUMERATION; - } - + } + + return ZE_RESULT_SUCCESS; } #if defined(__cplusplus) } -#endif \ No newline at end of file +#endif