ubuntu22上C/C++程序使用weston+wayland+OpenGLES渲染
一,安装依赖软件:sudo apt install zlib1g-dev libssl-dev libgles2-mesa-dev libsystemd-dev libpng-dev libglib2.0-dev libwayland-dev weston libweston-9-dev
二,启动:
# 运行weston
weston -Swayland-1# 运行程序
./yourprogram
注意:这里启动weston用的wayland-1,所以代码中也要用wayland-1。
三,代码:
#include "wayland-client.h"
#include "wayland-egl.h"
#include "wayland-util.h"
#include <GLES2/gl2.h>
#include <EGL/egl.h>typedef struct stWlContextStruct {struct wl_display *wlDisplay;struct wl_registry *wlRegistry;struct wl_compositor *wlCompositor;struct wl_egl_window *wlNativeWindow;struct wl_surface *wlSurface;struct wl_shell *wlShell;struct wl_shell_surface *wlShellSurface;int width;int height;
} WLContextStruct;void handlePing(void *data, struct wl_shell_surface *shellSurface, uint32_t serial) {wl_shell_surface_pong(shellSurface, serial);
}void handleConfigure(void *data, struct wl_shell_surface *shellSurface, uint32_t edges, int32_t width, int32_t height) {
}void handlePopupDone(void *data, struct wl_shell_surface *shellSurface) {
}const struct wl_shell_surface_listener shellSurfaceListener = {handlePing,handleConfigure,handlePopupDone,
};void registry_handle_global(void *data, struct wl_registry *registry, uint32_t id, const char *interface, uint32_t version) {Navinfo::WLContextStruct *p_wlCtx = (Navinfo::WLContextStruct *)data;if (0 == strcmp(interface, "wl_compositor")) {p_wlCtx->wlCompositor = (wl_compositor *)wl_registry_bind(registry, id, &wl_compositor_interface, 1);break;} else if (0 == strcmp(interface, "wl_compositor")) {p_wlCtx->wlShell = (struct wl_shell *)wl_registry_bind(registry, id, &wl_shell_interface, 1);break;}
}const struct wl_registry_listener registry_listener = {registry_handle_global,NULL,
};void main() {// wayland partunsigned int surfaceWidth = 800;unsigned int surfaceHeight = 600;WLContextStruct wlContextStruct;memset(&wlContextStruct, 0, sizeof(wlContextStruct));wlContextStruct.wlDisplay = wl_display_connect("wayland-1");if (NULL == wlContextStruct.wlDisplay) {LOG_INFO("failed to connect to Wayland display");return false;}wlContextStruct.wlRegistry = wl_display_get_registry(wlContextStruct.wlDisplay);wl_registry_add_listener(wlContextStruct.wlRegistry, ®istry_listener, &wlContextStruct);wl_display_dispatch(wlContextStruct.wlDisplay);wl_display_roundtrip(wlContextStruct.wlDisplay);wlContextStruct.wlSurface = wl_compositor_create_surface(wlContextStruct.wlCompositor);wlContextStruct.wlShellSurface = wl_shell_get_shell_surface(wlContextStruct.wlShell, wlContextStruct.wlSurface);wl_shell_surface_add_listener(reinterpret_cast<struct wl_shell_surface *>(wlContextStruct.wlShellSurface), &shellSurfaceListener, &wlContextStruct);wlContextStruct.wlNativeWindow = wl_egl_window_create(wlContextStruct.wlSurface, surfaceWidth, surfaceHeight);wl_shell_surface_set_title(wlContextStruct.wlShellSurface, "Hi_WL");wl_shell_surface_set_toplevel(wlContextStruct.wlShellSurface);// egl partEGLNativeWindowType eglWindow = (EGLNativeWindowType)wlContextStruct.wlNativeWindow;EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType)wlContextStruct.wlDisplay);EGLint major, minor;eglInitialize(eglDisplay, &major, &minor);eglBindAPI(EGL_OPENGL_ES_API);EGLint count;if (!eglGetConfigs(eglDisplay, nullptr, 0, &count) || count < 1) {return false;}EGLConfig configFound;EGLConfig *configs = static_cast<EGLConfig *>(malloc(count * sizeof(EGLConfig)));if(configs){memset(configs, 0, count * sizeof(EGLConfig));static const EGLint kConfigAttributes[] = {EGL_SURFACE_TYPE, EGL_WINDOW_BIT,EGL_RED_SIZE, 8,EGL_GREEN_SIZE, 8,EGL_BLUE_SIZE, 8,EGL_ALPHA_SIZE, 8,EGL_DEPTH_SIZE, 24,EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,EGL_NONE};EGLint n;ret = eglChooseConfig(eglDisplay, kConfigAttributes, configs, count, &n);if ((ret != EGL_TRUE) || (n < 1)) {return false;}configFound = configs[0];free(configs);configs = nullptr;}static const EGLint kContextAttibutes[] = {EGL_CONTEXT_CLIENT_VERSION, 2,EGL_NONE};EGLContext eEglContext = eglCreateContext(eglDisplay, configFound, EGL_NO_CONTEXT, kContextAttibutes);if (eEglContext == EGL_NO_CONTEXT) {return false;}EGLSurface eglSurface = eglCreateWindowSurface(eglDisplay, configFound, (EGLNativeWindowType)eglWindow, nullptr);ret = eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eEglContext);if (ret != EGL_TRUE) {return false;}// render partwhile (true){// render ...eglSwapBuffers(eglDisplay, eglSurface);}return true;
}
相关文章:
ubuntu22上C/C++程序使用weston+wayland+OpenGLES渲染
一,安装依赖软件:sudo apt install zlib1g-dev libssl-dev libgles2-mesa-dev libsystemd-dev libpng-dev libglib2.0-dev libwayland-dev weston libweston-9-dev 二,启动: # 运行weston weston -Swayland-1# 运行程序 ./yourp…...
打点 - 泛微 E-Cology WorkflowServiceXml
请求路径 /services%20/WorkflowServiceXml显示如下,漏洞可能存在 利用: 根据提示在 CMD 处输入 Memshell 注入内存马,并点击执行,成功注入 冰蝎配置,输入内存马地址 成功连接 命令执行...
Go语言接口与多态
Go语言虽然并非传统意义上的面向对象语言,但它通过接口(Interface)和匿名组合(Composition)等机制,实现了类似面向对象编程中的多态性(Polymorphism)。接口和多态性是Go语言中非常重…...
【ADC】SAR 型 ADC 和 ΔΣ ADC 的选型决策方法
本文学习于TI 高精度实验室课程,介绍如何选择 SAR 或 delta-sigma 型 ADC。 文章目录 一、选型决策树二、特定传感器的应用三、需要 DC 精度但分辨率较低的应用四、需要 DC 精度且分辨率较高的应用五、极低噪声的 DC 精密测量六、需要捕获瞬态信号值的应用七、需要高…...
探探Java与python中的闭包
说在前面:在计算机科学中,闭包是指一个函数以及其引用的周围环境(变量)所组成的整体。简单来说,闭包允许一个函数访问并操作其外部函数作用域中的变量,即使外部函数已经执行完毕。 Java函数式编程—闭包&am…...
LD2 Scalable Heterophilous Graph Neural Network with Decoupled Embeddings
Neurips 24 推荐指数: #paper/⭐⭐⭐ 领域:可扩展图,大图加速 整个文章的理论部分比较多,尽量尽我所能避开一些额外公式。详细文章,见链接 模型架构 如图,整个模型分为与计算和训练两部分。本文的精华在于…...
【Mysql】Mysql数据库基本操作-------DDL(上)
1、DDL解释 DDL(Data Definition Language),数据定义语言,该语言部分包括以下内容, (1)对数据库的常用操作 (2)对表结构的常用操作 (3)修…...
MySQL知识点复习 - 常用的日志类型
MySQL中常用的日志类型: 重做日志(redo log) 作用:确保事务的持久性。redo日志记录事务执行后的状态,用来恢复还未写入data file的已成功事务更新的数据。防止在发生故障的时间点,尚有脏页未写入磁盘&…...
基于PHP+MySQL组合开发地方门户分类信息网站源码系统 带完整的安装代码包以及搭建部署教程
系统概述 随着互联网技术的飞速发展,地方门户分类信息网站逐渐成为城市生活不可或缺的一部分。它们涵盖了房产、招聘、二手交易、生活服务等多个领域,为当地居民提供了全方位的信息服务。为了满足这一市场需求,我们开发了这款基于PHPMySQL的…...
【1米C-SAR卫星】
1米C-SAR卫星 1米C-SAR卫星是我国自主研发的重要遥感卫星,主要用于海洋、陆地等观测任务,具备高分辨率、宽覆盖、多极化、多模式等特点。以下是对1米C-SAR卫星的详细介绍: 一、基本概况 发射时间:首颗1米C-SAR卫星于2021年11月2…...
【小小的脑袋,大大的疑问?】如何在Zookeeper中配置集群?
在Zookeeper中配置集群涉及多个步骤,以确保集群的稳定性和高效运行。以下是一个详细的配置流程: 一、环境准备 选择服务器: 选择合适数量的服务器,通常为奇数(如3台、5台等),以避免脑裂问题。确…...
Metasploit渗透测试之服务端漏洞利用
简介 在之前的文章中,我们学习了目标的IP地址,端口,服务,操作系统等信息的收集。信息收集过程中最大的收获是服务器或系统的操作系统信息。这些信息对后续的渗透目标机器非常有用,因为我们可以快速查找系统上运行的服…...
什么是原生IP?
代理IP的各个类型称呼有很多,且它们在网络使用和隐私保护方面扮演着不同的角色。今天将探讨什么是原生IP以及原生IP和住宅IP之间的区别,帮助大家更好地理解这两者的概念和实际应用,并选择适合自己的IP类型。 一、什么是原生IP? 原…...
【C++】unordered_map(set)
前言 C中的unordered容器(例如std::unordered_set、std::unordered_map等)底层是基于**哈希表(Hash Table)**实现的。哈希表是一种通过哈希函数将元素映射到特定“桶(bucket)”的容器,提供快速的…...
HTML 盒模型
盒模型(box model) 简介:盒模型(Box Model)是CSS中一个非常重要的概念,它定义了元素在网页上的布局和尺寸。 组成:内容(Content)、内边距(Paddingÿ…...
node.js npm 安装和安装create-next-app -windowsserver12
1、官网下载windows版本NODE.JS https://nodejs.org/dist/v20.17.0/node-v20.17.0-x64.msi 2、安装后增加两个文件夹目录node_global、node_cache npm config set prefix "C:\Program Files\nodejs\node_global" npm config set prefix "C:\Program Files\nod…...
Android13 展锐平台拨号中视频彩铃界面方向未与设备方向一致
背景:拨号中视频彩铃界面方向未与设备方向一致,要求视频彩铃界面方向与设备方向一致,修改视频彩铃显示的地方; 如图所示: 修改: packages/services/Telecomm/src/com/android/server/telecom/VideoProvid…...
为什么IP首部的源IP地址和目的IP地址不变而MAC层的源MAC地址和目的MAC地址变
IP首部的源IP地址和目的IP地址不变,而MAC层的源MAC地址和目的MAC地址变化的原因主要涉及到计算机网络中的分层结构和数据包传输过程。在OSI(开放系统互联)模型中,计算机网络被分为不同的层,每层都有其特定的功能。IP…...
Django 数据库配置以及字段设置详解
配置PostGre 要在 Django 中配置连接 PostgreSQL 数据库,并创建一个包含“使用人”和“车牌号”等字段的 Car 表 1. 配置 PostgreSQL 数据库连接 首先,在 Django 项目的 settings.py 中配置 PostgreSQL 连接。 修改 settings.py 文件: …...
C++ 左值右值引用梳理
C 左值右值引用梳理 左值与右值的区别 在参考资料上看到这样一句话 https://www.internalpointers.com/post/understanding-meaning-lvalues-and-rvalues-c In C an lvalue is something that points to a specific memory location. On the other hand, a rvalue is somethi…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
