为啥 EGL 上下文只与一个线程相关

Posted

技术标签:

【中文标题】为啥 EGL 上下文只与一个线程相关【英文标题】:Why EGL context is related to only one Thread为什么 EGL 上下文只与一个线程相关 【发布时间】:2021-02-04 15:36:12 【问题描述】:

我对 EGL CONTEXT 的含义感到有些困惑,特别是在 GPU 中使用 3D。

线程在 CPU 端。每个线程都可以向 GPU 发送命令以执行对象绘制(顶点、纹理、exct...使用着色器)

每个着色器都与一个程序相关,并且可以使用或不使用在着色器中定义的内容。为此,我们需要在绘制数组或元素之前绑定资源。

我认为我在初始化时将每个资源都发送到 GPU,但相机帧除外,这是不同的。如果我认为在移动设备上,meromry 在 CPU 和 GPU 之间共享。需要通过线程定义上下文。解释一下我不明白的。

如果需要执行着色器并使用一些资源,我不需要上下文。我只需要为正确的程序着色器绑定正确的资源。任何线程都可以做到,只要一个一个地完成。拥有内存很常见,任何线程都可以访问 GPU 上的任何资源,当然是一个接一个。或者可能在 GPU 接收器的不同通道上,所以程序(着色器)也可以在并行中处理。

因此无需将资源分配给上下文。所有资源都应该可以通过 référence 访问。我通过程序(着色器)完成了drawwing,一个简单的调用(程序,ressouce1,ressource2,ext)就足够了。

那么为什么每个线程只有一个上下文。有灵活性。对我来说,不再需要分享上下文了。任何着色器都可以使用任何资源 exct...

我真的不明白为什么是 EGL 上下文,更不用说为什么与线程相关了。

提前感谢您的解释。

PS:我创建这个问题是因为使用 OpenCL 在 JAVA EGL(线程 + 上下文)和 C++ 中的线程之间共享纹理是一场噩梦。我真的不理解访问纹理或顶点等资源的混乱情况。参考起来应该很简单。

【问题讨论】:

【参考方案1】:

我真的不明白为什么是 EGL 上下文,更不明白为什么与线程相关

...因为这是规范所说的。归根结底,您是否不同意设计也没关系,规范以特定的方式运作,这就是它的运作方式。

您可以在同一个共享组中分配多个 EGL 上下文 - 这允许从并行线程共享某种形式的数据(但状态仍然是上下文本地的)。这通常用于一个上下文作为后台加载线程,而另一个上下文执行实际渲染。

较新的 API,如 Vulkan,仍然有上下文,但失去了线程限制。

【讨论】:

你似乎想要一些不存在的东西。 EGL 有上下文。上下文有线程限制。就是这样。 我放弃谈论原因。我只是想让事情顺利进行。所以你能解释一下我应该怎么做才能在我的 C++ 中使用 EGLImageKHR 并能够使用 GL_TEXTURE_EXTERNAL_OES 和我的 JAVA 部分应用程序。有可能吗?

以上是关于为啥 EGL 上下文只与一个线程相关的主要内容,如果未能解决你的问题,请参考以下文章

你能解释一下STA和MTA吗?

串烧 JavaCAS相关知识

线程相关概念

线程相关概念

线程相关概念

多线程相关知识总结