能否在Xlib窗口创建完成后再创建GLX上下文?
如何在Xlib窗口创建完成后再创建GLX上下文?
我希望将Xlib窗口创建与GLX上下文创建拆分为两个独立阶段——先创建好Xlib窗口,再进行OpenGL相关的上下文创建工作。Win32平台下这种分阶段的实现流程比较简单,但我找不到Linux平台下Xlib+OpenGL的相关实现资料。
现有实现参考
Linux(Xlib)常规实现方式
GLint glxAttribs[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE, 24, GLX_STENCIL_SIZE, 8, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_SAMPLE_BUFFERS, 0, GLX_SAMPLES, 0, None }; XVisualInfo* visual = glXChooseVisual(display, screenId, glxAttribs); XSetWindowAttributes windowAttribs; windowAttribs.border_pixel = BlackPixel(display, screenId); windowAttribs.background_pixel = WhitePixel(display, screenId); windowAttribs.override_redirect = True; windowAttribs.colormap = XCreateColormap(display, RootWindow(display, screenId), visual->visual, AllocNone); windowAttribs.event_mask = ExposureMask; window = XCreateWindow(display, RootWindow(display, screenId), 0, 0, 320, 200, 0, visual->depth, InputOutput, visual->visual, CWBackPixel | CWColormap | CWBorderPixel | CWEventMask, &windowAttribs);
Windows平台实现方式
const WindowsWindow* pWin32Window = (const WindowsWindow*)pOwnerWindow; HWND windowHandle = pWin32Window->GetWin32WindowHandle(); HDC windowDeviceContext = pWin32Window->GetWin32WindowDeviceContext(); /* * Create pixel format */ PIXELFORMATDESCRIPTOR pfd = { sizeof(pfd),1 }; memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.nVersion = 1; pfd.cColorBits = OpenGLDeviceUtilsWin32::GetColorBits(desc.SwapchainBufferFormat); pfd.cAlphaBits = OpenGLDeviceUtilsWin32::GetAlphaBits(desc.SwapchainBufferFormat); pfd.cDepthBits = OpenGLDeviceUtilsWin32::GetDepthBits(desc.SwapchainDepthStencilBufferFormat); pfd.cStencilBits = OpenGLDeviceUtilsWin32::GetStencilBits(desc.SwapchainDepthStencilBufferFormat); pfd.cAuxBuffers = 3; pfd.iLayerType = PFD_MAIN_PLANE; const int pixelFormatIndex = ChoosePixelFormat(windowDeviceContext, &pfd); ASSERT(pixelFormatIndex != 0,"OpenGLDevice","Invalid pixel format"); ASSERT(SetPixelFormat(windowDeviceContext, pixelFormatIndex, &pfd), "OpenGLDevice", "Win32 window rejected the specified pixel format"); HGLRC tempContext = wglCreateContext(windowDeviceContext); ASSERT(tempContext != NULL, "OpenGLDevice", "Creation of wgl dummy context failed!"); wglMakeCurrent(windowDeviceContext, tempContext); PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL; wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB"); ASSERT(wglCreateContextAttribsARB != NULL, "OpenGLDevice", "WGL get proc address failed!");
期望的流程
- 创建Xlib窗口
- 检查该窗口是否支持指定GLX属性对应的像素格式
- 使用该像素格式创建GLX上下文
当前常规流程对比
- 先通过
glXChooseVisual获取符合GLX属性的视觉信息 - 基于该视觉信息创建Xlib窗口
- 再创建GLX上下文
核心疑问
是否可以在不提前告知Xlib该窗口将用于OpenGL的情况下创建窗口,后续再完成OpenGL相关的设置流程?
内容的提问来源于stack exchange,提问作者Barış Üçkardeş
相关产品推荐
相关产品推荐

