GBM 上的 EGLDisplay

2024-03-12

我想通过 EGL 创建 OpenGL 上下文。由于我实际上不会绘图,所以我想将 Pbuffers 与 GBM 平台结合使用。这是代码(C99):

#include <stdlib.h>
#include <assert.h>

#include <fcntl.h>
#include <unistd.h>

#include <EGL/egl.h>
#include <EGL/eglext.h>

#include <gbm.h>


int main( void )
{
    assert( eglBindAPI( EGL_OPENGL_API ) == EGL_TRUE );

    int fd = open("/dev/dri/card0", O_RDWR);
    struct gbm_device * gbm = gbm_create_device( fd );

    EGLDisplay dpy = eglGetDisplay( gbm );
    eglInitialize( dpy , NULL , NULL );

    EGLConfig config;
    EGLint n_of_configs;
    assert( eglGetConfigs( dpy , &config , 1 , &n_of_configs ) == EGL_TRUE );

    EGLSurface srf = eglCreatePbufferSurface( dpy , config , NULL );
    assert( srf != EGL_NO_SURFACE );

    EGLContext ctx = eglCreateContext( dpy , config , EGL_NO_CONTEXT , NULL );
    assert( ctx != EGL_NO_CONTEXT );

    assert( eglMakeCurrent( dpy , srf , srf , ctx ) == EGL_TRUE );

    eglDestroySurface( dpy , srf );
    eglDestroyContext( dpy , ctx );
    eglTerminate( dpy );

    gbm_device_destroy( gbm );
    close( fd );

    return EXIT_SUCCESS;
}

它失败并出现以下错误:

test.c: In function ‘main’:
test.c:20:2: error: passing argument 1 of ‘eglGetDisplay’ from incompatible pointer type [-Werror]
  EGLDisplay dpy = eglGetDisplay( gbm );
  ^
In file included from test.c:7:0:
/usr/include/EGL/egl.h:251:31: note: expected ‘EGLNativeDisplayType’ but argument is of type ‘struct gbm_device *’
 EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id);

This http://virtuousgeek.org/blog/index.php/jbarnes/2011/10/31/writing_stanalone_programs_with_egl_and_是我作为例子的页面。

我很惊讶,因为我用--with-egl-platforms=drm,wayland,x11,并且,即使有说明here http://www.mesa3d.org/egl.html that EGL_DEFAULT_DISPLAY映射到指定的第一个平台,它是_XDisplay *在我的系统上。

--with-egl-platforms
List the platforms (window systems) to support. Its argument is a comma seprated string such as --with-egl-platforms=x11,drm. It decides the platforms a driver may support. The first listed platform is also used by the main library to decide the native platform: the platform the EGL native types such as EGLNativeDisplayType or EGLNativeWindowType defined for.

AFAIK,Weston 在 GBM 之上创建了一个 EGLDisplay,用于在裸 KMS 上绘图。我查看了它的代码,并查找了相关的系统头来寻找解决方案,但它似乎不存在。

FWIW,我在 Radeon HD 3200、Linux 3.12.6、GCC 4.8.2 上使用 Mesa 10.0。


You say

我想将 Pbuffers 与 GBM 平台结合使用。

EGL/GBM 不支持 Pbuffer。它也不支持像素图。

要使用 EGL/GBM 创建离屏表面,必须将 gbm_surface 传递给eglCreateWindowSurface。 “窗口”一词用词不当。没有创建真正的“窗口”。生成的缓冲区将保持在屏幕外,除非您使用内核的 KMS API 将其发布到显示器。

但是......这不是你的程序无法编译的原因。当调用eglGetDisplay和eglCreateWindowSurface时,你必须像这样进行转换:

eglGetDisplay((EGLNativeDisplayType)my_gbm_device);
eglCreateWindowSurface(egl_dpy, egl_config,
                       (EGLNativeWindowType)my_gbm_surface, NULL);

如果您使用的是包含提交的 Mesa468cc86 http://cgit.freedesktop.org/mesa/mesa/commit/src/egl/main?id=468cc866b4b308cee40470f06b31002c6c56da96,那么您可以通过使用eglGetPlatformDisplayEXT和eglCreatePlatformWindowSurface来避免转换,如下所示:

eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_MESA, my_gbm_device, NULL);
eglCreatePlatformWindowSurfaceEXT(egl_dpy, egl_config, my_gbm_surface, NULL);

无论您选择使用普通 EGL 函数还是较新平台的 EGL 函数,您都应该参考EGL_MESA_platform_gbm http://www.khronos.org/registry/egl/extensions/MESA/EGL_MESA_platform_gbm.txt规格作为指导。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GBM 上的 EGLDisplay 的相关文章

  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • 当从后台工作程序发生事件时,XlCall.Excel(XlCall.xlcCalculateNow) 抛出 XlCallException

    我有一个 ExcelFunction 来排队一些计算 ExcelFunction public static void QueueCalcs takes ranges var calcRequests builds list of calc
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 编写具有多种类型的泛型扩展方法时的类型推断问题

    我正在为 IEnumerable 编写一个通用扩展方法 用于将对象列表映射到另一个映射对象列表 这就是我希望该方法的工作方式 IList
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • jqGrid不显示JSON数据

    我希望将 jqGrid 用于我当前正在开发的 Web 项目 问题是 我似乎无法让网格显示 JSON 数据 这是网格的初始化代码 fn loadjqgrid function httpposturl this jqGrid url httpp
  • 在 Visual Studio 中制作属性代码片段

    我厌倦了编写样板属性代码 例如 public string Name get return this name set SetProperty ref name value 因此 我决定在 Visual Studio 中制作一个代码片段来自
  • htaccess .html、.css、.js 的 UTF-8 编码 - 最好的方法是什么?

    对于 yslow 页面速度 我想删除我的元标记并将我的编码放入 htaccess 文件中 以下是我读过的所有方法 哪种方式是首选方式 另外 语言设置也是一个好主意 如果文件匹配之外 它将适用于所有文件类型吗 1 https github c
  • PyCharm 中的 PyQt4 没有自动完成功能

    在我使用的办公室电脑上 Python 3 4 PyQt4 版本 4 11 1 PyCharm 社区版 3 4 1 我按照上述顺序安装了所有内容 但是 代码完成不起作用 它适用于导入 但不适用于类和方法 我做了一个小示例程序 import s
  • 如何找到最大堆栈大小?

    我正在使用 Ubuntu 11 04 如何找出进程的最大调用堆栈大小以及堆栈的每个帧的大小 快速谷歌搜索应该会显示关于这个主题的一些信息 http www cs nyu edu exact core doc stackOverflow tx
  • 如果已在下拉列表中选择了项目,则 SelectedIndexChanged 事件不会触发?

    假设我有一个包含 2 个项目的下拉列表 并且默认情况下选择第一个项目 如果我选择单击下拉列表中的第一项 有没有办法让 SelectedIndexChanged 事件仍然触发 我以为我可以通过将下拉列表的 SelectedIndex 设置为
  • ImportError:找不到入口点('console_scripts','easy_install')

    我正在尝试安装一个软件包 其中一个说明如下 但出现错误 easy install U distribute pip Traceback most recent call last File Library Frameworks Python
  • 如何知道在jetpack compose的lazyrow视口中完全可见的项目?

    我有一个包含项目的惰性行 现在 我想对每当用户滚动惰性行时在视口中完全可见的项目进行 API 调用 我尝试过以下代码 listState rememberLazyListState LaunchedEffect listState snap
  • 计算机如何记录时间? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 时间在计算机中是如何表示的 我的意思是计算机不是尽可能快地完成所有计算吗 如果事物在不同的机器上以不同的速度运行 你如何跟踪时间的流逝
  • React Native - 无法在前端导入猫鼬(但它可以从后端运行)

    我无法在前端导入猫鼬 但它在后端有效 我有一个单独的后端目录 我有一些代码可以将几个用户添加到我的数据库中 这里是 import mongoose from mongoose import User from models user con
  • 信号量和互斥量在实现上有什么区别?

    我读到互斥锁和二进制信号量仅在一方面不同 在互斥锁的情况下 锁定线程必须解锁 但在信号量中 锁定和解锁线程可以不同吗 哪一种效率更高 假设您知道信号量和互斥体之间的基本区别 为了快速 简单的同步 请使用临界区 要跨进程边界同步线程 请使用互
  • PyQt:悬停按钮时更改光标

    我正在尝试制作一个按钮 或任何其他 Qwidget 这将在悬停时更改用户光标 例如 当我将鼠标悬停在 QPushButton 上时 它会将光标从箭头更改为指向手 我正在使用 Qt 样式表 所以我不完全确定 但是有没有办法在那里做类似的事情
  • WebSockets-将图像发送到连接的客户端

    这是我在 stackoverflow com 上发表的第一篇文章 所以我会尽量简单明了 我必须使用 websockets 开发 web 应用程序的功能 我能够发送文本数据 使用websockets 但不是图像 我已经查看并尝试了不同的可能性
  • 有没有办法创建由 `std::function<>` 包装的函数的哈希值?

    我有一个 C 函数 需要一个std function作为输入参数 具体来说 一个std function
  • IE 悬停选择问题

    我和一个朋友正在尝试解决 IE 7 8 我们在这里构建了一个规范的示例 http www mathgladiator com share ie select bug hover css menus htm http www mathglad
  • 如何从音频文件中分离男声和女声(C++或Java)

    我想区分音频文件中的男声和女声并将它们分开 作为输出 我希望将两个声音分开 你能帮我一下吗 编码可以用java还是c 完成 这可能是一个非常复杂的问题 它类似于编写自己的语音识别 或识别 算法 您首先可以将音频转换为频域 这是使用快速傅立叶
  • HTML(5)/CSS 中的列布局

    HTML5 CSS 中是否有一种方法可以将列布局如下所示 并且仍然可以正确地显示文本 C1 C2 C3 C4 C5 C6 只是为了澄清 我希望能够在单个元素中编写所有文本并让 CSS 创建列 虽然这使用单个元素 但必须手动定义中断 Use
  • 无法将 SQL 查询转换为左外连接的 LINQ 查询

    问题陈述 我正在尝试将我的 Sql 之一转换为 linq 查询 但我无法获得所需的输出 谁能建议我应该做什么 SQL查询 SELECT AssetTagging AssetID AssetTagging AssetDescription R
  • 离子滚动到特定列表项

    有没有办法滚动到离子列表中的特定项目 例如在此代码笔中 https codepen io anon pen grEBQJ https codepen io anon pen grEBQJ 当我转到测试按钮时 我想滚动到带有文本 文本 的列表
  • GBM 上的 EGLDisplay

    我想通过 EGL 创建 OpenGL 上下文 由于我实际上不会绘图 所以我想将 Pbuffers 与 GBM 平台结合使用 这是代码 C99 include