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…...
3分钟快速上手:免费高效的Elasticsearch可视化工具Elasticvue终极指南
3分钟快速上手:免费高效的Elasticsearch可视化工具Elasticvue终极指南 【免费下载链接】elasticvue Elasticsearch gui for the browser 项目地址: https://gitcode.com/gh_mirrors/el/elasticvue 你是否曾经为复杂的Elasticsearch集群管理而烦恼?…...
保姆级教程:MogFace人脸检测模型-large快速上手,无需代码轻松体验
保姆级教程:MogFace人脸检测模型-large快速上手,无需代码轻松体验 1. 认识MogFace人脸检测模型 1.1 什么是MogFace MogFace是目前最先进的人脸检测方法之一,在Wider Face六项榜单上长期保持领先地位。这个模型通过三个创新点显著提升了检测…...
d-id AI studio会员值得买吗?实测3大核心功能与免费版对比
d-id AI studio会员深度评测:三大核心功能实测与免费版差异全解析 在数字内容创作领域,AI视频工具正掀起一场革命。作为行业新锐,d-id AI studio凭借其独特的面部动画技术,让普通用户也能轻松制作专业级动态视频。但对于已经体验…...
uniApp离线打包实战避坑指南
1. 离线打包前的环境准备 第一次接触uniApp离线打包时,我踩过的第一个坑就是环境配置。当时以为只要安装了Android Studio就能万事大吉,结果编译时各种报错接踵而至。后来才发现,离线打包对开发环境的版本匹配要求极为严格,差一个…...
OpenClaw量化对比:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF不同精度版本的自动化任务表现
OpenClaw量化对比:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF不同精度版本的自动化任务表现 1. 测试背景与实验设计 去年在开发一个自动化文档处理流程时,我发现OpenClaw的任务成功率与底层模型量化精度密切相关。当时使用Q8版本处理Excel文…...
AI驱动关键词优化的SEO未来趋势与实际应用解析
本文旨在探讨AI在搜索引擎优化(SEO),特别是关键词优化领域的重要角色。文章分析了AI技术如何通过数据分析和用户行为洞察,帮助企业制定更加有效的关键词策略。AI能够实时监测市场趋势,识别用户意图,并根据这…...
老码农和你一起学AI系列:ELECTRA
ELECTRA(Efficiently Learning an Encoder that Classifies Token Replacements Accurately)是Google Research在2020年提出的一种自监督预训练方法。它不像BERT那样做“完形填空”,而是让模型扮演一个“作弊检测员”,通过判别输入…...
KMS_VL_ALL_AIO激活工具完全指南:从问题诊断到长效管理
KMS_VL_ALL_AIO激活工具完全指南:从问题诊断到长效管理 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 如何诊断Windows/Office激活失败的核心原因? 1.1 激活失败的三大…...
OpenClaw任务编排:GLM-4.7-Flash多步骤自动化设计
OpenClaw任务编排:GLM-4.7-Flash多步骤自动化设计 1. 为什么需要任务编排 上周我需要整理一批技术文档,这个任务包含多个步骤:从不同文件夹收集Markdown文件、统一格式、生成摘要、最后打包发送给团队成员。手动操作不仅耗时,还…...
Python多线程真能并行了吗?(GIL绕过技术全图谱:subprocess/numba/multiprocessing/cython/rustpy)
第一章:Python无锁GIL环境下的并发模型面试题汇总Python 的全局解释器锁(GIL)长期被视为多线程并发的瓶颈,但近年来随着 CPython 3.13 引入实验性无锁 GIL(--without-pymalloc 配合 --with-per-object-gil 原型&#x…...
