feat(Ubuntu):Add Ubuntu compile and run/debug logic.
This commit is contained in:
@@ -16,7 +16,7 @@ else
|
|||||||
CFLAGS += -O3 -fexpensive-optimizations
|
CFLAGS += -O3 -fexpensive-optimizations
|
||||||
endif
|
endif
|
||||||
|
|
||||||
DEPS = -lpthread -lEGL -lGLESv2 -ldrm -lgbm -lfreetype -lcjson -ljpeg -lm -ldl -Wl,--library-path=$(TARGET_PATH_LIB),-rpath-link=$(TARGET_PATH_LIB)
|
DEPS = -lX11 -lpthread -lEGL -lGLESv2 -ldrm -lgbm -lfreetype -lcjson -ljpeg -lm -ldl -Wl,--library-path=$(TARGET_PATH_LIB),-rpath-link=$(TARGET_PATH_LIB)
|
||||||
## DEPS += /home/lst/workspace/jpeg/jpeg-9c/install/lib/libjpeg.a
|
## DEPS += /home/lst/workspace/jpeg/jpeg-9c/install/lib/libjpeg.a
|
||||||
#DEPS += /home/user/zhimin/clusterApp/3psw/jpegsr9c/jpeg-9c/libjpeg.a
|
#DEPS += /home/user/zhimin/clusterApp/3psw/jpegsr9c/jpeg-9c/libjpeg.a
|
||||||
#DEPS += /home/user/zhimin/packages/install/lib/libcjson.a
|
#DEPS += /home/user/zhimin/packages/install/lib/libcjson.a
|
||||||
@@ -42,7 +42,7 @@ CFLAGS += -Iinclude \
|
|||||||
-I/home/lst/workspace/zlib/zlib_build/ \
|
-I/home/lst/workspace/zlib/zlib_build/ \
|
||||||
-I/home/lst/workspace/libpng/libpng_build/ \
|
-I/home/lst/workspace/libpng/libpng_build/ \
|
||||||
-I/home/user/zhimin/clusterApp/3psw/source_packages/build_install/ \
|
-I/home/user/zhimin/clusterApp/3psw/source_packages/build_install/ \
|
||||||
-I/home/huaxu/develop/cluster/clusterApp_ubuntu/3psw/lpng1634 \
|
-I/home/huaxu/develop/cluster/clusterAppUbuntu/3psw/lpng1634 \
|
||||||
-I/home/user/zhimin/clusterApp/3psw/source_packages/freetype-2.13.2/ \
|
-I/home/user/zhimin/clusterApp/3psw/source_packages/freetype-2.13.2/ \
|
||||||
-I/home/huaxu/develop/ICM-SOFT/D20/icm-code/cpu/app/insDavi2.0/3psw/freetype-2.9_MinGW/include/freetype2/ \
|
-I/home/huaxu/develop/ICM-SOFT/D20/icm-code/cpu/app/insDavi2.0/3psw/freetype-2.9_MinGW/include/freetype2/ \
|
||||||
-I/usr/include/GL/ \
|
-I/usr/include/GL/ \
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#ifndef COMPILE_IN_UBUNTU
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
@@ -867,3 +869,210 @@ void DeInitGL()
|
|||||||
}
|
}
|
||||||
#endif // COMPILE_IN_WINDOWS
|
#endif // COMPILE_IN_WINDOWS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else // UBUNUT 平台,使用 X11 + EGL
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xutil.h>
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
#include <GLES2/gl2.h>
|
||||||
|
#include <GLES2/gl2ext.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "BaseTypes.h"
|
||||||
|
|
||||||
|
static Display *x_display = NULL;
|
||||||
|
static Window x_window;
|
||||||
|
static EGLDisplay egl_dpy = EGL_NO_DISPLAY;
|
||||||
|
static EGLSurface egl_surf = EGL_NO_SURFACE;
|
||||||
|
static EGLContext egl_ctx = EGL_NO_CONTEXT;
|
||||||
|
static Bool egl_init_flg = INS_FALSE;
|
||||||
|
static int win_width = 0, win_height = 0;
|
||||||
|
|
||||||
|
// 用于 FB1(第二屏,若不需要可保留为空实现)
|
||||||
|
static EGLDisplay egl_display_1 = EGL_NO_DISPLAY;
|
||||||
|
static EGLSurface eglsurface_fb1 = EGL_NO_SURFACE;
|
||||||
|
static EGLContext eglcontext_fb1 = EGL_NO_CONTEXT;
|
||||||
|
static Bool egl_init_flg_fb1 = INS_FALSE;
|
||||||
|
|
||||||
|
Bool InitGL(Int32 x, Int32 y, Int32 w, Int32 h, Int32 *rtw, Int32 *rth)
|
||||||
|
{
|
||||||
|
printf("InitGL: X11+EGL, request window %dx%d at (%d,%d)\n", w, h, x, y);
|
||||||
|
|
||||||
|
// 1. 连接 X server
|
||||||
|
x_display = XOpenDisplay(NULL);
|
||||||
|
if (!x_display) {
|
||||||
|
fprintf(stderr, "Cannot open X display\n");
|
||||||
|
return INS_FALSE;
|
||||||
|
}
|
||||||
|
int screen = DefaultScreen(x_display);
|
||||||
|
Window root = RootWindow(x_display, screen);
|
||||||
|
|
||||||
|
// 2. 创建窗口
|
||||||
|
win_width = w;
|
||||||
|
win_height = h;
|
||||||
|
x_window = XCreateSimpleWindow(x_display, root, x, y, win_width, win_height, 1,
|
||||||
|
BlackPixel(x_display, screen),
|
||||||
|
WhitePixel(x_display, screen));
|
||||||
|
// 注册感兴趣的事件(至少需要窗口关闭事件,但我们可以在主循环外部处理)
|
||||||
|
XSelectInput(x_display, x_window, StructureNotifyMask | KeyPressMask);
|
||||||
|
XMapWindow(x_display, x_window);
|
||||||
|
// 等待窗口映射完成
|
||||||
|
XEvent ev;
|
||||||
|
do { XNextEvent(x_display, &ev); } while (ev.type != MapNotify);
|
||||||
|
printf("X11 window created: %dx%d\n", win_width, win_height);
|
||||||
|
|
||||||
|
// 3. 初始化 EGL
|
||||||
|
egl_dpy = eglGetDisplay((EGLNativeDisplayType)x_display);
|
||||||
|
if (egl_dpy == EGL_NO_DISPLAY) {
|
||||||
|
fprintf(stderr, "eglGetDisplay failed\n");
|
||||||
|
XDestroyWindow(x_display, x_window);
|
||||||
|
XCloseDisplay(x_display);
|
||||||
|
return INS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLint major, minor;
|
||||||
|
if (!eglInitialize(egl_dpy, &major, &minor)) {
|
||||||
|
fprintf(stderr, "eglInitialize failed\n");
|
||||||
|
eglTerminate(egl_dpy);
|
||||||
|
XDestroyWindow(x_display, x_window);
|
||||||
|
XCloseDisplay(x_display);
|
||||||
|
return INS_FALSE;
|
||||||
|
}
|
||||||
|
printf("EGL version %d.%d\n", major, minor);
|
||||||
|
|
||||||
|
// 确保 EGL 使用 OpenGL ES API
|
||||||
|
eglBindAPI(EGL_OPENGL_ES_API);
|
||||||
|
|
||||||
|
// 选择配置
|
||||||
|
const EGLint config_attribs[] = {
|
||||||
|
EGL_RED_SIZE, 8,
|
||||||
|
EGL_GREEN_SIZE, 8,
|
||||||
|
EGL_BLUE_SIZE, 8,
|
||||||
|
EGL_ALPHA_SIZE, 0,
|
||||||
|
EGL_DEPTH_SIZE, 16,
|
||||||
|
EGL_STENCIL_SIZE, 0,
|
||||||
|
EGL_SAMPLES, 0,
|
||||||
|
EGL_SAMPLE_BUFFERS, 0,
|
||||||
|
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||||
|
EGL_NONE
|
||||||
|
};
|
||||||
|
EGLConfig config;
|
||||||
|
EGLint num_configs;
|
||||||
|
if (!eglChooseConfig(egl_dpy, config_attribs, &config, 1, &num_configs) || num_configs == 0) {
|
||||||
|
fprintf(stderr, "eglChooseConfig failed\n");
|
||||||
|
eglTerminate(egl_dpy);
|
||||||
|
XDestroyWindow(x_display, x_window);
|
||||||
|
XCloseDisplay(x_display);
|
||||||
|
return INS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建窗口表面
|
||||||
|
egl_surf = eglCreateWindowSurface(egl_dpy, config, (EGLNativeWindowType)x_window, NULL);
|
||||||
|
if (egl_surf == EGL_NO_SURFACE) {
|
||||||
|
fprintf(stderr, "eglCreateWindowSurface failed: 0x%x\n", eglGetError());
|
||||||
|
eglTerminate(egl_dpy);
|
||||||
|
XDestroyWindow(x_display, x_window);
|
||||||
|
XCloseDisplay(x_display);
|
||||||
|
return INS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建 OpenGL ES 2.0 上下文
|
||||||
|
const EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
|
||||||
|
egl_ctx = eglCreateContext(egl_dpy, config, EGL_NO_CONTEXT, context_attribs);
|
||||||
|
if (egl_ctx == EGL_NO_CONTEXT) {
|
||||||
|
fprintf(stderr, "eglCreateContext failed\n");
|
||||||
|
eglDestroySurface(egl_dpy, egl_surf);
|
||||||
|
eglTerminate(egl_dpy);
|
||||||
|
XDestroyWindow(x_display, x_window);
|
||||||
|
XCloseDisplay(x_display);
|
||||||
|
return INS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 激活上下文
|
||||||
|
if (!eglMakeCurrent(egl_dpy, egl_surf, egl_surf, egl_ctx)) {
|
||||||
|
fprintf(stderr, "eglMakeCurrent failed\n");
|
||||||
|
eglDestroyContext(egl_dpy, egl_ctx);
|
||||||
|
eglDestroySurface(egl_dpy, egl_surf);
|
||||||
|
eglTerminate(egl_dpy);
|
||||||
|
XDestroyWindow(x_display, x_window);
|
||||||
|
XCloseDisplay(x_display);
|
||||||
|
return INS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置视口
|
||||||
|
glViewport(0, 0, win_width, win_height);
|
||||||
|
printf("OpenGL ES %s, GLSL %s\n", glGetString(GL_VERSION), glGetString(GL_SHADING_LANGUAGE_VERSION));
|
||||||
|
|
||||||
|
// 返回实际窗口大小(与请求一致)
|
||||||
|
if (rtw) *rtw = win_width;
|
||||||
|
if (rth) *rth = win_height;
|
||||||
|
|
||||||
|
egl_init_flg = INS_TRUE;
|
||||||
|
printf("InitGL success (X11+EGL)\n");
|
||||||
|
return INS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 第二屏(FB1)的交换缓冲,若不需要可留空或简单实现
|
||||||
|
Bool SwapGLBuffer_FB1()
|
||||||
|
{
|
||||||
|
if (egl_display_1 != EGL_NO_DISPLAY && eglsurface_fb1 != EGL_NO_SURFACE) {
|
||||||
|
glFinish();
|
||||||
|
eglSwapBuffers(egl_display_1, eglsurface_fb1);
|
||||||
|
}
|
||||||
|
return INS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 第二屏(FB1)的释放
|
||||||
|
void DeInitGL_FB1()
|
||||||
|
{
|
||||||
|
if (egl_init_flg_fb1 == INS_FALSE) {
|
||||||
|
if (egl_display_1 != EGL_NO_DISPLAY) {
|
||||||
|
eglMakeCurrent(egl_display_1, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
|
if (eglcontext_fb1 != EGL_NO_CONTEXT)
|
||||||
|
eglDestroyContext(egl_display_1, eglcontext_fb1);
|
||||||
|
if (eglsurface_fb1 != EGL_NO_SURFACE)
|
||||||
|
eglDestroySurface(egl_display_1, eglsurface_fb1);
|
||||||
|
eglTerminate(egl_display_1);
|
||||||
|
}
|
||||||
|
egl_init_flg_fb1 = INS_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 主屏幕交换缓冲
|
||||||
|
Bool SwapGLBuffer()
|
||||||
|
{
|
||||||
|
glFinish(); // 确保所有绘制命令完成
|
||||||
|
if (egl_surf != EGL_NO_SURFACE) {
|
||||||
|
eglSwapBuffers(egl_dpy, egl_surf);
|
||||||
|
}
|
||||||
|
return INS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 释放所有资源
|
||||||
|
void DeInitGL()
|
||||||
|
{
|
||||||
|
if (egl_init_flg == INS_FALSE) {
|
||||||
|
// 清屏并交换一次,避免残留(可选)
|
||||||
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
||||||
|
eglSwapBuffers(egl_dpy, egl_surf);
|
||||||
|
|
||||||
|
eglMakeCurrent(egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
|
eglDestroyContext(egl_dpy, egl_ctx);
|
||||||
|
eglDestroySurface(egl_dpy, egl_surf);
|
||||||
|
eglTerminate(egl_dpy);
|
||||||
|
|
||||||
|
if (x_display) {
|
||||||
|
XDestroyWindow(x_display, x_window);
|
||||||
|
XCloseDisplay(x_display);
|
||||||
|
x_display = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
egl_init_flg = INS_TRUE;
|
||||||
|
printf("DeInitGL done.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // COMPILE_IN_UBUNTU
|
||||||
Reference in New Issue
Block a user