src/video/maccommon/SDL_macgl.c
author Sam Lantinga <slouken@libsdl.org>
Mon, 29 May 2006 04:04:35 +0000
branchSDL-1.3
changeset 1668 4da1ee79c9af
parent 1662 782fd950bd46
permissions -rw-r--r--
more tweaking indent options
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2006 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 #include "SDL_config.h"
    23 
    24 /* AGL implementation of SDL OpenGL support */
    25 
    26 #include "SDL_lowvideo.h"
    27 #include "SDL_macgl_c.h"
    28 #include "SDL_loadso.h"
    29 
    30 
    31 /* krat: adding OpenGL support */
    32 int
    33 Mac_GL_Init(_THIS)
    34 {
    35 #if SDL_VIDEO_OPENGL
    36     AGLPixelFormat format;
    37     int i = 0;
    38     GLint attributes[26];       /* 26 is max possible in this setup */
    39     GLboolean noerr;
    40 
    41     /* load the gl driver from a default path */
    42     if (!this->gl_config.driver_loaded) {
    43         /* no driver has been loaded, use default (ourselves) */
    44         if (Mac_GL_LoadLibrary(this, NULL) < 0) {
    45             return (-1);
    46         }
    47     }
    48 
    49     attributes[i++] = AGL_RGBA;
    50     if (this->gl_config.red_size != 0 &&
    51         this->gl_config.blue_size != 0 && this->gl_config.green_size != 0) {
    52         attributes[i++] = AGL_RED_SIZE;
    53         attributes[i++] = this->gl_config.red_size;
    54         attributes[i++] = AGL_GREEN_SIZE;
    55         attributes[i++] = this->gl_config.green_size;
    56         attributes[i++] = AGL_BLUE_SIZE;
    57         attributes[i++] = this->gl_config.blue_size;
    58         attributes[i++] = AGL_ALPHA_SIZE;
    59         attributes[i++] = this->gl_config.alpha_size;
    60     }
    61     if (this->gl_config.double_buffer) {
    62         attributes[i++] = AGL_DOUBLEBUFFER;
    63     }
    64     if (this->gl_config.depth_size != 0) {
    65         attributes[i++] = AGL_DEPTH_SIZE;
    66         attributes[i++] = this->gl_config.depth_size;
    67     }
    68     if (this->gl_config.stencil_size != 0) {
    69         attributes[i++] = AGL_STENCIL_SIZE;
    70         attributes[i++] = this->gl_config.stencil_size;
    71     }
    72     if (this->gl_config.accum_red_size != 0 &&
    73         this->gl_config.accum_blue_size != 0 &&
    74         this->gl_config.accum_green_size != 0) {
    75 
    76         attributes[i++] = AGL_ACCUM_RED_SIZE;
    77         attributes[i++] = this->gl_config.accum_red_size;
    78         attributes[i++] = AGL_ACCUM_GREEN_SIZE;
    79         attributes[i++] = this->gl_config.accum_green_size;
    80         attributes[i++] = AGL_ACCUM_BLUE_SIZE;
    81         attributes[i++] = this->gl_config.accum_blue_size;
    82         attributes[i++] = AGL_ACCUM_ALPHA_SIZE;
    83         attributes[i++] = this->gl_config.accum_alpha_size;
    84     }
    85     if (this->gl_config.stereo) {
    86         attributes[i++] = AGL_STEREO;
    87     }
    88 #if defined(AGL_SAMPLE_BUFFERS_ARB) && defined(AGL_SAMPLES_ARB)
    89     if (this->gl_config.multisamplebuffers != 0) {
    90         attributes[i++] = AGL_SAMPLE_BUFFERS_ARB;
    91         attributes[i++] = this->gl_config.multisamplebuffers;
    92     }
    93     if (this->gl_config.multisamplesamples != 0) {
    94         attributes[i++] = AGL_SAMPLES_ARB;
    95         attributes[i++] = this->gl_config.multisamplesamples;
    96     }
    97 #endif
    98     if (this->gl_config.accelerated > 0) {
    99         attributes[i++] = AGL_ACCELERATED;
   100         attributes[i++] = AGL_NO_RECOVERY;
   101     }
   102 
   103     attributes[i++] = AGL_ALL_RENDERERS;
   104     attributes[i] = AGL_NONE;
   105 
   106     format = aglChoosePixelFormat(NULL, 0, attributes);
   107     if (format == NULL) {
   108         SDL_SetError("Couldn't match OpenGL desired format");
   109         return (-1);
   110     }
   111 
   112     glContext = aglCreateContext(format, NULL);
   113     if (glContext == NULL) {
   114         SDL_SetError("Couldn't create OpenGL context");
   115         return (-1);
   116     }
   117     aglDestroyPixelFormat(format);
   118 
   119 #if  TARGET_API_MAC_CARBON
   120     noerr = aglSetDrawable(glContext, GetWindowPort(SDL_Window));
   121 #else
   122     noerr = aglSetDrawable(glContext, (AGLDrawable) SDL_Window);
   123 #endif
   124 
   125     if (!noerr) {
   126         SDL_SetError("Unable to bind GL context to window");
   127         return (-1);
   128     }
   129     return (0);
   130 #else
   131     SDL_SetError("OpenGL support not configured");
   132     return (-1);
   133 #endif
   134 }
   135 
   136 void
   137 Mac_GL_Quit(_THIS)
   138 {
   139 #if SDL_VIDEO_OPENGL
   140     if (glContext != NULL) {
   141         aglSetCurrentContext(NULL);
   142         aglSetDrawable(glContext, NULL);
   143         aglDestroyContext(glContext);
   144         glContext = NULL;
   145     }
   146 #endif
   147 }
   148 
   149 #if SDL_VIDEO_OPENGL
   150 
   151 /* Make the current context active */
   152 int
   153 Mac_GL_MakeCurrent(_THIS)
   154 {
   155     int retval;
   156 
   157     retval = 0;
   158     if (!aglSetCurrentContext(glContext)) {
   159         SDL_SetError("Unable to make GL context current");
   160         retval = -1;
   161     }
   162     return (retval);
   163 }
   164 
   165 void
   166 Mac_GL_SwapBuffers(_THIS)
   167 {
   168     aglSwapBuffers(glContext);
   169 }
   170 
   171 int
   172 Mac_GL_LoadLibrary(_THIS, const char *location)
   173 {
   174     if (location == NULL)
   175 #if __MACH__
   176         location = "/System/Library/Frameworks/OpenGL.framework/OpenGL";
   177 #else
   178         location = "OpenGLLibrary";
   179 #endif
   180 
   181     this->hidden->libraryHandle = SDL_LoadObject(location);
   182 
   183     this->gl_config.driver_loaded = 1;
   184     return (this->hidden->libraryHandle != NULL) ? 0 : -1;
   185 }
   186 
   187 void
   188 Mac_GL_UnloadLibrary(_THIS)
   189 {
   190     SDL_UnloadObject(this->hidden->libraryHandle);
   191 
   192     this->hidden->libraryHandle = NULL;
   193     this->gl_config.driver_loaded = 0;
   194 }
   195 
   196 void *
   197 Mac_GL_GetProcAddress(_THIS, const char *proc)
   198 {
   199     return SDL_LoadFunction(this->hidden->libraryHandle, proc);
   200 }
   201 
   202 #endif /* SDL_VIDEO_OPENGL */
   203 /* vi: set ts=4 sw=4 expandtab: */