SDL_bopengl.cc
Go to the documentation of this file.
/*
Simple DirectMedia Layer
Copyright (C) 1997-2018 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 && SDL_VIDEO_OPENGL
#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
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 *) (size_t) 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) (size_t) _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;
}
}
int BE_GL_SwapWindow(_THIS, SDL_Window * window) {
_ToBeWin(window)->SwapBuffers();
return 0;
}
int BE_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) {
SDL_BWin* win = (SDL_BWin*)context;
_GetBeApp()->SetCurrentContext(win ? win->GetGLView() : NULL);
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);
Uint32 gl_flags = BGL_RGB;
if (_this->gl_config.alpha_size) {
gl_flags |= BGL_ALPHA;
}
if (_this->gl_config.depth_size) {
gl_flags |= BGL_DEPTH;
}
if (_this->gl_config.stencil_size) {
gl_flags |= BGL_STENCIL;
}
if (_this->gl_config.double_buffer) {
gl_flags |= BGL_DOUBLE;
} else {
gl_flags |= BGL_SINGLE;
}
if (_this->gl_config.accum_red_size ||
_this->gl_config.accum_green_size ||
_this->gl_config.accum_blue_size ||
_this->gl_config.accum_alpha_size) {
gl_flags |= BGL_ACCUM;
}
bwin->CreateGLView(gl_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 SDL_Unsupported();
}
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(bwin->GetGLType());
bwin->UnlockLooper();
}
window = window->next;
}
}
#ifdef __cplusplus
}
#endif
#endif /* SDL_VIDEO_DRIVER_HAIKU && SDL_VIDEO_OPENGL */
/* vi: set ts=4 sw=4 expandtab: */
SDL_Window::next
SDL_Window * next
Definition: SDL_sysvideo.h:114
SDL_strlcpy
#define SDL_strlcpy
Definition: SDL_dynapi_overrides.h:394
SDL_VideoDevice::accum_alpha_size
int accum_alpha_size
Definition: SDL_sysvideo.h:334
SDL_VideoDevice::accum_blue_size
int accum_blue_size
Definition: SDL_sysvideo.h:333
SDL_VideoDevice::accum_red_size
int accum_red_size
Definition: SDL_sysvideo.h:331
context
static screen_context_t context
Definition: video.c:25
SDL_BWin::GetGLView
BGLView * GetGLView()
Definition: SDL_BWin.h:449
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_BWin::GetGLType
Uint32 GetGLType()
Definition: SDL_BWin.h:450
_this
static SDL_VideoDevice * _this
Definition: SDL_video.c:121
SDL_BApp
Definition: SDL_BApp.h:81
SDL_GLContext
void * SDL_GLContext
An opaque handle to an OpenGL context.
Definition: SDL_video.h:175
SDL_VideoDevice::depth_size
int depth_size
Definition: SDL_sysvideo.h:327
_THIS
#define _THIS
Definition: SDL_alsa_audio.h:31
SDL_VideoDevice::double_buffer
int double_buffer
Definition: SDL_sysvideo.h:330
location
GLint location
Definition: SDL_opengl_glext.h:679
SDL_BWin::RemoveGLView
virtual void RemoveGLView()
Definition: SDL_BWin.h:148
SDL_VideoDevice::driver_loaded
int driver_loaded
Definition: SDL_sysvideo.h:349
SDL_VideoDevice::driver_path
char driver_path[256]
Definition: SDL_sysvideo.h:350
SDL_VideoDevice::dll_handle
void * dll_handle
Definition: SDL_sysvideo.h:351
SDL_VideoDevice::alpha_size
int alpha_size
Definition: SDL_sysvideo.h:326
SDL_VideoDevice::windows
SDL_Window * windows
Definition: SDL_sysvideo.h:313
SDL_VideoDevice::stencil_size
int stencil_size
Definition: SDL_sysvideo.h:329
NULL
#define NULL
Definition: begin_code.h:164
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_BWin
Definition: SDL_BWin.h:64
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_Window
The type used to identify a window.
Definition: SDL_sysvideo.h:73
SDL_BWin::CreateGLView
virtual BGLView * CreateGLView(Uint32 gl_flags)
Definition: SDL_BWin.h:132
SDL_bopengl.h
SDL_arraysize
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
SDL_INLINE
#define SDL_INLINE
Definition: begin_code.h:131
path
GLsizei const GLchar *const * path
Definition: SDL_opengl_glext.h:3730
SDL_VideoDevice::gl_config
struct SDL_VideoDevice::@34 gl_config
SDL_VideoDevice::accum_green_size
int accum_green_size
Definition: SDL_sysvideo.h:332
SDL_Window::driverdata
void * driverdata
Definition: SDL_sysvideo.h:111
SDL_BWin.h
SDL_Unsupported
#define SDL_Unsupported()
Definition: SDL_error.h:53