#include "kernel.h" #include "egl_context.h" #include "render_target.h" #include "logger.h" #include "aidl/com/omixlab/mosis/IMosisListener.h" #include using namespace aidl::com::omixlab::mosis; using namespace aidl::android::hardware; void Kernel::main_loop() { m_egl_context = std::make_unique(); if (!m_egl_context->create()) { Logger::Log("failed to create EGL context"); return; } m_render_target = std::make_unique(); if (!m_render_target->create_exported(1024, 1024)) { Logger::Log("failed to create render target"); return; } m_render_target->bind(); for (const auto& [pid, l] : m_listeners) l->onServiceInitialized(true); m_aidl_buffer = std::make_unique(); m_aidl_buffer->reset(m_render_target->hardware_buffer()); for (const auto& [pid, l] : m_listeners) l->onBufferAvailable(*m_aidl_buffer); while (true) { static float angle = 0.0f; angle += 0.1f; glClearColor(fabs(sin(angle)), 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glFinish(); { std::lock_guard _lock(m_mutex); for (const auto& [pid, l] : m_listeners) l->onFrameAvailable(); } std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } Kernel::Kernel(const std::shared_ptr &listener) { m_listeners.emplace(AIBinder_getCallingPid(), listener); m_main_loop_thread = std::thread(&Kernel::main_loop, this); } void Kernel::add_listener(const std::shared_ptr &listener) { std::lock_guard _lock(m_mutex); m_listeners.emplace(AIBinder_getCallingPid(), listener); listener->onServiceInitialized(true); listener->onBufferAvailable(*m_aidl_buffer); } Kernel::~Kernel() = default;