웹 검색을 시도했지만,이 X 프로그래밍 측면에 관한 자료를 찾는 것이 쉽지는 않습니다.X 오류를 잡는 방법?
GLX와 함께 X를 사용하여 OpenGL 컨텍스트를 만듭니다. 내 현재의 그래픽 카드 드라이버가 OpenGL API 버전 3.3까지만 지원한다는 것을 이미 알고 있지만 내 응용 프로그램이 다른 컴퓨터에서 실행될 수있는 모든 종류의 버전으로 컨텍스트를 만들려고 할 수 있기를 바랍니다. 내 코드는 다음과 같이 진행됩니다
- 버전 < - OpenGL을 버전 (예에 의하여 : 3.3) 요청
- 컨텍스트를 만듭니다 3.x 또는 4.x의입니다
- 버전 경우, CREAT 경우
glXCreateContext
- 버전 경우, CREAT 경우
- 를 사용하는 다른
glXCreateContextAttribsARB
- 사용 (3.3은 3.2가되거나 3.0은 2.1이됩니다 ...)
- 문맥이 생성되었거나 최소 OpenGL 버전을 사용하지 못하는 경우 중지하십시오.
내 코드는 괜찮지 만, 내가 X 코드를 사용하여 X/GLX에서 시작한 오류를 검색하는 방법을 좀 더 명확하게하고 싶습니다. glXCreateContextAttribARB
을 사용하면 4.4 버전을 만들 수 있습니다. 내 그래픽 카드는 최대 3.3 지원), 분명히 얻을 :
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 153 (GLX)
Minor opcode of failed request: 34()
Serial number of failed request: 33
Current serial number in output stream: 34
내가 처리하는 코드에서 X에 대한 오류 처리를 삽입하고 싶습니다. X는 C가 아니고 C++가 아니라 예외는이 단계에서 사용할 수 없습니다. 여기에 내가 컨텍스트 만드는 곳이다 (I 의도적으로 제거를 무엇을하지 않습니다 직접 상황에 맞는 창조) : 나는 X의 오류를 잡아이를 조회 할 수있는 방법
이// Notes :
// mGLXContext : The GLX context we want to create
// vDepthSize, vAntialiasingLevel, vStencilSize are here to customize mGLXContext
// vTryVersion : a pointer to the API version {major, minor} we want to create
// vSharedContext : a pointer to an other (existing) context for data sharing.
// mXDisplay : the X Display
// Get the proc
const GLubyte* vProcName = reinterpret_cast<const GLubyte*>("glXCreateContextAttribsARB");
PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB =
reinterpret_cast<PFNGLXCREATECONTEXTATTRIBSARBPROC>(glXGetProcAddress(vProcName));
if(glXCreateContextAttribsARB) {
// Create the FB attributes
int vFBAttributes[] = {
GLX_DEPTH_SIZE, (int)(vDepthSize),
GLX_STENCIL_SIZE, (int)(vStencilSize),
GLX_SAMPLE_BUFFERS, vAntialiasingLevel > 0,
GLX_SAMPLES, (int)(vAntialiasingLevel),
GLX_RED_SIZE, 8,
GLX_GREEN_SIZE, 8,
GLX_BLUE_SIZE, 8,
GLX_ALPHA_SIZE, pDepth == 32 ? 8 : 0,
GLX_DOUBLEBUFFER, True,
GLX_X_RENDERABLE, True,
GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
GLX_RENDER_TYPE, GLX_RGBA_BIT,
GLX_CONFIG_CAVEAT, GLX_NONE,
None
};
// Get the FB configs
int vNbXConfigs = 0;
::GLXFBConfig* vGLXFBConfig = glXChooseFBConfig(mXDisplay, DefaultScreen(mXDisplay), vFBAttributes, &vNbXConfigs);
if(vGLXFBConfig && vNbXConfigs) {
// Create the context attributes
int vAttributes[] = {
GLX_CONTEXT_MAJOR_VERSION_ARB, static_cast<int>(vTryVersion->major),
GLX_CONTEXT_MINOR_VERSION_ARB, static_cast<int>(vTryVersion->minor),
0, 0
};
// Create the context : Error is generated by GLX here
mGLXContext = glXCreateContextAttribsARB(mXDisplay, vGLXFBConfig[0], vSharedContext, true, vAttributes);
}
}
그래서 내 질문은가?
읽기 : 당신은, 예를 들어 오류 처리기를 지정할 수XSetErrorHandler
를 사용할 필요가
입니까? 오류에 대한 로그 파일을 읽지 않습니다. – SevenBits
그래, 그게 무슨 뜻이야. 나는 X/GLX 기능을 검색 할 때 GLX보다 X가 더 많다고 믿는다. X 서버가 생성 할 수있는 오류에 대해서도 설명한다. –