2015-08-12 1 views
2

Je cherche un snipet de code pour créer un contexte EGL sur le bureau NVidia.Comment créer un contexte EGL sur NVidia Desktop

Je suis conscient que sur Windows, NVidia expose EGL grâce à des extensions WGL_EXT_create_context_es_profile et WGL_EXT_create_context_es2_profile.

Et sur Linux NVidia permet EGL par GLX_EXT_create_context_es_profile et GLX_EXT_create_context_es2_profile extensions.

Mais je n'ai pas pu trouver un exemple, ou un exemple de code, pour le faire fonctionner.

Répondre

2

Après un combat, j'ai quelque chose comme ci-dessous. L'élément de base est d'obtenir les extensions requises, manuellement ou en utilisant GLEW, de créer un contexte fictif, puis de créer votre contexte GL-ES. La gestion des erreurs est omise pour l'autorisation.

/** 
* adapted from 
* from https://www.opengl.org/wiki/Tutorial:_OpenGL_3.1_The_First_Triangle_%28C%2B%2B/Win%29 
*/ 
bool CGLRenderer::CreateGLContext(CDC* pDC){ 
PIXELFORMATDESCRIPTOR pfd = 
{ 
sizeof(PIXELFORMATDESCRIPTOR), 
1, 
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //Flags 
PFD_TYPE_RGBA,   //The kind of framebuffer. RGBA or palette. 
32,      //Colordepth of the framebuffer. 
0, 0, 0, 0, 0, 0, 
0, 
0, 
0, 
0, 0, 0, 0, 
24,      //Number of bits for the depthbuffer 
8,      //Number of bits for the stencilbuffer 
0,      //Number of Aux buffers in the framebuffer. 
PFD_MAIN_PLANE, 
0, 
0, 0, 0 
}; 

int nPixelFormat = ChoosePixelFormat(pDC->m_hDC, &pfd); 
if (nPixelFormat == 0) return false; 

BOOL bResult = SetPixelFormat (pDC->m_hDC, nPixelFormat, &pfd); 
if (!bResult) return false; 

HGLRC tempContext = wglCreateContext(pDC->m_hDC); 
wglMakeCurrent(pDC->m_hDC, tempContext); 

// Using GLEW. Init it after ctx creation 
GLenum err = glewInit(); 
if (GLEW_OK != err){ 
    AfxMessageBox(_T("GLEW is not initialized!")); 
} 

// create OPENGL ES 2 profile. It may return a compatible, but higher GL-ES, as 3.0 or 3.1 
int attribList[] = { 
      WGL_CONTEXT_MAJOR_VERSION_ARB, 2, 
      WGL_CONTEXT_MINOR_VERSION_ARB, 0, 
      WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_ES2_PROFILE_BIT_EXT, 
      0, 
}; 

if(wglewIsSupported("WGL_ARB_create_context") == 1){ 
    m_hrc = wglCreateContextAttribsARB(pDC->m_hDC,0, attribs); 
    wglMakeCurrent(NULL,NULL); 
    wglDeleteContext(tempContext); 
    wglMakeCurrent(pDC->m_hDC, m_hrc); 
}else{ //Failed to create a GL-ES context. 
    m_hrc = NULL; 
} 

//Debug info - print out GL version 
const GLubyte *glVersionString = glGetString(GL_VERSION); 
const char *vendorChar = (char*)glGetString(GL_VENDOR); 
const char *rendererChar = (char*)glGetString(GL_RENDERER); 

int glVersion[2] = {-1,-1}; 
glGetIntegerv(GL_MAJOR_VERSION,&glVersion[0]); 
glGetIntegerv(GL_MINOR_VERSION,&glVersion[1]); 

cout<<"GL version string: "<< glVersionString << <<endl; 
cout<<"OpenGL version: "<<glVersion[0]<<"."<<glVersion[1]<<endl; 
cout<<"GPU: "<<vendorChar<<" - "<<rendererChar<<endl; 

if (!m_hrc) return false; 

return true; 
} // end of CreateGLContext