0
votes

I am trying to load a specific OpenGL version functions, but it seems that GLEW loads all of the functions regardless what I specify prior to creation of the GL context.

The reason that I know that it's not loading the specified version that I want is because it returns the function pointer to the function that is available in the later version of OpenGL.

glBlendFunci is only available in >= 4.0, whereas I want the 2.1 version of OpenGL, but glBlendFunci gets loaded regardless.

Here's what I'm trying to do:

int main(int argc, char** args)
{
    SDL_Init(SDL_INIT_EVERYTHING);

    window = SDL_CreateWindow("Game",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        width, height,
        SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

    SDL_GLContext glContext = SDL_GL_CreateContext(window);


    glewInit();

    std::cout << glBlendFunci << std::endl;

    //Initialize();

    SDL_GL_DeleteContext(glContext);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

P.S. This is just a some prototyping code and I was just messing around with OpenGL.

1

1 Answers

1
votes

The behavior you have observed is well within the spec (see WGL_ARB_create_context or GLX_ARB_create_context):

If a version less than or equal to 3.0 is requested, the context returned may implement any of the following versions:

  • Any version no less than that requested and no greater than 3.0.
  • Version 3.1, if the GL_ARB_compatibility extension is also implemented.
  • The compatibility profile of version 3.2 or greater.

What you get is a context which supports GL 2.1 completely, so any code written for GL 2.1 should run - but you may get way more than that - a compatibility profile of the highest GL version your vendor supports is not uncommon.