2013-11-20 6 views
3

웹 검색을 시도했지만,이 X 프로그래밍 측면에 관한 자료를 찾는 것이 쉽지는 않습니다.X 오류를 잡는 방법?

GLX와 함께 X를 사용하여 OpenGL 컨텍스트를 만듭니다. 내 현재의 그래픽 카드 드라이버가 OpenGL API 버전 3.3까지만 지원한다는 것을 이미 알고 있지만 내 응용 프로그램이 다른 컴퓨터에서 실행될 수있는 모든 종류의 버전으로 컨텍스트를 만들려고 할 수 있기를 바랍니다. 내 코드는 다음과 같이 진행됩니다

  • 버전 < - OpenGL을 버전 (예에 의하여 : 3.3) 요청
  • 컨텍스트를 만듭니다 3.x 또는 4.x의입니다
    • 버전 경우, CREAT 경우 glXCreateContext
  • 를 사용하는 다른 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를 사용할 필요가

+0

입니까? 오류에 대한 로그 파일을 읽지 않습니다. – SevenBits

+0

그래, 그게 무슨 뜻이야. 나는 X/GLX 기능을 검색 할 때 GLX보다 X가 더 많다고 믿는다. X 서버가 생성 할 수있는 오류에 대해서도 설명한다. –

답변

2

주셔서 감사합니다

XSetErrorHandler(handler); 

오류 처리기가, 오른쪽 코드에서 오류를 포착 의미

int handler(Display * d, XErrorEvent * e) 
{ 
    std::cerr << "Error code: " << e->error_code << std::endl; 
    return 0; 
} 
+0

고맙습니다. :) –