64 lines
1.9 KiB
C++
64 lines
1.9 KiB
C++
#include "kernel.h"
|
|
#include "egl_context.h"
|
|
#include "render_target.h"
|
|
#include "logger.h"
|
|
#include "aidl/com/omixlab/mosis/IMosisListener.h"
|
|
#include <android/hardware_buffer.h>
|
|
|
|
using namespace aidl::com::omixlab::mosis;
|
|
using namespace aidl::android::hardware;
|
|
|
|
void Kernel::main_loop()
|
|
{
|
|
m_egl_context = std::make_unique<egl::Context>();
|
|
if (!m_egl_context->create())
|
|
{
|
|
Logger::Log("failed to create EGL context");
|
|
return;
|
|
}
|
|
m_render_target = std::make_unique<RenderTarget>();
|
|
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<HardwareBuffer>();
|
|
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<IMosisListener> &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<IMosisListener> &listener)
|
|
{
|
|
std::lock_guard _lock(m_mutex);
|
|
m_listeners.emplace(AIBinder_getCallingPid(), listener);
|
|
listener->onServiceInitialized(true);
|
|
listener->onBufferAvailable(*m_aidl_buffer);
|
|
}
|
|
|
|
Kernel::~Kernel() = default;
|