[client] imgui: added imgui to the client and OpenGL/EGL renderers

This commit is contained in:
Geoffrey McRae 2021-07-08 11:45:54 +10:00
parent c9d469fb91
commit f08163fd72
10 changed files with 102 additions and 4 deletions

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
project(looking-glass-client C) project(looking-glass-client C CXX)
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/") list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/")
@ -127,12 +127,16 @@ set(SOURCES
add_subdirectory("${PROJECT_TOP}/common" "${CMAKE_BINARY_DIR}/common" ) add_subdirectory("${PROJECT_TOP}/common" "${CMAKE_BINARY_DIR}/common" )
add_subdirectory("${PROJECT_TOP}/repos/LGMP/lgmp" "${CMAKE_BINARY_DIR}/LGMP" ) add_subdirectory("${PROJECT_TOP}/repos/LGMP/lgmp" "${CMAKE_BINARY_DIR}/LGMP" )
add_subdirectory("${PROJECT_TOP}/repos/PureSpice" "${CMAKE_BINARY_DIR}/PureSpice") add_subdirectory("${PROJECT_TOP}/repos/PureSpice" "${CMAKE_BINARY_DIR}/PureSpice")
add_subdirectory("${PROJECT_TOP}/repos/cimgui" "${CMAKE_BINARY_DIR}/cimgui" )
add_subdirectory(displayservers) add_subdirectory(displayservers)
add_subdirectory(renderers) add_subdirectory(renderers)
add_subdirectory(fonts) add_subdirectory(fonts)
add_executable(looking-glass-client ${SOURCES}) add_executable(looking-glass-client ${SOURCES})
target_compile_definitions(looking-glass-client PRIVATE CIMGUI_DEFINE_ENUMS_AND_STRUCTS=1)
target_link_libraries(looking-glass-client target_link_libraries(looking-glass-client
${EXE_FLAGS} ${EXE_FLAGS}
lg_common lg_common
@ -141,6 +145,7 @@ target_link_libraries(looking-glass-client
purespice purespice
renderers renderers
fonts fonts
cimgui
) )
install(TARGETS looking-glass-client install(TARGETS looking-glass-client

View File

@ -78,6 +78,8 @@ void app_glSetSwapInterval(int interval);
void app_glSwapBuffers(void); void app_glSwapBuffers(void);
#endif #endif
bool app_renderImGui(void);
void app_clipboardRelease(void); void app_clipboardRelease(void);
void app_clipboardNotifyTypes(const LG_ClipboardData types[], int count); void app_clipboardNotifyTypes(const LG_ClipboardData types[], int count);
void app_clipboardNotifySize(const LG_ClipboardData type, size_t size); void app_clipboardNotifySize(const LG_ClipboardData type, size_t size);

View File

@ -25,6 +25,9 @@
#include <EGL/egl.h> #include <EGL/egl.h>
#include <GL/gl.h> #include <GL/gl.h>
// if GLEW is included, GLeglImageOES was not defined
typedef void * GLeglImageOES;
typedef EGLDisplay (*eglGetPlatformDisplayEXT_t)(EGLenum platform, typedef EGLDisplay (*eglGetPlatformDisplayEXT_t)(EGLenum platform,
void *native_display, const EGLint *attrib_list); void *native_display, const EGLint *attrib_list);
typedef void (*eglSwapBuffersWithDamageKHR_t)(EGLDisplay dpy, typedef void (*eglSwapBuffersWithDamageKHR_t)(EGLDisplay dpy,

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
project(renderer_EGL LANGUAGES C) project(renderer_EGL LANGUAGES C CXX)
find_package(PkgConfig) find_package(PkgConfig)
pkg_check_modules(RENDERER_EGL_PKGCONFIG REQUIRED pkg_check_modules(RENDERER_EGL_PKGCONFIG REQUIRED
@ -54,13 +54,19 @@ add_library(renderer_EGL STATIC
alert.c alert.c
${EGL_SHADER_OBJS} ${EGL_SHADER_OBJS}
"${EGL_SHADER_INCS}/desktop_rgb.def.h" "${EGL_SHADER_INCS}/desktop_rgb.def.h"
${PROJECT_TOP}/repos/cimgui/imgui/backends/imgui_impl_opengl3.cpp
) )
target_compile_definitions(renderer_EGL PRIVATE CIMGUI_DEFINE_ENUMS_AND_STRUCTS=1)
target_link_libraries(renderer_EGL target_link_libraries(renderer_EGL
${RENDERER_EGL_PKGCONFIG_LIBRARIES} ${RENDERER_EGL_PKGCONFIG_LIBRARIES}
${RENDERER_EGL_OPT_PKGCONFIG_LIBRARIES} ${RENDERER_EGL_OPT_PKGCONFIG_LIBRARIES}
lg_common lg_common
fonts fonts
cimgui
GLEW
) )
target_include_directories(renderer_EGL target_include_directories(renderer_EGL

View File

@ -25,11 +25,16 @@
#include "common/sysinfo.h" #include "common/sysinfo.h"
#include "common/time.h" #include "common/time.h"
#include "common/locking.h" #include "common/locking.h"
#include "app.h"
#include "util.h" #include "util.h"
#include "dynamic/fonts.h" #include "dynamic/fonts.h"
#include <GL/glew.h>
#include <EGL/egl.h> #include <EGL/egl.h>
#include "cimgui.h"
#include "generator/output/cimgui_impl.h"
#include <assert.h> #include <assert.h>
#include <math.h> #include <math.h>
#include <string.h> #include <string.h>
@ -72,6 +77,7 @@ struct Inst
EGL_Splash * splash; // the splash screen EGL_Splash * splash; // the splash screen
EGL_Alert * alert; // the alert display EGL_Alert * alert; // the alert display
EGL_Help * help; // the help display EGL_Help * help; // the help display
bool imgui; // if imgui was initialized
LG_RendererFormat format; LG_RendererFormat format;
bool formatValid; bool formatValid;
@ -279,6 +285,9 @@ void egl_deinitialize(void * opaque)
{ {
struct Inst * this = (struct Inst *)opaque; struct Inst * this = (struct Inst *)opaque;
if (this->imgui)
ImGui_ImplOpenGL3_Shutdown();
if (this->font) if (this->font)
{ {
if (this->fontObj) if (this->fontObj)
@ -288,7 +297,6 @@ void egl_deinitialize(void * opaque)
this->font->destroy(this->helpFontObj); this->font->destroy(this->helpFontObj);
} }
egl_desktop_free(&this->desktop); egl_desktop_free(&this->desktop);
egl_cursor_free (&this->cursor); egl_cursor_free (&this->cursor);
egl_fps_free (&this->fps ); egl_fps_free (&this->fps );
@ -766,6 +774,20 @@ bool egl_render_startup(void * opaque)
return false; return false;
} }
// glew is needed for imgui
if (!glewInit())
{
DEBUG_ERROR("GLEW failed to initialize");
return false;
}
if (!ImGui_ImplOpenGL3_Init("#version 100"))
{
DEBUG_ERROR("Failed to initialize ImGui");
return false;
}
this->imgui = true;
return true; return true;
} }
@ -866,6 +888,13 @@ bool egl_render(void * opaque, LG_RendererRotate rotate)
egl_fps_render(this->fps, this->screenScaleX, this->screenScaleY); egl_fps_render(this->fps, this->screenScaleX, this->screenScaleY);
egl_help_render(this->help, this->screenScaleX, this->screenScaleY); egl_help_render(this->help, this->screenScaleX, this->screenScaleY);
if (app_renderImGui())
{
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplOpenGL3_RenderDrawData(igGetDrawData());
}
app_eglSwapBuffers(this->display, this->surface, damage, damageIdx); app_eglSwapBuffers(this->display, this->surface, damage, damageIdx);
return true; return true;
} }

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
project(renderer_Opengl LANGUAGES C) project(renderer_Opengl LANGUAGES C CXX)
find_package(PkgConfig) find_package(PkgConfig)
pkg_check_modules(RENDERER_OPENGL_PKGCONFIG REQUIRED pkg_check_modules(RENDERER_OPENGL_PKGCONFIG REQUIRED
@ -8,12 +8,17 @@ pkg_check_modules(RENDERER_OPENGL_PKGCONFIG REQUIRED
add_library(renderer_OpenGL STATIC add_library(renderer_OpenGL STATIC
opengl.c opengl.c
${PROJECT_TOP}/repos/cimgui/imgui/backends/imgui_impl_opengl2.cpp
) )
target_compile_definitions(renderer_OpenGL PRIVATE CIMGUI_DEFINE_ENUMS_AND_STRUCTS=1)
target_link_libraries(renderer_OpenGL target_link_libraries(renderer_OpenGL
${RENDERER_OPENGL_PKGCONFIG_LIBRARIES} ${RENDERER_OPENGL_PKGCONFIG_LIBRARIES}
lg_common lg_common
fonts fonts
cimgui
) )
target_include_directories(renderer_OpenGL target_include_directories(renderer_OpenGL

View File

@ -29,6 +29,9 @@
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glx.h> #include <GL/glx.h>
#include "cimgui.h"
#include "generator/output/cimgui_impl.h"
#include "common/debug.h" #include "common/debug.h"
#include "common/option.h" #include "common/option.h"
#include "common/framebuffer.h" #include "common/framebuffer.h"
@ -272,6 +275,8 @@ void opengl_deinitialize(void * opaque)
if (this->renderStarted) if (this->renderStarted)
{ {
ImGui_ImplOpenGL2_Shutdown();
glDeleteLists(this->texList , BUFFER_COUNT); glDeleteLists(this->texList , BUFFER_COUNT);
glDeleteLists(this->mouseList, 1); glDeleteLists(this->mouseList, 1);
glDeleteLists(this->fpsList , 1); glDeleteLists(this->fpsList , 1);
@ -581,6 +586,13 @@ bool opengl_render_startup(void * opaque)
this->hasTextures = true; this->hasTextures = true;
app_glSetSwapInterval(this->opt.vsync ? 1 : 0); app_glSetSwapInterval(this->opt.vsync ? 1 : 0);
if (!ImGui_ImplOpenGL2_Init())
{
DEBUG_ERROR("Failed to initialize ImGui");
return false;
}
this->renderStarted = true; this->renderStarted = true;
return true; return true;
} }
@ -690,6 +702,12 @@ bool opengl_render(void * opaque, LG_RendererRotate rotate)
break; break;
} }
if (app_renderImGui())
{
ImGui_ImplOpenGL2_NewFrame();
ImGui_ImplOpenGL2_RenderDrawData(igGetDrawData());
}
if (this->opt.preventBuffer) if (this->opt.preventBuffer)
{ {
app_glSwapBuffers(); app_glSwapBuffers();

View File

@ -31,6 +31,8 @@
#include "common/debug.h" #include "common/debug.h"
#include "common/stringutils.h" #include "common/stringutils.h"
#include "cimgui.h"
#include <stdarg.h> #include <stdarg.h>
#include <math.h> #include <math.h>
#include <string.h> #include <string.h>
@ -617,3 +619,11 @@ void app_showFPS(bool showFPS)
g_state.lgr->on_show_fps(g_state.lgrData, showFPS); g_state.lgr->on_show_fps(g_state.lgrData, showFPS);
} }
bool app_renderImGui(void)
{
igNewFrame();
igShowDemoWindow(NULL);
igRender();
return true;
}

View File

@ -56,6 +56,8 @@
#include "ll.h" #include "ll.h"
#include "egl_dynprocs.h" #include "egl_dynprocs.h"
#include "cimgui.h"
// forwards // forwards
static int cursorThread(void * unused); static int cursorThread(void * unused);
static int renderThread(void * unused); static int renderThread(void * unused);
@ -97,12 +99,21 @@ static void lgInit(void)
static int renderThread(void * unused) static int renderThread(void * unused)
{ {
/* setup imgui */
igCreateContext(NULL);
ImGuiIO * io = igGetIO();
unsigned char *text_pixels = NULL;
int text_w, text_h;
ImFontAtlas_GetTexDataAsRGBA32(io->Fonts, &text_pixels,
&text_w, &text_h, NULL);
if (!g_state.lgr->render_startup(g_state.lgrData)) if (!g_state.lgr->render_startup(g_state.lgrData))
{ {
g_state.state = APP_STATE_SHUTDOWN; g_state.state = APP_STATE_SHUTDOWN;
/* unblock threads waiting on the condition */ /* unblock threads waiting on the condition */
lgSignalEvent(e_startup); lgSignalEvent(e_startup);
igDestroyContext(NULL);
return 1; return 1;
} }
@ -128,6 +139,13 @@ static int renderThread(void * unused)
int resize = atomic_load(&g_state.lgrResize); int resize = atomic_load(&g_state.lgrResize);
if (resize) if (resize)
{ {
const ImVec2 displaySize =
{
.x = g_state.windowW,
.y = g_state.windowH
};
io->DisplaySize = displaySize;
if (g_state.lgr) if (g_state.lgr)
g_state.lgr->on_resize(g_state.lgrData, g_state.windowW, g_state.windowH, g_state.lgr->on_resize(g_state.lgrData, g_state.windowW, g_state.windowH,
g_state.windowScale, g_state.dstRect, g_params.winRotate); g_state.windowScale, g_state.dstRect, g_params.winRotate);
@ -193,6 +211,7 @@ static int renderThread(void * unused)
g_state.lgr = NULL; g_state.lgr = NULL;
LG_LOCK_FREE(g_state.lgrLock); LG_LOCK_FREE(g_state.lgrLock);
igDestroyContext(NULL);
return 0; return 0;
} }

View File

@ -57,6 +57,7 @@ Required Dependencies
- fonts-freefont-ttf - fonts-freefont-ttf
- libegl-dev - libegl-dev
- libgl-dev - libgl-dev
- libglew-dev
- libfontconfig1-dev - libfontconfig1-dev
- libgmp-dev - libgmp-dev
- libspice-protocol-dev - libspice-protocol-dev