rpcsx/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h
2022-03-23 11:26:06 +03:00

62 lines
1.6 KiB
C++

#pragma once
#include "vkutils/commands.h"
#include "vkutils/sync.h"
#include "Utilities/Thread.h"
#define VK_MAX_ASYNC_COMPUTE_QUEUES 256
namespace vk
{
class AsyncTaskScheduler
{
// Vulkan resources
std::vector<command_buffer> m_async_command_queue;
command_pool m_command_pool;
// Running state
command_buffer* m_last_used_cb = nullptr;
command_buffer* m_current_cb = nullptr;
usz m_next_cb_index = 0;
atomic_t<u64> m_submit_count = 0;
// Scheduler
shared_mutex m_config_mutex;
bool m_options_initialized = false;
bool m_use_host_scheduler = false;
// Sync
event* m_sync_label = nullptr;
atomic_t<bool> m_sync_required = false;
static constexpr u32 events_pool_size = 16384;
std::vector<std::unique_ptr<vk::event>> m_events_pool;
atomic_t<u64> m_next_event_id = 0;
std::vector<std::unique_ptr<vk::semaphore>> m_semaphore_pool;
atomic_t<u64> m_next_semaphore_id = 0;
shared_mutex m_submit_mutex;
void init_config_options(vk_gpu_scheduler_mode mode);
void delayed_init();
void insert_sync_event();
public:
AsyncTaskScheduler(vk_gpu_scheduler_mode mode); // This ctor stops default initialization by fxo
~AsyncTaskScheduler();
command_buffer* get_current();
event* get_primary_sync_label();
semaphore* get_sema();
void flush(queue_submit_t& submit_info, VkBool32 force_flush);
void destroy();
// Inline getters
inline bool is_recording() const { return m_current_cb != nullptr; }
inline bool is_host_mode() const { return m_use_host_scheduler; }
};
}