src/video/bwindow/SDL_bopengl.cc
author Sam Lantinga <slouken@libsdl.org>
Mon, 31 Oct 2011 05:56:58 -0400
changeset 6044 35448a5ea044
parent 6037 2feab4874268
child 6138 4c64952a58fb
permissions -rw-r--r--
Lots of fixes importing SDL source wholesale into a new iOS project
nathanheisey@5918
     1
/*
nathanheisey@5918
     2
  Simple DirectMedia Layer
nathanheisey@5918
     3
  Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
nathanheisey@5918
     4
nathanheisey@5918
     5
  This software is provided 'as-is', without any express or implied
nathanheisey@5918
     6
  warranty.  In no event will the authors be held liable for any damages
nathanheisey@5918
     7
  arising from the use of this software.
nathanheisey@5918
     8
nathanheisey@5918
     9
  Permission is granted to anyone to use this software for any purpose,
nathanheisey@5918
    10
  including commercial applications, and to alter it and redistribute it
nathanheisey@5918
    11
  freely, subject to the following restrictions:
nathanheisey@5918
    12
nathanheisey@5918
    13
  1. The origin of this software must not be misrepresented; you must not
nathanheisey@5918
    14
     claim that you wrote the original software. If you use this software
nathanheisey@5918
    15
     in a product, an acknowledgment in the product documentation would be
nathanheisey@5918
    16
     appreciated but is not required.
nathanheisey@5918
    17
  2. Altered source versions must be plainly marked as such, and must not be
nathanheisey@5918
    18
     misrepresented as being the original software.
nathanheisey@5918
    19
  3. This notice may not be removed or altered from any source distribution.
nathanheisey@5918
    20
*/
slouken@6044
    21
#include "SDL_config.h"
slouken@6044
    22
slouken@6044
    23
#if SDL_VIDEO_DRIVER_BWINDOW
nathanheisey@5918
    24
nathanheisey@5918
    25
#include "SDL_bopengl.h"
nathanheisey@5918
    26
nathanheisey@5931
    27
#include <unistd.h>
nathanheisey@5931
    28
#include <KernelKit.h>
nathanheisey@5931
    29
#include <OpenGLKit.h>
nathanheisey@5931
    30
#include "SDL_BWin.h"
nathanheisey@5931
    31
#include "../../main/beos/SDL_BApp.h"
nathanheisey@5931
    32
nathanheisey@5919
    33
#ifdef __cplusplus
nathanheisey@5919
    34
extern "C" {
nathanheisey@5919
    35
#endif
nathanheisey@5918
    36
nathanheisey@5938
    37
nathanheisey@5938
    38
#define BGL_FLAGS BGL_RGB | BGL_DOUBLE
nathanheisey@5938
    39
nathanheisey@5931
    40
static inline SDL_BWin *_ToBeWin(SDL_Window *window) {
nathanheisey@5931
    41
	return ((SDL_BWin*)(window->driverdata));
nathanheisey@5931
    42
}
nathanheisey@5931
    43
nathanheisey@5931
    44
static inline SDL_BApp *_GetBeApp() {
nathanheisey@5931
    45
	return ((SDL_BApp*)be_app);
nathanheisey@5931
    46
}
nathanheisey@5931
    47
nathanheisey@5918
    48
/* Passing a NULL path means load pointers from the application */
nathanheisey@5918
    49
int BE_GL_LoadLibrary(_THIS, const char *path)
nathanheisey@5918
    50
{
nathanheisey@5939
    51
/* FIXME: Is this working correctly? */
nathanheisey@5935
    52
	image_info info;
nathanheisey@5935
    53
			int32 cookie = 0;
nathanheisey@5935
    54
	while (get_next_image_info(0, &cookie, &info) == B_OK) {
nathanheisey@5935
    55
		void *location = NULL;
nathanheisey@5935
    56
		if( get_image_symbol(info.id, "glBegin", B_SYMBOL_TYPE_ANY,
nathanheisey@5935
    57
				&location) == B_OK) {
nathanheisey@5936
    58
nathanheisey@5935
    59
			_this->gl_config.dll_handle = (void *) info.id;
nathanheisey@5935
    60
			_this->gl_config.driver_loaded = 1;
nathanheisey@5935
    61
			SDL_strlcpy(_this->gl_config.driver_path, "libGL.so",
nathanheisey@5935
    62
					SDL_arraysize(_this->gl_config.driver_path));
nathanheisey@5935
    63
		}
nathanheisey@5935
    64
	}
aschiffler@6037
    65
	return 0;
nathanheisey@5918
    66
}
nathanheisey@5918
    67
nathanheisey@5918
    68
void *BE_GL_GetProcAddress(_THIS, const char *proc)
nathanheisey@5918
    69
{
nathanheisey@5918
    70
	if (_this->gl_config.dll_handle != NULL) {
nathanheisey@5918
    71
		void *location = NULL;
nathanheisey@5918
    72
		status_t err;
nathanheisey@5918
    73
		if ((err =
nathanheisey@5918
    74
			get_image_symbol((image_id) _this->gl_config.dll_handle,
nathanheisey@5918
    75
                              proc, B_SYMBOL_TYPE_ANY,
nathanheisey@5918
    76
                              &location)) == B_OK) {
nathanheisey@5918
    77
            return location;
nathanheisey@5918
    78
        } else {
nathanheisey@5918
    79
                SDL_SetError("Couldn't find OpenGL symbol");
nathanheisey@5918
    80
                return NULL;
nathanheisey@5918
    81
        }
nathanheisey@5918
    82
	} else {
nathanheisey@5918
    83
		SDL_SetError("OpenGL library not loaded");
nathanheisey@5918
    84
		return NULL;
nathanheisey@5918
    85
	}
nathanheisey@5918
    86
}
nathanheisey@5918
    87
nathanheisey@5918
    88
nathanheisey@5934
    89
nathanheisey@5934
    90
nathanheisey@5934
    91
void BE_GL_SwapWindow(_THIS, SDL_Window * window) {
nathanheisey@5934
    92
    _ToBeWin(window)->SwapBuffers();
nathanheisey@5934
    93
}
nathanheisey@5934
    94
nathanheisey@5934
    95
int BE_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) {
nathanheisey@5934
    96
	_GetBeApp()->SetCurrentContext(((SDL_BWin*)context)->GetGLView());
nathanheisey@5934
    97
	return 0;
nathanheisey@5934
    98
}
nathanheisey@5934
    99
nathanheisey@5934
   100
nathanheisey@5934
   101
SDL_GLContext BE_GL_CreateContext(_THIS, SDL_Window * window) {
nathanheisey@5934
   102
	/* FIXME: Not sure what flags should be included here; may want to have
nathanheisey@5934
   103
	   most of them */
nathanheisey@5934
   104
	SDL_BWin *bwin = _ToBeWin(window);
nathanheisey@5938
   105
	bwin->CreateGLView(BGL_FLAGS);
nathanheisey@5934
   106
	return (SDL_GLContext)(bwin);
nathanheisey@5934
   107
}
nathanheisey@5934
   108
nathanheisey@5934
   109
void BE_GL_DeleteContext(_THIS, SDL_GLContext context) {
nathanheisey@5934
   110
	/* Currently, automatically unlocks the view */
nathanheisey@5934
   111
	((SDL_BWin*)context)->RemoveGLView();
nathanheisey@5934
   112
}
nathanheisey@5934
   113
nathanheisey@5934
   114
nathanheisey@5934
   115
int BE_GL_SetSwapInterval(_THIS, int interval) {
nathanheisey@5939
   116
	/* TODO: Implement this, if necessary? */
nathanheisey@5934
   117
	return 0;
nathanheisey@5934
   118
}
nathanheisey@5934
   119
nathanheisey@5934
   120
int BE_GL_GetSwapInterval(_THIS) {
nathanheisey@5939
   121
	/* TODO: Implement this, if necessary? */
nathanheisey@5934
   122
	return 0;
nathanheisey@5934
   123
}
nathanheisey@5934
   124
nathanheisey@5934
   125
nathanheisey@5934
   126
void BE_GL_UnloadLibrary(_THIS) {
nathanheisey@5939
   127
	/* TODO: Implement this, if necessary? */
nathanheisey@5934
   128
}
nathanheisey@5934
   129
nathanheisey@5934
   130
nathanheisey@5939
   131
/* FIXME: This function is meant to clear the OpenGL context when the video
nathanheisey@5939
   132
   mode changes (see SDL_bmodes.cc), but it doesn't seem to help, and is not
nathanheisey@5939
   133
   currently in use. */
nathanheisey@5938
   134
void BE_GL_RebootContexts(_THIS) {
nathanheisey@5938
   135
	SDL_Window *window = _this->windows;
nathanheisey@5938
   136
	while(window) {
nathanheisey@5938
   137
		SDL_BWin *bwin = _ToBeWin(window);
nathanheisey@5938
   138
		if(bwin->GetGLView()) {
nathanheisey@5938
   139
			bwin->LockLooper();
nathanheisey@5938
   140
			bwin->RemoveGLView();
nathanheisey@5938
   141
			bwin->CreateGLView(BGL_FLAGS);
nathanheisey@5938
   142
			bwin->UnlockLooper();
nathanheisey@5938
   143
		}
nathanheisey@5938
   144
		window = window->next;
nathanheisey@5938
   145
	}
nathanheisey@5938
   146
}
nathanheisey@5934
   147
nathanheisey@5934
   148
nathanheisey@5918
   149
#if 0 /* Functions from 1.2 that do not appear to be used in 1.3 */
nathanheisey@5918
   150
nathanheisey@5918
   151
    int BE_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value)
nathanheisey@5918
   152
    {
nathanheisey@5918
   153
        /*
nathanheisey@5918
   154
           FIXME? Right now BE_GL_GetAttribute shouldn't be called between glBegin() and glEnd() - it doesn't use "cached" values
nathanheisey@5918
   155
         */
nathanheisey@5918
   156
        switch (attrib) {
nathanheisey@5918
   157
        case SDL_GL_RED_SIZE:
nathanheisey@5918
   158
            glGetIntegerv(GL_RED_BITS, (GLint *) value);
nathanheisey@5918
   159
            break;
nathanheisey@5918
   160
        case SDL_GL_GREEN_SIZE:
nathanheisey@5918
   161
            glGetIntegerv(GL_GREEN_BITS, (GLint *) value);
nathanheisey@5918
   162
            break;
nathanheisey@5918
   163
        case SDL_GL_BLUE_SIZE:
nathanheisey@5918
   164
            glGetIntegerv(GL_BLUE_BITS, (GLint *) value);
nathanheisey@5918
   165
            break;
nathanheisey@5918
   166
        case SDL_GL_ALPHA_SIZE:
nathanheisey@5918
   167
            glGetIntegerv(GL_ALPHA_BITS, (GLint *) value);
nathanheisey@5918
   168
            break;
nathanheisey@5918
   169
        case SDL_GL_DOUBLEBUFFER:
nathanheisey@5918
   170
            glGetBooleanv(GL_DOUBLEBUFFER, (GLboolean *) value);
nathanheisey@5918
   171
            break;
nathanheisey@5918
   172
        case SDL_GL_BUFFER_SIZE:
nathanheisey@5918
   173
            int v;
nathanheisey@5918
   174
            glGetIntegerv(GL_RED_BITS, (GLint *) & v);
nathanheisey@5918
   175
            *value = v;
nathanheisey@5918
   176
            glGetIntegerv(GL_GREEN_BITS, (GLint *) & v);
nathanheisey@5918
   177
            *value += v;
nathanheisey@5918
   178
            glGetIntegerv(GL_BLUE_BITS, (GLint *) & v);
nathanheisey@5918
   179
            *value += v;
nathanheisey@5918
   180
            glGetIntegerv(GL_ALPHA_BITS, (GLint *) & v);
nathanheisey@5918
   181
            *value += v;
nathanheisey@5918
   182
            break;
nathanheisey@5918
   183
        case SDL_GL_DEPTH_SIZE:
nathanheisey@5918
   184
            glGetIntegerv(GL_DEPTH_BITS, (GLint *) value);      /* Mesa creates 16 only? r5 always 32 */
nathanheisey@5918
   185
            break;
nathanheisey@5918
   186
        case SDL_GL_STENCIL_SIZE:
nathanheisey@5918
   187
            glGetIntegerv(GL_STENCIL_BITS, (GLint *) value);
nathanheisey@5918
   188
            break;
nathanheisey@5918
   189
        case SDL_GL_ACCUM_RED_SIZE:
nathanheisey@5918
   190
            glGetIntegerv(GL_ACCUM_RED_BITS, (GLint *) value);
nathanheisey@5918
   191
            break;
nathanheisey@5918
   192
        case SDL_GL_ACCUM_GREEN_SIZE:
nathanheisey@5918
   193
            glGetIntegerv(GL_ACCUM_GREEN_BITS, (GLint *) value);
nathanheisey@5918
   194
            break;
nathanheisey@5918
   195
        case SDL_GL_ACCUM_BLUE_SIZE:
nathanheisey@5918
   196
            glGetIntegerv(GL_ACCUM_BLUE_BITS, (GLint *) value);
nathanheisey@5918
   197
            break;
nathanheisey@5918
   198
        case SDL_GL_ACCUM_ALPHA_SIZE:
nathanheisey@5918
   199
            glGetIntegerv(GL_ACCUM_ALPHA_BITS, (GLint *) value);
nathanheisey@5918
   200
            break;
nathanheisey@5918
   201
        case SDL_GL_STEREO:
nathanheisey@5918
   202
        case SDL_GL_MULTISAMPLEBUFFERS:
nathanheisey@5918
   203
        case SDL_GL_MULTISAMPLESAMPLES:
nathanheisey@5918
   204
        default:
nathanheisey@5918
   205
            *value = 0;
nathanheisey@5918
   206
            return (-1);
nathanheisey@5918
   207
        }
nathanheisey@5918
   208
        return 0;
nathanheisey@5918
   209
    }
nathanheisey@5918
   210
nathanheisey@5931
   211
#endif
nathanheisey@5931
   212
nathanheisey@5931
   213
nathanheisey@5931
   214
nathanheisey@5919
   215
#ifdef __cplusplus
nathanheisey@5919
   216
}
nathanheisey@5919
   217
#endif
slouken@6044
   218
slouken@6044
   219
#endif /* SDL_VIDEO_DRIVER_BWINDOW */