SDL_bopengl.cc
Go to the documentation of this file.
/*
Simple DirectMedia Layer
Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "../../SDL_internal.h"
#if SDL_VIDEO_DRIVER_HAIKU
#include "SDL_bopengl.h"
#include <unistd.h>
#include <KernelKit.h>
#include <OpenGLKit.h>
#include "SDL_BWin.h"
#include "../../main/haiku/SDL_BApp.h"
#ifdef __cplusplus
extern "C" {
#endif
#define BGL_FLAGS BGL_RGB | BGL_DOUBLE
static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) {
return ((SDL_BWin*)(window->driverdata));
}
static SDL_INLINE SDL_BApp *_GetBeApp() {
return ((SDL_BApp*)be_app);
}
/* Passing a NULL path means load pointers from the application */
int BE_GL_LoadLibrary(_THIS, const char *path)
{
/* FIXME: Is this working correctly? */
image_info info;
int32 cookie = 0;
while (get_next_image_info(0, &cookie, &info) == B_OK) {
void *location = NULL;
if( get_image_symbol(info.id, "glBegin", B_SYMBOL_TYPE_ANY,
&location) == B_OK) {
_this->gl_config.dll_handle = (void *) info.id;
_this->gl_config.driver_loaded = 1;
SDL_strlcpy(_this->gl_config.driver_path, "libGL.so",
SDL_arraysize(_this->gl_config.driver_path));
}
}
return 0;
}
void *BE_GL_GetProcAddress(_THIS, const char *proc)
{
if (_this->gl_config.dll_handle != NULL) {
void *location = NULL;
status_t err;
if ((err =
get_image_symbol((image_id) _this->gl_config.dll_handle,
proc, B_SYMBOL_TYPE_ANY,
&location)) == B_OK) {
return location;
} else {
SDL_SetError("Couldn't find OpenGL symbol");
return NULL;
}
} else {
SDL_SetError("OpenGL library not loaded");
return NULL;
}
}
void BE_GL_SwapWindow(_THIS, SDL_Window * window) {
_ToBeWin(window)->SwapBuffers();
}
int BE_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) {
_GetBeApp()->SetCurrentContext(((SDL_BWin*)context)->GetGLView());
return 0;
}
SDL_GLContext BE_GL_CreateContext(_THIS, SDL_Window * window) {
/* FIXME: Not sure what flags should be included here; may want to have
most of them */
SDL_BWin *bwin = _ToBeWin(window);
bwin->CreateGLView(BGL_FLAGS);
return (SDL_GLContext)(bwin);
}
void BE_GL_DeleteContext(_THIS, SDL_GLContext context) {
/* Currently, automatically unlocks the view */
((SDL_BWin*)context)->RemoveGLView();
}
int BE_GL_SetSwapInterval(_THIS, int interval) {
/* TODO: Implement this, if necessary? */
return 0;
}
int BE_GL_GetSwapInterval(_THIS) {
/* TODO: Implement this, if necessary? */
return 0;
}
void BE_GL_UnloadLibrary(_THIS) {
/* TODO: Implement this, if necessary? */
}
/* FIXME: This function is meant to clear the OpenGL context when the video
mode changes (see SDL_bmodes.cc), but it doesn't seem to help, and is not
currently in use. */
void BE_GL_RebootContexts(_THIS) {
SDL_Window *window = _this->windows;
while(window) {
SDL_BWin *bwin = _ToBeWin(window);
if(bwin->GetGLView()) {
bwin->LockLooper();
bwin->RemoveGLView();
bwin->CreateGLView(BGL_FLAGS);
bwin->UnlockLooper();
}
window = window->next;
}
}
#if 0 /* Functions from 1.2 that do not appear to be used in 1.3 */
int BE_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value)
{
/*
FIXME? Right now BE_GL_GetAttribute shouldn't be called between glBegin() and glEnd() - it doesn't use "cached" values
*/
switch (attrib) {
case SDL_GL_RED_SIZE:
glGetIntegerv(GL_RED_BITS, (GLint *) value);
break;
case SDL_GL_GREEN_SIZE:
glGetIntegerv(GL_GREEN_BITS, (GLint *) value);
break;
case SDL_GL_BLUE_SIZE:
glGetIntegerv(GL_BLUE_BITS, (GLint *) value);
break;
case SDL_GL_ALPHA_SIZE:
glGetIntegerv(GL_ALPHA_BITS, (GLint *) value);
break;
case SDL_GL_DOUBLEBUFFER:
glGetBooleanv(GL_DOUBLEBUFFER, (GLboolean *) value);
break;
case SDL_GL_BUFFER_SIZE:
int v;
glGetIntegerv(GL_RED_BITS, (GLint *) & v);
*value = v;
glGetIntegerv(GL_GREEN_BITS, (GLint *) & v);
*value += v;
glGetIntegerv(GL_BLUE_BITS, (GLint *) & v);
*value += v;
glGetIntegerv(GL_ALPHA_BITS, (GLint *) & v);
*value += v;
break;
case SDL_GL_DEPTH_SIZE:
glGetIntegerv(GL_DEPTH_BITS, (GLint *) value); /* Mesa creates 16 only? r5 always 32 */
break;
case SDL_GL_STENCIL_SIZE:
glGetIntegerv(GL_STENCIL_BITS, (GLint *) value);
break;
case SDL_GL_ACCUM_RED_SIZE:
glGetIntegerv(GL_ACCUM_RED_BITS, (GLint *) value);
break;
case SDL_GL_ACCUM_GREEN_SIZE:
glGetIntegerv(GL_ACCUM_GREEN_BITS, (GLint *) value);
break;
case SDL_GL_ACCUM_BLUE_SIZE:
glGetIntegerv(GL_ACCUM_BLUE_BITS, (GLint *) value);
break;
case SDL_GL_ACCUM_ALPHA_SIZE:
glGetIntegerv(GL_ACCUM_ALPHA_BITS, (GLint *) value);
break;
case SDL_GL_STEREO:
case SDL_GL_MULTISAMPLEBUFFERS:
case SDL_GL_MULTISAMPLESAMPLES:
default:
*value = 0;
return (-1);
}
return 0;
}
#endif
#ifdef __cplusplus
}
#endif
#endif /* SDL_VIDEO_DRIVER_HAIKU */
SDL_Window::next
SDL_Window * next
Definition: SDL_sysvideo.h:109
GL_STENCIL_BITS
#define GL_STENCIL_BITS
Definition: SDL_opengl.h:467
SDL_strlcpy
#define SDL_strlcpy
Definition: SDL_dynapi_overrides.h:400
BE_GL_LoadLibrary
int BE_GL_LoadLibrary(_THIS, const char *path)
BE_GL_UnloadLibrary
void BE_GL_UnloadLibrary(_THIS)
GL_DOUBLEBUFFER
#define GL_DOUBLEBUFFER
Definition: SDL_opengl.h:514
SDL_GL_ACCUM_RED_SIZE
Definition: SDL_video.h:179
SDL_GL_ACCUM_BLUE_SIZE
Definition: SDL_video.h:181
BE_GL_GetProcAddress
void * BE_GL_GetProcAddress(_THIS, const char *proc)
BE_GL_DeleteContext
void BE_GL_DeleteContext(_THIS, SDL_GLContext context)
window
SDL_Window * window
Definition: testautomation_render.c:26
BE_GL_RebootContexts
void BE_GL_RebootContexts(_THIS)
GL_RED_BITS
#define GL_RED_BITS
Definition: SDL_opengl.h:506
GLint
int GLint
Definition: SDL_opengl.h:175
BE_GL_CreateContext
SDL_GLContext BE_GL_CreateContext(_THIS, SDL_Window *window)
SDL_GL_ACCUM_ALPHA_SIZE
Definition: SDL_video.h:182
SDL_BWin::GetGLView
BGLView * GetGLView()
Definition: SDL_BWin.h:426
GL_DEPTH_BITS
#define GL_DEPTH_BITS
Definition: SDL_opengl.h:321
SDL_GL_RED_SIZE
Definition: SDL_video.h:171
GL_ACCUM_ALPHA_BITS
#define GL_ACCUM_ALPHA_BITS
Definition: SDL_opengl.h:376
SDL_GL_STEREO
Definition: SDL_video.h:183
_this
static SDL_VideoDevice * _this
Definition: SDL_video.c:114
SDL_VideoDevice::gl_config
struct SDL_VideoDevice::@29 gl_config
SDL_GLattr
SDL_GLattr
OpenGL configuration attributes.
Definition: SDL_video.h:169
v
const GLdouble * v
Definition: SDL_opengl.h:2057
GL_BLUE_BITS
#define GL_BLUE_BITS
Definition: SDL_opengl.h:508
SDL_BApp
Definition: SDL_BApp.h:80
SDL_GLContext
void * SDL_GLContext
An opaque handle to an OpenGL context.
Definition: SDL_video.h:164
SDL_GL_STENCIL_SIZE
Definition: SDL_video.h:178
value
GLsizei const GLfloat * value
Definition: SDL_opengl_glext.h:698
SDL_GL_MULTISAMPLEBUFFERS
Definition: SDL_video.h:184
_THIS
#define _THIS
Definition: SDL_alsa_audio.h:31
GL_ALPHA_BITS
#define GL_ALPHA_BITS
Definition: SDL_opengl.h:505
location
GLint location
Definition: SDL_opengl_glext.h:679
SDL_BWin::RemoveGLView
virtual void RemoveGLView()
Definition: SDL_BWin.h:143
SDL_VideoDevice::driver_loaded
int driver_loaded
Definition: SDL_sysvideo.h:315
SDL_VideoDevice::driver_path
char driver_path[256]
Definition: SDL_sysvideo.h:316
SDL_GL_ALPHA_SIZE
Definition: SDL_video.h:174
SDL_VideoDevice::dll_handle
void * dll_handle
Definition: SDL_sysvideo.h:317
BE_GL_GetSwapInterval
int BE_GL_GetSwapInterval(_THIS)
GL_ACCUM_RED_BITS
#define GL_ACCUM_RED_BITS
Definition: SDL_opengl.h:373
SDL_VideoDevice::windows
SDL_Window * windows
Definition: SDL_sysvideo.h:281
SDL_GL_ACCUM_GREEN_SIZE
Definition: SDL_video.h:180
SDL_GL_DEPTH_SIZE
Definition: SDL_video.h:177
glGetBooleanv
GLAPI void GLAPIENTRY glGetBooleanv(GLenum pname, GLboolean *params)
GL_ACCUM_GREEN_BITS
#define GL_ACCUM_GREEN_BITS
Definition: SDL_opengl.h:374
SDL_GL_DOUBLEBUFFER
Definition: SDL_video.h:176
glGetIntegerv
GLAPI void GLAPIENTRY glGetIntegerv(GLenum pname, GLint *params)
NULL
#define NULL
Definition: begin_code.h:143
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:36
SDL_BWin
Definition: SDL_BWin.h:63
BE_GL_SetSwapInterval
int BE_GL_SetSwapInterval(_THIS, int interval)
GL_ACCUM_BLUE_BITS
#define GL_ACCUM_BLUE_BITS
Definition: SDL_opengl.h:375
SDL_Window
The type used to identify a window.
Definition: SDL_sysvideo.h:71
GLboolean
unsigned char GLboolean
Definition: SDL_opengl.h:170
SDL_BWin::CreateGLView
virtual BGLView * CreateGLView(Uint32 gl_flags)
Definition: SDL_BWin.h:128
SDL_GL_MULTISAMPLESAMPLES
Definition: SDL_video.h:185
BE_GL_MakeCurrent
int BE_GL_MakeCurrent(_THIS, SDL_Window *window, SDL_GLContext context)
SDL_bopengl.h
SDL_arraysize
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
SDL_INLINE
#define SDL_INLINE
Definition: begin_code.h:120
path
GLsizei const GLchar *const * path
Definition: SDL_opengl_glext.h:3730
SDL_Window::driverdata
void * driverdata
Definition: SDL_sysvideo.h:106
GL_GREEN_BITS
#define GL_GREEN_BITS
Definition: SDL_opengl.h:507
SDL_GL_GREEN_SIZE
Definition: SDL_video.h:172
BE_GL_SwapWindow
void BE_GL_SwapWindow(_THIS, SDL_Window *window)
SDL_GL_BLUE_SIZE
Definition: SDL_video.h:173
SDL_BWin.h
SDL_GL_BUFFER_SIZE
Definition: SDL_video.h:175