有时您需要检查Linux 3D加速是否真的有效(除了glxinfo
输出).这可以通过该glxgears
工具快速完成.但是,FPS通常限于显示器垂直刷新率(即60 fps).因此,该工具或多或少变得无用,因为即使是软件渲染也可以在现代CPU上轻松生成60FPS的glxgears.
我发现很难找到一个快速简单的解决方案,我回答了我自己的问题.希望它可以节省您的时间.
当我尝试在各个线程上运行超过128个当前OpenGLX渲染上下文时,调用glXMakeCurrent
开始失败.
Display *display = XOpenDisplay(":0")
Window root_win = RootWindow(display, screen);
Window win = XCreateWindow (display, root_win, ...)
GLXContext context = glXCreateContext(display, visinfo, 0, True);
glXMakeCurrent(display, win, context); <---- Fails here on 128th
Run Code Online (Sandbox Code Playgroud)
此问题仅发生在专有的Nvidia驱动程序和Nvidia GPU上.我无法使用英特尔GPU重现.
复制代码glx.cpp
:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glx.h>
#include <GL/glxext.h>
#include <string.h>
#include <unistd.h>
#include <thread>
#include <vector>
#include <mutex>
#include <condition_variable>
#include <chrono>
#define MAX_CONTEXTS 200;
std::mutex mutex;
std::condition_variable cond;
bool will_stop = false;
int numSuccessfulContexts = 0;
#define EXIT_IF(condition, ...) if …
Run Code Online (Sandbox Code Playgroud) 我想创建一个Linux应用程序-屏幕保护程序,在这种情况下-这被证明是非常难以找到制作窗口全屏简单的任务信息.即使现有屏保的代码也没有提及他们如何管理它,我还没有看到任何明显的功能XRemoveDecoration()
.
经过多次摸索后,我确实设法创建了一个与桌面大小相同的窗口,其中:
Window win = DefaultRootWindow(disp);
XWindowAttributes getWinAttr;
XGetWindowAttributes(disp, win, &getWinAttr);
win = XCreateWindow(disp, win, 0, 0, getWinAttr.width, getWinAttr.height, 0, vInfo->depth, InputOutput, vInfo->visual, CWBorderPixel|CWColormap|CWEventMask|CWOverrideRedirect, &winAttr );
Run Code Online (Sandbox Code Playgroud)
但这并没有做任何事情来摆脱标题栏和边界.我知道有一种方法,显然 - 但是我还没有找到任何指向那个方向的东西,它不依赖于其他一些大型库被抛到顶部(现有的屏保不会使用).
编辑:请不要删除我的帖子中的信息.有一个很好的理由我明确指出现有的屏保没有使用可选库,这是因为我在过去的大部分时间里一直在分析源代码.
我选择了最直接回答问题的答案,并且适用于一般的应用程序.
如果你发现这个问题研究xscreensavers ......同样仍然适用.是的,xscreensaver有自己的API - 这很复杂,实际上涉及编写更多行代码(是的,认真的).如果您想在屏幕保护程序中使用OpenGL,则需要通过另一个 API(xlockmore,一个竞争系统)和一个将其转换为xscreensaver的兼容层.
但是,xscreensaver能够运行任何可以使用虚拟根窗口(查看vroot.h)作为屏幕保护程序的程序.所以我的建议就是这样做 - 你将拥有更多控制权,没有限制性API,以及更高的可移植性.(我看过的一个例子甚至可以编译为Linux或Windows,使用相同的文件!)
我在Ubuntu 10.04中安装了OpenGL和freeglut,它在10.04和10.10中运行良好.但是在我升级到11.04之后,我使用OpenGL开发的应用程序运行不正常.他们正在编译而没有错误,但是当我尝试执行它们时,我遇到了错误:
对于GLUT:
Xlib: extension "GLX" missing on display ":0.0".
freeglut (./a.out): OpenGL GLX extension not supported by display ':0.0'
Run Code Online (Sandbox Code Playgroud)
对于OpenGL:
Xlib: extension "GLX" missing on display ":0.0".
main: X server has no OpenGL GLX extension
Run Code Online (Sandbox Code Playgroud)
我试过的一些事情:
Run Code Online (Sandbox Code Playgroud)$glxgears Xlib: extension "GLX" missing on display ":0.0". Error: couldn't get an RGB, Double-buffered visual $glxinfo name of display: :0.0 Xlib: extension "GLX" missing on display ":0.0". Xlib: extension "GLX" missing on display ":0.0". Xlib: extension "GLX" missing on display ":0.0". Xlib: extension …
我创建了一个由GLX和GLEW支持的C++和OpenGL动画引擎,通过SWIG包装在Node.js模块中.目标是在浏览器进程中使用Electron应用程序内的引擎.
发动机看起来很稳定.它具有多上下文感知能力,在所有相关操作之前绑定正确的OpenGL上下文,在几乎所有可能的操作之后检查错误,并由相当大的测试套件支持.
在电子应用程序之外,一切正常.然而,神秘的是,通常在Electron之外工作的简单脚本在浏览器或渲染器进程中的Electron应用程序内失败.
glGenX
都返回0glGetString(GL_VERSION)
返回null,之后glGetError
返回没有错误按此顺序:
glXCreateContextAttribsARB
使用合理的FB配置创建OpenGL上下文.返回值不为零.XSync(display, false)
被调用等待X错误.没有错误导致程序崩溃,设置X错误处理程序不会产生任何结果.glXMakeCurrent
,没有报告错误glGetError
.glXIsDirect
.glewInit
,返回GLEW_OK
.我对此非常困惑.我正在检查的所有内容似乎都表明正确创建了上下文,但它看起来已损坏或功能失常.
这是怎么回事?我还能检查什么?
我有一个问题,因为我目前正在Windows 10上运行Ubuntu终端.我还安装了XMing作为我的X服务器(我使用XMing作为qemu等等).我正在尝试运行这个SDL2计划.所以我对main.cpp有这个:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <SDL2/SDL.h>
#include <GL/gl.h>
int main(int argc, char *argv[])
{
int final_status = 1;
SDL_Window *window;
SDL_GLContext openGL_context;
if (SDL_Init(SDL_INIT_VIDEO)) {
fprintf(stderr, "Unable to initialize SDL: %s\n",
SDL_GetError());
return 1;
}
window = SDL_CreateWindow("My Demo", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, 640, 480,
SDL_WINDOW_OPENGL);
if (!window) {
fprintf(stderr, "Can't create window: %s\n", SDL_GetError());
goto finished;
}
openGL_context = SDL_GL_CreateContext(window);
if (!openGL_context) {
fprintf(stderr, "Can't create openGL context: %s\n",
SDL_GetError());
goto close_window;
}
/* drawing code removed …
Run Code Online (Sandbox Code Playgroud) XCB 官方文档告诉我们,将 OpenGL 与 XCB 一起使用是不可能的:还必须使用 Xlib。
Bart Massey(XCB 的创建者)的这篇文章并不表明这应该是不可能的。但我确定我错过了一些东西。
我花了几个小时浏览xcb/glx.h
,这里组织得很好。在我看来,它就像一个成熟的 API。但我无法让它工作。
xcb/glx.h
什么?(注意。这是了解 XCB 工作原理的持续努力的一部分。)
相关的SO 线程。
如果有人愿意尝试一下,这里是 XCB 邮件列表中原始帖子的来源,将其精简并放入单个文件中。
你会注意到xcb_glx_make_context_current
返回错误169(不知道是什么意思),但只有在 xcb_glx_create_window
需要0
和NULL
它的最后两个参数。这些参数涉及一组属性,似乎是由函数返回的xcb_glx_create_window_attribs
,但我不知道如何使用它...
之前的长辅助函数int main()
仅意味着两个返回两个整数,xcb_glx_fbconfig_t fbconfig
xcb_visualid_t glx_visual
,对应于第一个“匹配”帧缓冲区配置。在我的平台上,这些是0xa7
和0x24
。它们正是 Xlib/GLX 例程(实际有效)返回的内容,所以我知道我选择的帧缓冲区配置很好。
所以,问题似乎发生在xcb_glx_create_window
和xcb_glx_make_context_current
......
// gcc main2.c -o main …
Run Code Online (Sandbox Code Playgroud) 我正在使用远程桌面软件 X2Go 来远程使用 Ubuntu 20.04 Linux 工作站。我正在使用 Ubuntu 20.04 笔记本电脑进行隧道传输。最初,一切似乎都运行良好。当我启动 paraFoam 时,收到以下错误消息:
qt.qpa.xcb: X server does not support XInput 2
Aborted (core dumped)
有什么想法可能会导致这个问题吗?我正在使用 mate-desktop-environment,与 xfce 遇到完全相同的问题。
X2Go 邮件存档中有一个与此相关的线程,导致了 Ubuntu 14 的解决方案。有没有人尝试过这个并且可以给出详细的说明?
主题: https ://www.mail-archive.com/x2go-user@lists.x2go.org/msg04042.html
解决方法:https://wiki.x2go.org/doku.php/wiki:development:glx- xlib-workaround
最好,我想将OpenGL ES 2.0用于我开始制作的新3D游戏.无论如何,我一直在Ubuntu PC上开发它(不是顶级的,但体面的)我在2010年买的.
Gdx.graphics.isGL20Available()返回false,我很确定我的驱动程序支持3.3.0.这是我从glxinfo收到的:
name of display: :0.0
display: :0 screen: 0
direct rendering: Yes
server glx vendor string: NVIDIA Corporation
server glx version string: 1.4
server glx extensions:
GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_SGIX_fbconfig,
GLX_SGIX_pbuffer, GLX_SGI_video_sync, GLX_SGI_swap_control,
GLX_EXT_swap_control, GLX_EXT_texture_from_pixmap, GLX_ARB_create_context,
GLX_ARB_create_context_profile, GLX_EXT_create_context_es2_profile,
GLX_ARB_create_context_robustness, GLX_ARB_multisample,
GLX_NV_float_buffer, GLX_ARB_fbconfig_float, GLX_EXT_framebuffer_sRGB
client glx vendor string: NVIDIA Corporation
client glx version string: 1.4
client glx extensions:
GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_visual_info,
GLX_EXT_visual_rating, GLX_EXT_import_context, GLX_SGI_video_sync,
GLX_NV_swap_group, GLX_NV_video_out, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer,
GLX_SGI_swap_control, GLX_EXT_swap_control, GLX_ARB_create_context,
GLX_ARB_create_context_profile, GLX_NV_float_buffer,
GLX_ARB_fbconfig_float, GLX_EXT_fbconfig_packed_float,
GLX_EXT_texture_from_pixmap, GLX_EXT_framebuffer_sRGB,
GLX_NV_present_video, …
Run Code Online (Sandbox Code Playgroud) 我尝试在 WSL2 上运行 OpenGL 代码,但在尝试运行可执行文件时出现以下错误:
GLFW error 65543: GLX: Failed to create context: GLXBadFBConfig
Unable to create GLFW window
Run Code Online (Sandbox Code Playgroud)
这是我用来创建窗口的代码:
....
GLFWwindow* initialize() {
int glfwInitRes = glfwInit();
if (!glfwInitRes) {
fprintf(stderr, "Unable to initialize GLFW\n");
return nullptr;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
GLFWwindow* window = glfwCreateWindow(1280, 720, "InitGL", nullptr, nullptr);
if (!window) {
fprintf(stderr, "Unable to create GLFW window\n");
glfwTerminate();
return nullptr;
}
glfwMakeContextCurrent(window);
....
return window;
}
....
GLFWwindow* window = initialize();
Run Code Online (Sandbox Code Playgroud)
我使用 VcxSrv …