/* * Copyright (C) 2019-2023 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/source/command_stream/task_count_helper.h" #include "shared/source/helpers/device_bitfield.h" #include #include #include #include #include #include namespace NEO { class MemoryManager; class CommandStreamReceiver; class Thread; using SteadyClock = std::chrono::steady_clock; class DirectSubmissionController { public: static constexpr size_t defaultTimeout = 5'000; DirectSubmissionController(); virtual ~DirectSubmissionController(); void registerDirectSubmission(CommandStreamReceiver *csr); void unregisterDirectSubmission(CommandStreamReceiver *csr); void startControlling(); static bool isSupported(); protected: struct DirectSubmissionState { bool isStopped = true; TaskCountType taskCount = 0u; }; static void *controlDirectSubmissionsState(void *self); void checkNewSubmissions(); MOCKABLE_VIRTUAL void sleep(); MOCKABLE_VIRTUAL SteadyClock::time_point getCpuTimestamp(); void adjustTimeout(CommandStreamReceiver *csr); void recalculateTimeout(); uint32_t maxCcsCount = 1u; std::array ccsCount = {}; std::unordered_map directSubmissions; std::mutex directSubmissionsMutex; std::unique_ptr directSubmissionControllingThread; std::atomic_bool keepControlling = true; std::atomic_bool runControlling = false; SteadyClock::time_point lastTerminateCpuTimestamp{}; std::chrono::microseconds maxTimeout{defaultTimeout}; std::chrono::microseconds timeout{defaultTimeout}; int timeoutDivisor = 1; }; } // namespace NEO