From f3a69571a2b4f2c4abbfc42fcf91225cdc508d3d Mon Sep 17 00:00:00 2001 From: omigamedev Date: Tue, 30 Dec 2025 19:05:02 +0100 Subject: [PATCH] more refactoring --- src/main/cpp/CMakeLists.txt | 4 + src/main/cpp/kernel.cpp | 46 ++++++++++++ src/main/cpp/kernel.h | 22 ++++++ src/main/cpp/mosis-service.cpp | 132 +-------------------------------- src/main/cpp/render_target.cpp | 89 ++++++++++++++++++++++ src/main/cpp/render_target.h | 17 +++++ 6 files changed, 179 insertions(+), 131 deletions(-) create mode 100644 src/main/cpp/kernel.cpp create mode 100644 src/main/cpp/kernel.h create mode 100644 src/main/cpp/render_target.cpp create mode 100644 src/main/cpp/render_target.h diff --git a/src/main/cpp/CMakeLists.txt b/src/main/cpp/CMakeLists.txt index c00f457..deb7c9d 100644 --- a/src/main/cpp/CMakeLists.txt +++ b/src/main/cpp/CMakeLists.txt @@ -16,7 +16,9 @@ add_library(mosis-service SHARED external_texture.cpp quad.cpp egl_context.cpp + render_target.cpp logger.cpp + kernel.cpp glad/src/egl.c glad/src/gles2.c) target_include_directories(mosis-service PUBLIC @@ -33,6 +35,8 @@ add_library(mosis-test SHARED external_texture.cpp quad.cpp egl_context.cpp + render_target.cpp + kernel.cpp logger.cpp glad/src/egl.c glad/src/gles2.c) diff --git a/src/main/cpp/kernel.cpp b/src/main/cpp/kernel.cpp new file mode 100644 index 0000000..3a800c5 --- /dev/null +++ b/src/main/cpp/kernel.cpp @@ -0,0 +1,46 @@ +#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(); + m_listener->onServiceInitialized(true); + m_aidl_buffer = std::make_unique(); + m_aidl_buffer->reset(m_render_target->hardware_buffer()); + m_listener->onBufferAvailable(*m_aidl_buffer); + + while (true) + { + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glFinish(); + m_listener->onFrameAvailable(); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } +} + +Kernel::Kernel(const std::shared_ptr &listener) : m_listener(listener) +{ + m_main_loop_thread = std::thread(&Kernel::main_loop, this); +} + +Kernel::~Kernel() = default; diff --git a/src/main/cpp/kernel.h b/src/main/cpp/kernel.h new file mode 100644 index 0000000..0dda105 --- /dev/null +++ b/src/main/cpp/kernel.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +class RenderTarget; +namespace egl { class Context; } +namespace aidl::com::omixlab::mosis { class IMosisListener; } +namespace aidl::android::hardware { struct HardwareBuffer; } + +class Kernel +{ + std::unique_ptr m_egl_context; + std::unique_ptr m_render_target; + std::shared_ptr m_listener; + std::unique_ptr m_aidl_buffer; + std::thread m_main_loop_thread; + void main_loop(); +public: + explicit Kernel(const std::shared_ptr& listener); + virtual ~Kernel(); +}; diff --git a/src/main/cpp/mosis-service.cpp b/src/main/cpp/mosis-service.cpp index ee900ed..02d4bb9 100644 --- a/src/main/cpp/mosis-service.cpp +++ b/src/main/cpp/mosis-service.cpp @@ -4,8 +4,8 @@ #include #include #include -#include "egl_context.h" #include "logger.h" +#include "kernel.h" #include #include #include @@ -24,136 +24,6 @@ public: } }; -class RenderTarget -{ - AHardwareBuffer* hardwareBuffer = nullptr; - GLuint m_framebuffer = 0; - GLuint texture = 0; -public: - bool create(uint32_t width, uint32_t height) - { - glGenFramebuffers(1, &m_framebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); - - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); - - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - return false; - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - return true; - } - bool create_exported(uint32_t width, uint32_t height) - { - AHardwareBuffer_Desc desc = {}; - desc.width = width; - desc.height = height; - desc.layers = 1; - desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; - desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | - AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER | - AHARDWAREBUFFER_USAGE_CPU_READ_NEVER | - AHARDWAREBUFFER_USAGE_CPU_WRITE_NEVER; - - if (AHardwareBuffer_allocate(&desc, &hardwareBuffer) != 0) - { - Logger::Log("Failed to allocate hardware buffer"); - return false; - } - - EGLClientBuffer clientBuffer = eglGetNativeClientBufferANDROID(hardwareBuffer); - EGLImageKHR eglImage = eglCreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT, - EGL_NATIVE_BUFFER_ANDROID, clientBuffer, nullptr); - - if (eglImage == EGL_NO_IMAGE_KHR) - { - AHardwareBuffer_release(hardwareBuffer); - Logger::Log("Failed to create EGL image"); - return false; - } - - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eglImage); - - eglDestroyImageKHR(eglGetCurrentDisplay(), eglImage); - - glGenFramebuffers(1, &m_framebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); - - bool status = (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - return status; - } - [[nodiscard]] AHardwareBuffer* hardware_buffer() - { - return hardwareBuffer; - } - void bind() - { - glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); - } - void unbind() - { - glBindFramebuffer(GL_FRAMEBUFFER, 0); - } - void destroy() - { - glDeleteTextures(1, &texture); - glDeleteFramebuffers(1, &m_framebuffer); - } -}; - -class Kernel -{ - std::unique_ptr m_egl_context; - std::unique_ptr m_render_target; - std::shared_ptr m_listener; - HardwareBuffer m_aidl_buffer; - std::thread m_main_loop_thread; - void 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(); - m_listener->onServiceInitialized(true); - m_aidl_buffer.reset(m_render_target->hardware_buffer()); - m_listener->onBufferAvailable(m_aidl_buffer); - - while (true) - { - glClearColor(1.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - glFinish(); - m_listener->onFrameAvailable(); - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - } - } -public: - Kernel(const std::shared_ptr& listener) : m_listener(listener) - { - m_main_loop_thread = std::thread(&Kernel::main_loop, this); - } -}; - class NativeService : public BnMosisService { std::unique_ptr m_kernel; diff --git a/src/main/cpp/render_target.cpp b/src/main/cpp/render_target.cpp new file mode 100644 index 0000000..492036a --- /dev/null +++ b/src/main/cpp/render_target.cpp @@ -0,0 +1,89 @@ +#include "render_target.h" +#include +#include +#include "logger.h" +bool RenderTarget::create(uint32_t width, uint32_t height) +{ + glGenFramebuffers(1, &m_framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); + + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + return false; + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + return true; +} + +bool RenderTarget::create_exported(uint32_t width, uint32_t height) +{ + AHardwareBuffer_Desc desc = {}; + desc.width = width; + desc.height = height; + desc.layers = 1; + desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; + desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | + AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER | + AHARDWAREBUFFER_USAGE_CPU_READ_NEVER | + AHARDWAREBUFFER_USAGE_CPU_WRITE_NEVER; + + if (AHardwareBuffer_allocate(&desc, &hardwareBuffer) != 0) + { + Logger::Log("Failed to allocate hardware buffer"); + return false; + } + + EGLClientBuffer clientBuffer = eglGetNativeClientBufferANDROID(hardwareBuffer); + EGLImageKHR eglImage = eglCreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT, + EGL_NATIVE_BUFFER_ANDROID, clientBuffer, nullptr); + + if (eglImage == EGL_NO_IMAGE_KHR) + { + AHardwareBuffer_release(hardwareBuffer); + Logger::Log("Failed to create EGL image"); + return false; + } + + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eglImage); + + eglDestroyImageKHR(eglGetCurrentDisplay(), eglImage); + + glGenFramebuffers(1, &m_framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); + + bool status = (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + return status; +} + +AHardwareBuffer *RenderTarget::hardware_buffer() +{ + return hardwareBuffer; +} + +void RenderTarget::bind() +{ + glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); +} + +void RenderTarget::unbind() +{ + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + +void RenderTarget::destroy() +{ + glDeleteTextures(1, &texture); + glDeleteFramebuffers(1, &m_framebuffer); +} diff --git a/src/main/cpp/render_target.h b/src/main/cpp/render_target.h new file mode 100644 index 0000000..91845aa --- /dev/null +++ b/src/main/cpp/render_target.h @@ -0,0 +1,17 @@ +#pragma once +#include +struct AHardwareBuffer; + +class RenderTarget +{ + AHardwareBuffer* hardwareBuffer = nullptr; + GLuint m_framebuffer = 0; + GLuint texture = 0; +public: + bool create(uint32_t width, uint32_t height); + bool create_exported(uint32_t width, uint32_t height); + [[nodiscard]] AHardwareBuffer* hardware_buffer(); + void bind(); + void unbind(); + void destroy(); +};