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