client egl context and viewport in kotlin UI
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user