2011-10-13 5 views
3
ContextWin32::ContextWin32(WindowHandle parent, NLOpenGLSettings settings) 
: IPlatformContext(parent, settings) 
{ 
    int pf = 0; 
    PIXELFORMATDESCRIPTOR pfd = {0}; 
    OSVERSIONINFO osvi = {0}; 
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 

    // Obtain HDC for this window. 
    if (!(m_hdc = GetDC((HWND)parent))) 
    { 
     NLError("[ContextWin32] GetDC() failed."); 
     throw NLException("GetDC() failed.", true); 
    } 

    // Create and set a pixel format for the window. 
    pfd.nSize = sizeof(pfd); 
    pfd.nVersion = 1; 
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; 
    pfd.iPixelType = PFD_TYPE_RGBA; 
    pfd.cColorBits = settings.BPP; 
    pfd.cDepthBits = settings.BPP; 
    pfd.iLayerType = PFD_MAIN_PLANE; 

    // Obtain Windows Version 
    if (!GetVersionEx(&osvi)) 
    {   
     NLError("[ContextWin32] GetVersionEx() failed."); 
     throw NLException("[ContextWin32] GetVersionEx() failed."); 
    } 

    // Get a pixelformat, based on our settings 
    pf = ChoosePixelFormat(m_hdc, &pfd); 

    // Set the pixelformat 
    if (!SetPixelFormat(m_hdc, pf, &pfd)) 
    { 
     NLError("[ContextWin32] GetVersionEx() failed."); 
     throw NLException("[ContextWin32] SetPixelFormat() failed."); 
    } 

    // When running under Windows Vista or later support desktop composition. 
    // This doesn't really apply when running in full screen mode. 
    if (osvi.dwMajorVersion > 6 || (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion >= 0)) 
     pfd.dwFlags |= PFD_SUPPORT_COMPOSITION; 

    // Verify that this OpenGL implementation supports the extensions we need 
    std::string extensions = wglGetExtensionsStringARB(m_hdc); 
    if (extensions.find("WGL_ARB_create_context") == std::string::npos){ 
     NLError("[ContextWin32] Required extension WGL_ARB_create_context is not supported."); 
     throw NLException("[ContextWin32] Required extension WGL_ARB_create_context is not supported."); 
    } 

    int attribList[] = 
    { 
     WGL_CONTEXT_MAJOR_VERSION_ARB, settings.MAJOR, 
     WGL_CONTEXT_MINOR_VERSION_ARB, settings.MINOR, 

     WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, 
     WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,     
     WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, 
     WGL_SUPPORT_OPENGL_ARB, GL_TRUE, 
     WGL_DOUBLE_BUFFER_ARB, GL_TRUE, 
     WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, 
     WGL_COLOR_BITS_ARB, 32, 
     WGL_DEPTH_BITS_ARB, 24, 
     0 
    }; 

    // First try creating an OpenGL context. 
    if (!(m_hglrc = wglCreateContextAttribsARB(m_hdc, 0, attribList))) 
    { 
     // Fall back to an OpenGL 3.0 context. 
     attribList[3] = 0; 
     if (!(m_hglrc = wglCreateContextAttribsARB(m_hdc, 0, attribList))){ 
      NLError("[ContextWin32] wglCreateContextAttribsARB() failed for OpenGL 3 context."); 
      throw NLException("[ContextWin32] wglCreateContextAttribsARB() failed for OpenGL 3 context.", true); 
     } 
    } 

    if (!wglMakeCurrent(m_hdc, m_hglrc)){ 
     NLError("[ContextWin32] wglMakeCurrent() failed for OpenGL 3 context."); 
     throw NLException("[ContextWin32] wglMakeCurrent() failed for OpenGL 3 context."); 
    } 

    // Load wglSwapIntervalExt 
    typedef BOOL (APIENTRY * PFNWGLSWAPINTERVALEXTPROC)(int); 
    static PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = 0; 
    wglSwapIntervalEXT = reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(wglGetProcAddress("wglSwapIntervalEXT")); 

    if (wglSwapIntervalEXT) 
    { 
      if (settings.VSYNC == true) 
      { 
       wglSwapIntervalEXT(1); 
      } 
      else if (settings.VSYNC == false) 
      { 
       wglSwapIntervalEXT(0); 
      } 
    } 
    else if (wglSwapIntervalEXT == NULL) 
    { 
     NLWarning("[ContextWin32] Cannot load wglSwapIntervalEXT"); 
    } 
} 

Ceci est le code en question. Il échoue sur la ligne 77, lorsque j'essaie de définir les attributs. Mais le même code fonctionne sur mon ATI. Je ne possède aucun produit NVIDIA et je ne peux pas le reproduire, mais je dois le réparer bien sûr. Quelqu'un peut-il aider sur la question? Qu'est-ce que j'ai oublié?wglCreateContextAttribsARB échoue sur le matériel NVIDIA

Mes Définitions:

extern "C" { 

#define ERROR_INVALID_VERSION_ARB    0x2095 
#define WGL_CONTEXT_DEBUG_BIT_ARB    0x0001 
#define WGL_CONTEXT_FLAGS_ARB     0x2094 
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 
#define WGL_CONTEXT_LAYER_PLANE_ARB    0x2093 
#define WGL_CONTEXT_MAJOR_VERSION_ARB   0x2091 
#define WGL_CONTEXT_MINOR_VERSION_ARB   0x2092 
#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB   0x00000001 
#define WGL_CONTEXT_PROFILE_MASK_ARB   0x9126 


#define WGL_NUMBER_PIXEL_FORMATS_ARB   0x2000 
#define WGL_DRAW_TO_WINDOW_ARB     0x2001 
#define WGL_DRAW_TO_BITMAP_ARB     0x2002 
#define WGL_ACCELERATION_ARB     0x2003 
#define WGL_NEED_PALETTE_ARB     0x2004 
#define WGL_NEED_SYSTEM_PALETTE_ARB    0x2005 
#define WGL_SWAP_LAYER_BUFFERS_ARB    0x2006 
#define WGL_SWAP_METHOD_ARB      0x2007 
#define WGL_NUMBER_OVERLAYS_ARB     0x2008 
#define WGL_NUMBER_UNDERLAYS_ARB    0x2009 
#define WGL_TRANSPARENT_ARB      0x200A 
#define WGL_TRANSPARENT_RED_VALUE_ARB   0x2037 
#define WGL_TRANSPARENT_GREEN_VALUE_ARB   0x2038 
#define WGL_TRANSPARENT_BLUE_VALUE_ARB   0x2039 
#define WGL_TRANSPARENT_ALPHA_VALUE_ARB   0x203A 
#define WGL_TRANSPARENT_INDEX_VALUE_ARB   0x203B 
#define WGL_SHARE_DEPTH_ARB      0x200C 
#define WGL_SHARE_STENCIL_ARB     0x200D 
#define WGL_SHARE_ACCUM_ARB      0x200E 
#define WGL_SUPPORT_GDI_ARB      0x200F 
#define WGL_SUPPORT_OPENGL_ARB     0x2010 
#define WGL_DOUBLE_BUFFER_ARB     0x2011 
#define WGL_STEREO_ARB       0x2012 
#define WGL_PIXEL_TYPE_ARB      0x2013 
#define WGL_COLOR_BITS_ARB      0x2014 
#define WGL_RED_BITS_ARB      0x2015 
#define WGL_RED_SHIFT_ARB      0x2016 
#define WGL_GREEN_BITS_ARB      0x2017 
#define WGL_GREEN_SHIFT_ARB      0x2018 
#define WGL_BLUE_BITS_ARB      0x2019 
#define WGL_BLUE_SHIFT_ARB      0x201A 
#define WGL_ALPHA_BITS_ARB      0x201B 
#define WGL_ALPHA_SHIFT_ARB      0x201C 
#define WGL_ACCUM_BITS_ARB      0x201D 
#define WGL_ACCUM_RED_BITS_ARB     0x201E 
#define WGL_ACCUM_GREEN_BITS_ARB    0x201F 
#define WGL_ACCUM_BLUE_BITS_ARB     0x2020 
#define WGL_ACCUM_ALPHA_BITS_ARB    0x2021 
#define WGL_DEPTH_BITS_ARB      0x2022 
#define WGL_STENCIL_BITS_ARB     0x2023 
#define WGL_AUX_BUFFERS_ARB      0x2024 
#define WGL_NO_ACCELERATION_ARB     0x2025 
#define WGL_GENERIC_ACCELERATION_ARB   0x2026 
#define WGL_FULL_ACCELERATION_ARB    0x2027 

#define WGL_SWAP_EXCHANGE_ARB     0x2028 
#define WGL_SWAP_COPY_ARB      0x2029 
#define WGL_SWAP_UNDEFINED_ARB     0x202A 

#define WGL_TYPE_RGBA_ARB      0x202B 
#define WGL_TYPE_COLORINDEX_ARB     0x202C 

extern HGLRC wglCreateContextAttribsARB(HDC hDC, HGLRC hShareContext, const int *attribList); 

} 

Peut-être que j'ai eu quelques #defines mal?

Toute entrée est très appréciée. Ps: Le petit problème concernant AttribList [3] = 0; est fixé à ce jour, doit être 1. Mais ce n'était pas le problème.

+0

Quelle est la ligne 77? – Luca

Répondre

2

Retirer du 'attribList' les paires suivantes: (! Évident que le soutien OpenGL)

  • WGL_ACCELERATION_ARB
  • WGL_DRAW_TO_WINDOW_ARB
  • de WGL_SUPPORT_OPENGL_ARB
  • WGL_DOUBLE_BUFFER_ARB
  • WGL_PIXEL_TYPE_ARB
  • WGL_COLOR_BITS_ARB
  • WGL_DEPTH_BITS_ARB

Les noms d'attributs sont déjà spécifiés par le '* m_hDC * poignée (enfait que vous appelez SetPixelFormat dessus). Je crée un contexte valide sans ces indicateurs sur les plates-formes NVIDIA.

noms d'attributs valides pour CreateContextAttribsARB sont:

WGL_CONTEXT_MAJOR_VERSION_ARB  0x2091 
WGL_CONTEXT_MINOR_VERSION_ARB  0x2092 
WGL_CONTEXT_LAYER_PLANE_ARB  0x2093 
WGL_CONTEXT_FLAGS_ARB   0x2094 
WGL_CONTEXT_PROFILE_MASK_ARB  0x9126 

De plus, quelle erreur est de retour wglCreateContextAttribsARB?

exemple de l'instance:

int err = Gl.GetError(); 

switch (err) { 
    case Gl.INVALID_OPERATION: 
     throw new InvalidOperationException(String.Format("unable to create context {0}.{1} ({2})", sVersionDb[version].GLMajor, sVersionDb[version].GLMinor, "invalid operation")); 
    case Wgl.ERROR_INVALID_VERSION_ARB: 
     throw new InvalidOperationException(String.Format("unable to create context {0}.{1} ({2})", sVersionDb[version].GLMajor, sVersionDb[version].GLMinor, "invalid version")); 
    case Wgl.ERROR_INVALID_PROFILE_ARB: 
     throw new InvalidOperationException(String.Format("unable to create context {0}.{1} ({2})", sVersionDb[version].GLMajor, sVersionDb[version].GLMinor, "invalid profile")); 
    case Wgl.ERROR_INVALID_PIXEL_TYPE_ARB: 
     throw new InvalidOperationException(String.Format("unable to create context {0}.{1} ({2})", sVersionDb[version].GLMajor, sVersionDb[version].GLMinor, "invalid pixel format")); 
    default: 
     throw new InvalidOperationException(String.Format("unable to create context {0}.{1} ({2})", sVersionDb[version].GLMajor, sVersionDb[version].GLMinor, "unknown error " + err)); 
} 
+0

Cela a aidé. Merci. J'ai mis les attribs à la version et au drapeau de profil seulement, maintenant cela fonctionne. –