client egl context and viewport in kotlin UI

This commit is contained in:
2025-12-28 21:46:18 +01:00
parent 19400fd2b2
commit 6830c61e31
5 changed files with 175 additions and 15 deletions

View File

@@ -1,11 +1,61 @@
#include <jni.h>
#include <android/binder_ibinder_jni.h>
#include <aidl/com/omixlab/mosis/IMosisService.h>
#include <android/native_window_jni.h>
#include "logger.h"
#include "egl_context.h"
#include <glad/gles2.h>
#include <memory>
#include <thread>
using namespace aidl::com::omixlab::mosis;
class Renderer
{
std::unique_ptr<egl::Context> m_egl_context;
std::thread m_render_loop;
bool m_active = false;
void render_loop(ANativeWindow* window)
{
m_egl_context = std::make_unique<egl::Context>();
if (m_egl_context->create(window))
{
m_active = true;
while (m_active)
{
render_frame();
}
}
else
{
Logger::Log("Failed to create EGL context");
}
}
void render_frame()
{
glClearColor(0.f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
m_egl_context->swap();
}
public:
bool create(ANativeWindow* window)
{
m_render_loop = std::thread(&Renderer::render_loop, this, window);
return true;
}
void destroy()
{
m_active = false;
if (m_render_loop.joinable())
m_render_loop.join();
m_egl_context->destroy();
m_egl_context.reset();
}
};
std::shared_ptr<IMosisService> g_service;
std::unique_ptr<Renderer> g_renderer;
extern "C"
JNIEXPORT void JNICALL
Java_com_omixlab_mosis_MainActivity_serviceConnected(JNIEnv *env, jobject thiz, jobject binder) {
@@ -14,3 +64,23 @@ Java_com_omixlab_mosis_MainActivity_serviceConnected(JNIEnv *env, jobject thiz,
g_service = IMosisService::fromBinder(spBinder);
Logger::Log("Service Connected");
}
extern "C"
JNIEXPORT void JNICALL
Java_com_omixlab_mosis_MainActivity_setSurface(JNIEnv *env, jobject thiz, jobject surface) {
Logger::Log("setSurface");
if (!g_renderer)
{
g_renderer = std::make_unique<Renderer>();
g_renderer->create(ANativeWindow_fromSurface(env, surface));
}
}
extern "C"
JNIEXPORT void JNICALL
Java_com_omixlab_mosis_MainActivity_destroySurface(JNIEnv *env, jobject thiz) {
Logger::Log("destroySurface");
if (g_renderer)
{
g_renderer->destroy();
}
}