Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6710255
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 26, 20262026-05-26T08:00:01+00:00 2026-05-26T08:00:01+00:00

ContextWin32::ContextWin32(WindowHandle parent, NLOpenGLSettings settings) : IPlatformContext(parent, settings) { int pf = 0; PIXELFORMATDESCRIPTOR pfd

  • 0
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");
    }
}

This is the code in question.
It fails on Line 77, when I try to set the Attributes.
But the very same code works on my ATI.
I do not own any NVIDIA Product and cannot reproduce it, but I need to fix it of course. Can anyone help on the issue? What did I overlook?

My Definitions:

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);

}

Maybe I got some #defines wrong?

Any input is highly appreciated.

ps.: The little glitch regarding AttribList[3] = 0; is fixed by now, must be 1. But that was not the issue.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-26T08:00:02+00:00Added an answer on May 26, 2026 at 8:00 am

    Remove from ‘attribList‘ the following pairs:

    • WGL_ACCELERATION_ARB
    • WGL_DRAW_TO_WINDOW_ARB
    • WGL_SUPPORT_OPENGL_ARB (obvious that support OpenGL!)
    • WGL_DOUBLE_BUFFER_ARB
    • WGL_PIXEL_TYPE_ARB
    • WGL_COLOR_BITS_ARB
    • WGL_DEPTH_BITS_ARB

    Those attribute names are already specified by the ‘*m_hdc*’ handle (infact you call SetPixelFormat on it).

    I create a valid context without those flags on NVIDIA platforms.

    Valid attribute names for CreateContextAttribsARB are:

    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
    

    Furthermore, what error is returning wglCreateContextAttribsARB?

    Instance example:

    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
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

No related questions found

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.