15

As far as I'm aware, the Macbook Air 2012 supports OpenGL 3.2. When using SDL 2.0 to create the OpenGL context, however, the context is only opengl version 2.1.

Is it possible for SDL 2.0 to create a GL 3.2 context?

Captain Head
  • 333
  • 1
  • 2
  • 9

3 Answers3

30

For everyone who still has this problem as of Wednesday, Oct 10th, SDL2 allows you to create an OpenGL 3.2 context on Macs running Mac OS X 10.7 (Lion) and up. You just need to add this code:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

If you're running OS X 10.10, or the solution above still does not resolve the problem, changing the second line of the above example from

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

to

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);

may work for you.

heenenee
  • 19,914
  • 1
  • 60
  • 86
David Greiner
  • 318
  • 4
  • 6
1

EDIT: See https://stackoverflow.com/a/13095742/123387 -- SDL2 should support this natively now. The note below is for versions before the latest SDL2 release.

The current version (as of Wed Aug 15 21:00:33 2012 -0400; 6398:c294faf5fce5) does not support 10.7 series. However, there is a way to add support if you're willing to run an unstable SDL for kicks.

Give this a shot:

src/video/cocoa/SDL_cocoaopengl.m +90 (Cocoa_GL_CreateContext)

if(_this->gl_config.major_version == 3 &&                                                           
   _this->gl_config.minor_version == 2)                                                             
{                                                                                                   
    attr[i++] = NSOpenGLPFAOpenGLProfile;                                                           
    attr[i++] = NSOpenGLProfileVersion3_2Core;                                                      
}     

Then in your application, something along these lines.

SDL_Init(SDL_INIT_EVERYTHING);                                                                                                                                    

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);                                               
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);                                               

window = SDL_CreateWindow("3.2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,                
                640, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);                                                                                               

context = SDL_GL_CreateContext(window);    

I am running 10.7.4 under my Mac Air from 2011 and when I run a few GL diagnostics from a 3.2 SDL enable application I get:

Driver     : cocoa
Renderer   : Intel HD Graphics 3000 OpenGL Engine
Vendor     : Intel Inc.
Version    : 3.2 INTEL-7.18.18
GLSL       : 1.50

I haven't tested much outside of this, but hopefully someone else can give it a stab and have a bit more success.

EDIT: If you're using GLEW you will want to enable glewExperimental. Note that there is a bug in the 3.2 core profile when you query GL_EXTENSIONS. It will report 1280 (as if it wasn't supported)--however that shouldn't impact you from using 1.50 shaders and so on.

Community
  • 1
  • 1
Justin Van Horne
  • 1,322
  • 11
  • 15
0

That should be possible:

#include <stdio.h>
#include <stdlib.h>
/* If using gl3.h */
/* Ensure we are using opengl's core profile only */
#define GL3_PROTOTYPES 1
#include <GL3/gl3.h>

#include <SDL.h>
#define PROGRAM_NAME "Tutorial1"

/* A simple function that prints a message, the error code returned by SDL,
 * and quits the application */
void sdldie(const char *msg)
{
    printf("%s: %s\n", msg, SDL_GetError());
    SDL_Quit();
    exit(1);
}


void checkSDLError(int line = -1)
{
#ifndef NDEBUG
    const char *error = SDL_GetError();
    if (*error != '\0')
    {
        printf("SDL Error: %s\n", error);
        if (line != -1)
            printf(" + line: %i\n", line);
        SDL_ClearError();
    }
#endif
}


/* Our program's entry point */
int main(int argc, char *argv[])
{
    SDL_Window *mainwindow; /* Our window handle */
    SDL_GLContext maincontext; /* Our opengl context handle */

    if (SDL_Init(SDL_INIT_VIDEO) < 0) /* Initialize SDL's Video subsystem */
        sdldie("Unable to initialize SDL"); /* Or die on error */

    /* Request opengl 3.2 context.
     * SDL doesn't have the ability to choose which profile at this time of writing,
     * but it should default to the core profile */
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

    /* Turn on double buffering with a 24bit Z buffer.
     * You may need to change this to 16 or 32 for your system */
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

    /* Create our window centered at 512x512 resolution */
    mainwindow = SDL_CreateWindow(PROGRAM_NAME, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
    if (!mainwindow) /* Die if creation failed */
        sdldie("Unable to create window");

    checkSDLError(__LINE__);

    /* Create our opengl context and attach it to our window */
    maincontext = SDL_GL_CreateContext(mainwindow);
    checkSDLError(__LINE__);


    /* This makes our buffer swap syncronized with the monitor's vertical refresh */
    SDL_GL_SetSwapInterval(1);

    /* Clear our buffer with a red background */
    glClearColor ( 1.0, 0.0, 0.0, 1.0 );
    glClear ( GL_COLOR_BUFFER_BIT );
    /* Swap our back buffer to the front */
    SDL_GL_SwapWindow(mainwindow);
    /* Wait 2 seconds */
    SDL_Delay(2000);

    /* Same as above, but green */
    glClearColor ( 0.0, 1.0, 0.0, 1.0 );
    glClear ( GL_COLOR_BUFFER_BIT );
    SDL_GL_SwapWindow(mainwindow);
    SDL_Delay(2000);

    /* Same as above, but blue */
    glClearColor ( 0.0, 0.0, 1.0, 1.0 );
    glClear ( GL_COLOR_BUFFER_BIT );
    SDL_GL_SwapWindow(mainwindow);
    SDL_Delay(2000);

    /* Delete our opengl context, destroy our window, and shutdown SDL */
    SDL_GL_DeleteContext(maincontext);
    SDL_DestroyWindow(mainwindow);
    SDL_Quit();

    return 0;
}
genpfault
  • 51,148
  • 11
  • 85
  • 139
  • Note that this would require special support in SDL, as MacOSX's context creation API is different for 3.2 and 2.1. – Nicol Bolas Aug 15 '12 at 01:08
  • Ah yes, I saw that tutorial as well. Using that exact code still produces an OpenGL 2.1 context on the Air with OSX Mountain Lion. On a couple Windows machines I have (with Nvidia and ATI cards) this creates a context with the highest supported version (e.g. 3.3). – Captain Head Aug 15 '12 at 01:11
  • @NicolBolas That's what I'm wondering at this point.... This may simply be a shortcoming of the current version of SDL. – Captain Head Aug 15 '12 at 01:14
  • @CaptainHead It is at the current moment. I posted a reply here with a quick three-or-so line fix to SDL that will allow for 3.2 context creation. It's incompatible for an older OSX, but meh. – Justin Van Horne Aug 20 '12 at 02:42