Mercurial > sdl-ios-xcode
comparison src/video/win32/SDL_win32opengl.c @ 3100:7dc982143c06
Date: Sun, 22 Mar 2009 12:52:29 +0000
From: Luke Benstead
Subject: OpenGL 3.0 Context Creation
I've attached a patch which implements OpenGL 3.x context creation on
the latest SVN. I've added two options to SDL_GL_SetAttribute, these
are SDL_GL_CONTEXT_MAJOR_VERSION and SDL_GL_CONTEXT_MINOR_VERSION.
These default to 2 and 1 respectively. If the major version is less
than 3 then the current context creation method is used, otherwise the
appropriate new context creation function is called (depending on the
platform).
Sample code:
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
printf("Unable to initialize SDL: %s\n", SDL_GetError());
return 1;
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); //Without these 2 lines, SDL will create a GL 2.x context
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_OPENGL | SDL_FULLSCREEN );
I've implemented context creation on both Win32 and X and run basic
tests on both. This patch doesn't provide access to all the options
allowed by the new context creation (e.g. shared contexts, forward
compatible contexts) but they can be added pretty easily.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 24 Mar 2009 10:43:53 +0000 |
parents | 089a77aebb7d |
children | cdeee9f9b14b |
comparison
equal
deleted
inserted
replaced
3099:82e60908fab1 | 3100:7dc982143c06 |
---|---|
28 #if SDL_VIDEO_OPENGL_WGL | 28 #if SDL_VIDEO_OPENGL_WGL |
29 #include "SDL_opengl.h" | 29 #include "SDL_opengl.h" |
30 | 30 |
31 #define DEFAULT_OPENGL "OPENGL32.DLL" | 31 #define DEFAULT_OPENGL "OPENGL32.DLL" |
32 | 32 |
33 #ifndef WGL_ARB_create_context | |
34 #define WGL_ARB_create_context | |
35 #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 | |
36 #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 | |
37 #define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 | |
38 #define WGL_CONTEXT_FLAGS_ARB 0x2093 | |
39 #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 | |
40 #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 | |
41 #endif | |
42 | |
43 typedef HGLRC (APIENTRYP PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int * attribList); | |
33 | 44 |
34 int | 45 int |
35 WIN_GL_LoadLibrary(_THIS, const char *path) | 46 WIN_GL_LoadLibrary(_THIS, const char *path) |
36 { | 47 { |
37 LPTSTR wpath; | 48 LPTSTR wpath; |
483 WIN_GL_CreateContext(_THIS, SDL_Window * window) | 494 WIN_GL_CreateContext(_THIS, SDL_Window * window) |
484 { | 495 { |
485 HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc; | 496 HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc; |
486 HGLRC context; | 497 HGLRC context; |
487 | 498 |
488 context = _this->gl_data->wglCreateContext(hdc); | 499 if (_this->gl_config.major_version < 3) { |
500 context = _this->gl_data->wglCreateContext(hdc); | |
501 } else { | |
502 PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; | |
503 HGLRC temp_context = _this->gl_data->wglCreateContext(hdc); | |
504 if (!temp_context) { | |
505 SDL_SetError("Could not create GL context"); | |
506 return NULL; | |
507 } | |
508 | |
509 /* Make the context current */ | |
510 if (WIN_GL_MakeCurrent(_this, window, temp_context) < 0) { | |
511 WIN_GL_DeleteContext(_this, temp_context); | |
512 return NULL; | |
513 } | |
514 | |
515 wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) wglGetProcAddress("wglCreateContextAttribsARB"); | |
516 if (!wglCreateContextAttribsARB) { | |
517 SDL_SetError("GL 3.x is not supported"); | |
518 context = temp_context; | |
519 } else { | |
520 int attribs[] = { | |
521 WGL_CONTEXT_MAJOR_VERSION_ARB, _this->gl_config.major_version, | |
522 WGL_CONTEXT_MINOR_VERSION_ARB, _this->gl_config.minor_version, | |
523 0 | |
524 }; | |
525 /* Create the GL 3.x context */ | |
526 context = wglCreateContextAttribsARB(hdc, 0, attribs); | |
527 /* Delete the GL 2.x context */ | |
528 wglDeleteContext(temp_context); | |
529 } | |
530 } | |
531 | |
489 if (!context) { | 532 if (!context) { |
490 SDL_SetError("Could not create GL context"); | 533 SDL_SetError("Could not create GL context"); |
491 return NULL; | 534 return NULL; |
492 } | 535 } |
493 | 536 |