// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include #include #include #include #include #include #include namespace rocRoller { namespace Scheduling { /** * @brief Create a MetaObserver object * * This function builds a MetaObserver out of all observers that are required for the given context. * * @param ctx * @return std::shared_ptr */ std::shared_ptr createObserver(ContextPtr const& ctx); template struct PotentialObservers { }; template std::shared_ptr createMetaObserverFiltered( ContextPtr const& ctx, const PotentialObservers<>&, const Done&... observers) { using MyObserver = Scheduling::MetaObserver; std::tuple constructedObservers = {observers...}; return std::make_shared(constructedObservers); } template std::shared_ptr createMetaObserverFiltered(ContextPtr const& ctx, const PotentialObservers&, const Done&... observers) { static_assert( CObserverRuntime< Current> || CObserverRuntimeWithContext || CObserverConst); PotentialObservers remaining; if constexpr(CObserverConst) { if constexpr(Current::required(Target)) { Current obs(ctx); return createMetaObserverFiltered(ctx, remaining, observers..., obs); } else { return createMetaObserverFiltered(ctx, remaining, observers...); } } else if constexpr(CObserverRuntimeWithContext) { if(Current::runtimeRequired(ctx)) { Current obs(ctx); return createMetaObserverFiltered(ctx, remaining, observers..., obs); } else { return createMetaObserverFiltered(ctx, remaining, observers...); } } else { if(Current::runtimeRequired()) { Current obs(ctx); return createMetaObserverFiltered(ctx, remaining, observers..., obs); } else { return createMetaObserverFiltered(ctx, remaining, observers...); } } } template std::shared_ptr createMetaObserver(ContextPtr const& ctx, const PotentialObservers& potentialObservers) { if constexpr(Idx < SupportedArchitectures.size()) { constexpr auto Target = SupportedArchitectures.at(Idx); if(ctx->targetArchitecture().target() == Target) { return createMetaObserverFiltered(ctx, potentialObservers); } return createMetaObserver(ctx, potentialObservers); } Throw("Unsupported Architecture", ShowValue(ctx->targetArchitecture().target())); } } }