Commit 1ac1efb0 authored by Sam Lantinga's avatar Sam Lantinga

Date: Sat, 26 Jun 2004 14:58:42 +0300

From: "Mike Gorchak"
Subject: QNX 6.3 fixes for SDL

Sam, I've added new OpenGL framework for SDL, which appeared in the new QNX version - 6.3. I've leave compatibility with previous QNX versions. And I've moved all GL specific functions to the separate module, like it done for the other platforms.

SDL is now ready for the QNX 6.3 :)

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40911
parent 7a8d040a
......@@ -564,6 +564,10 @@ static void SDL_CreateShadowSurface(int depth)
return;
}
#ifdef __QNXNTO__
#include <sys/neutrino.h>
#endif /* __QNXNTO__ */
/*
* Set the requested video mode, allocating a shadow buffer if necessary.
*/
......@@ -738,22 +742,31 @@ SDL_Surface * SDL_SetVideoMode (int width, int height, int bpp, Uint32 flags)
#ifdef HAVE_OPENGL
/* Load GL symbols (before MakeCurrent, where we need glGetString). */
if ( flags & (SDL_OPENGL | SDL_OPENGLBLIT) ) {
#ifndef __QNXNTO__
#define SDL_PROC(ret,func,params) \
do { \
video->func = SDL_GL_GetProcAddress(#func); \
if ( ! video->func ) { \
SDL_SetError("Couldn't load GL function: %s\n", #func); \
return(NULL); \
} \
} while ( 0 );
#else
#define SDL_PROC(ret,func,params) video->func=func;
#ifdef __QNXNTO__
#if (_NTO_VERSION < 630)
#define __SDL_NOGETPROCADDR__
#endif /* 6.3.0 */
#endif /* __QNXNTO__ */
#ifdef __SDL_NOGETPROCADDR__
#define SDL_PROC(ret,func,params) video->func=func;
#else
#define SDL_PROC(ret,func,params) \
do { \
video->func = SDL_GL_GetProcAddress(#func); \
if ( ! video->func ) { \
SDL_SetError("Couldn't load GL function: %s\n", #func); \
return(NULL); \
} \
} while ( 0 );
#endif /* __SDL_NOGETPROCADDR__ */
#include "SDL_glfuncs.h"
#undef SDL_PROC
}
#endif
#endif /* HAVE_OPENGL */
/* If we're running OpenGL, make the context current */
if ( (video->screen->flags & SDL_OPENGL) &&
......
......@@ -16,6 +16,8 @@ PH_SRCS = \
SDL_ph_mouse_c.h \
SDL_ph_video.c \
SDL_ph_video.h \
SDL_ph_gl.c \
SDL_ph_gl.h \
SDL_ph_wm.c \
SDL_ph_wm_c.h \
SDL_phyuv.c \
......
......@@ -32,7 +32,6 @@ static char rcsid =
#include <stdio.h>
#include <setjmp.h>
#include <sys/time.h>
#include <sys/neutrino.h>
#include <Ph.h>
#include <photon/PkKeyDef.h>
......
This diff is collapsed.
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2004 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
#ifdef SAVE_RCSID
static char rcsid = "@(#) $Id$";
#endif
#ifndef __SDL_PH_GL_H__
#define __SDL_PH_GL_H__
#include "SDL_ph_video.h"
#define DEFAULT_OPENGL "/usr/lib/libGL.so"
#ifdef HAVE_OPENGL
void ph_GL_SwapBuffers(_THIS);
int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value);
int ph_GL_LoadLibrary(_THIS, const char* path);
void* ph_GL_GetProcAddress(_THIS, const char* proc);
int ph_GL_MakeCurrent(_THIS);
int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags);
#endif /* HAVE_OPENGL */
#endif /* __SDL_PH_GL_H__ */
......@@ -26,6 +26,7 @@ static char rcsid =
#endif
#include <stdlib.h>
#include <Ph.h>
#include <photon/Pg.h>
......@@ -34,8 +35,10 @@ static char rcsid =
#include "SDL_endian.h"
#include "SDL_video.h"
#include "SDL_pixels_c.h"
#include "SDL_ph_video.h"
#include "SDL_ph_image_c.h"
#include "SDL_ph_modes_c.h"
#include "SDL_ph_gl.h"
int ph_SetupImage(_THIS, SDL_Surface *screen)
{
......@@ -189,8 +192,8 @@ int ph_SetupFullScreenImage(_THIS, SDL_Surface* screen)
{
OCImage.flags = screen->flags;
/* Begin direct mode */
if (!ph_EnterFullScreen(this, screen))
/* Begin direct and fullscreen mode */
if (!ph_EnterFullScreen(this, screen, PH_ENTER_DIRECTMODE))
{
return -1;
}
......@@ -301,98 +304,30 @@ int ph_SetupFullScreenImage(_THIS, SDL_Surface* screen)
#ifdef HAVE_OPENGL
static int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags)
int ph_SetupOpenGLImage(_THIS, SDL_Surface* screen)
{
PhDim_t dim;
uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS];
int exposepost=0;
int OGLargc;
this->UpdateRects = ph_OpenGLUpdate;
screen->pixels=NULL;
screen->pitch=NULL;
dim.w=width;
dim.h=height;
if ((oglctx!=NULL) && (oglflags==flags) && (oglbpp==bpp))
{
PdOpenGLContextResize(oglctx, &dim);
PhDCSetCurrent(oglctx);
return 0;
}
else
{
if (oglctx!=NULL)
{
PhDCSetCurrent(NULL);
PhDCRelease(oglctx);
oglctx=NULL;
exposepost=1;
}
}
OGLargc=0;
if (this->gl_config.depth_size)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DEPTH_BITS;
OGLAttrib[OGLargc++]=this->gl_config.depth_size;
}
if (this->gl_config.stencil_size)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_STENCIL_BITS;
OGLAttrib[OGLargc++]=this->gl_config.stencil_size;
}
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FORCE_SW;
if (flags & SDL_FULLSCREEN)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN;
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DIRECT;
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_BEST;
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_CENTER;
}
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_NONE;
if (this->gl_config.double_buffer)
{
oglctx=PdCreateOpenGLContext(2, &dim, 0, OGLAttrib);
}
else
{
oglctx=PdCreateOpenGLContext(1, &dim, 0, OGLAttrib);
}
if (oglctx==NULL)
{
SDL_SetError("ph_SetupOpenGLContext(): cannot create OpenGL context !\n");
return (-1);
}
PhDCSetCurrent(oglctx);
PtFlush();
oglflags=flags;
oglbpp=bpp;
#if (_NTO_VERSION >= 630)
if ((screen->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN)
{
if (!ph_EnterFullScreen(this, screen, PH_IGNORE_DIRECTMODE))
{
screen->flags &= ~SDL_FULLSCREEN;
return -1;
}
}
#endif /* 6.3.0 */
if (exposepost!=0)
if (ph_SetupOpenGLContext(this, screen->w, screen->h, screen->format->BitsPerPixel, screen->flags)!=0)
{
/* OpenGL context has been recreated, so report about this fact */
SDL_PrivateExpose();
screen->flags &= ~SDL_OPENGL;
return -1;
}
return 0;
}
int ph_SetupOpenGLImage(_THIS, SDL_Surface* screen)
{
this->UpdateRects = ph_OpenGLUpdate;
screen->pixels=NULL;
screen->pitch=NULL;
if (ph_SetupOpenGLContext(this, screen->w, screen->h, screen->format->BitsPerPixel, screen->flags)!=0)
{
screen->flags &= ~SDL_OPENGL;
return -1;
}
return 0;
return 0;
}
#endif /* HAVE_OPENGL */
......@@ -405,12 +340,27 @@ void ph_DestroyImage(_THIS, SDL_Surface* screen)
{
if (oglctx)
{
PhDCSetCurrent(NULL);
PhDCRelease(oglctx);
#if (_NTO_VERSION < 630)
PhDCSetCurrent(NULL);
PhDCRelease(oglctx);
#else
qnxgl_context_destroy(oglctx);
qnxgl_buffers_destroy(oglbuffers);
qnxgl_finish();
#endif /* 6.3.0 */
oglctx=NULL;
oglbuffers=NULL;
oglflags=0;
oglbpp=0;
}
#if (_NTO_VERSION >= 630)
if (currently_fullscreen)
{
ph_LeaveFullScreen(this);
}
#endif /* 6.3.0 */
return;
}
#endif /* HAVE_OPENGL */
......
......@@ -253,7 +253,7 @@ int ph_ToggleFullScreen(_THIS, int on)
return -1;
}
int ph_EnterFullScreen(_THIS, SDL_Surface* screen)
int ph_EnterFullScreen(_THIS, SDL_Surface* screen, int fmode)
{
PgDisplaySettings_t settings;
int mode;
......@@ -326,24 +326,30 @@ int ph_EnterFullScreen(_THIS, SDL_Surface* screen)
if ((this->screen->flags & SDL_OPENGL)==SDL_OPENGL)
{
#ifdef HAVE_OPENGL
#endif /* HAVE_OPENGL */
#if (_NTO_VERSION < 630)
return 0;
#endif /* 6.3.0 */
#else
return 0;
#endif /* HAVE_OPENGL */
}
}
if (OCImage.direct_context==NULL)
if (fmode==0)
{
OCImage.direct_context=(PdDirectContext_t*)PdCreateDirectContext();
if (!OCImage.direct_context)
if (OCImage.direct_context==NULL)
{
SDL_SetError("ph_EnterFullScreen(): Can't create direct context !\n");
ph_LeaveFullScreen(this);
return 0;
OCImage.direct_context=(PdDirectContext_t*)PdCreateDirectContext();
if (!OCImage.direct_context)
{
SDL_SetError("ph_EnterFullScreen(): Can't create direct context !\n");
ph_LeaveFullScreen(this);
return 0;
}
}
OCImage.oldDC=PdDirectStart(OCImage.direct_context);
}
OCImage.oldDC=PdDirectStart(OCImage.direct_context);
currently_fullscreen = 1;
}
PgFlush();
......@@ -360,10 +366,15 @@ int ph_LeaveFullScreen(_THIS)
if ((this->screen) && ((this->screen->flags & SDL_OPENGL)==SDL_OPENGL))
{
#ifdef HAVE_OPENGL
#if (_NTO_VERSION < 630)
return 0;
#endif /* 6.3.0 */
#else
return 0;
#endif /* HAVE_OPENGL */
return 0;
}
else
/* release routines starts here */
{
if (OCImage.direct_context)
{
......
......@@ -32,10 +32,13 @@ static char rcsid =
#define PH_MAX_VIDEOMODES 127
#define PH_ENTER_DIRECTMODE 0
#define PH_IGNORE_DIRECTMODE 1
extern SDL_Rect **ph_ListModes(_THIS,SDL_PixelFormat *format, Uint32 flags);
extern void ph_FreeVideoModes(_THIS);
extern int ph_ResizeFullScreen(_THIS);
extern int ph_EnterFullScreen(_THIS, SDL_Surface* screen);
extern int ph_EnterFullScreen(_THIS, SDL_Surface* screen, int fmode);
extern int ph_LeaveFullScreen(_THIS);
extern int ph_GetVideoMode(int width, int height, int bpp);
extern int get_mode_any_format(int width, int height, int bpp);
......
......@@ -47,6 +47,7 @@ static char rcsid =
#include "SDL_ph_events_c.h"
#include "SDL_ph_mouse_c.h"
#include "SDL_ph_wm_c.h"
#include "SDL_ph_gl.h"
#include "SDL_phyuv_c.h"
#include "blank_cursor.h"
......@@ -56,14 +57,6 @@ static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
static void ph_VideoQuit(_THIS);
static void ph_DeleteDevice(SDL_VideoDevice *device);
#ifdef HAVE_OPENGL
static void ph_GL_SwapBuffers(_THIS);
static int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value);
static int ph_GL_LoadLibrary(_THIS, const char* path);
static void* ph_GL_GetProcAddress(_THIS, const char* proc);
static int ph_GL_MakeCurrent(_THIS);
#endif /* HAVE_OPENGL */
static int phstatus=-1;
static int ph_Available(void)
......@@ -376,6 +369,7 @@ static int ph_VideoInit(_THIS, SDL_PixelFormat* vformat)
#ifdef HAVE_OPENGL
oglctx=NULL;
oglbuffers=NULL;
oglflags=0;
oglbpp=0;
#endif /* HAVE_OPENGL */
......@@ -663,57 +657,3 @@ static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
return 1;
}
#ifdef HAVE_OPENGL
static void ph_GL_SwapBuffers(_THIS)
{
PgSetRegion(PtWidgetRid(window));
PdOpenGLContextSwapBuffers(oglctx);
}
static int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)
{
switch (attrib)
{
case SDL_GL_DOUBLEBUFFER:
*value=this->gl_config.double_buffer;
break;
case SDL_GL_STENCIL_SIZE:
*value=this->gl_config.stencil_size;
break;
case SDL_GL_DEPTH_SIZE:
*value=this->gl_config.depth_size;
break;
default:
*value=0;
return(-1);
}
return 0;
}
static int ph_GL_LoadLibrary(_THIS, const char* path)
{
/* if code compiled with HAVE_OPENGL, that mean that library already linked */
this->gl_config.driver_loaded = 1;
return 0;
}
static void* ph_GL_GetProcAddress(_THIS, const char* proc)
{
return NULL;
}
static int ph_GL_MakeCurrent(_THIS)
{
PgSetRegion(PtWidgetRid(window));
if (oglctx!=NULL)
{
PhDCSetCurrent(oglctx);
}
return 0;
}
#endif /* HAVE_OPENGL */
......@@ -26,13 +26,20 @@
#include "SDL_mouse.h"
#include "SDL_sysvideo.h"
#include <sys/neutrino.h>
#include <Ph.h>
#include <Pt.h>
#include <photon/Pg.h>
#include <photon/PdDirect.h>
#ifdef HAVE_OPENGL
#include <photon/PdGL.h>
#if (_NTO_VERSION < 630)
#include <photon/PdGL.h>
#else
#include <GL/qnxgl.h>
#include <GL/GLPh.h>
#endif /* 6.3.0 */
#endif /* HAVE_OPENGL */
/* Hidden "this" pointer for the video functions */
......@@ -68,7 +75,14 @@ struct SDL_PrivateVideoData
PtWidget_t *Window; /* used to handle input events */
PhImage_t *image; /* used to display image */
#ifdef HAVE_OPENGL
PdOpenGLContext_t* OGLContext; /* OpenGL context */
#if (_NTO_VERSION < 630)
PdOpenGLContext_t* OGLContext; /* OpenGL context */
void* OGLBuffers; /* OpenGL buffers (unused) */
#else
qnxglc_t* OGLContext; /* OpenGL context for the 6.3 */
qnxgl_bufs_t* OGLBuffers; /* OpenGL buffers for the 6.3 */
#endif /* 630 */
Uint32 OGLFlags; /* OpenGL flags */
Uint32 OGLBPP; /* OpenGL bpp */
#endif /* HAVE_OPENGL */
......@@ -134,6 +148,7 @@ struct SDL_PrivateVideoData
#ifdef HAVE_OPENGL
#define oglctx (this->hidden->OGLContext)
#define oglbuffers (this->hidden->OGLBuffers)
#define oglflags (this->hidden->OGLFlags)
#define oglbpp (this->hidden->OGLBPP)
#endif /* HAVE_OPENGL */
......
......@@ -89,8 +89,10 @@ int main(int argc,char *argv[])
SDL_Event event;
int done=0;
GLfloat pixels[NB_PIXELS*3];
#ifdef _WIN32
#if defined(_WIN32)
char *gl_library = "OpenGL32.DLL";
#elif defined(__QNXNTO__)
char *gl_library = "libGL.so.3";
#else
char *gl_library = "libGL.so.1";
#endif
......@@ -123,6 +125,9 @@ int main(int argc,char *argv[])
exit(1);
}
/* Set the window manager title bar */
SDL_WM_SetCaption( "SDL Dynamic OpenGL Loading Test", "testdyngl" );
init_glfuncs(&f);
for(i=0;i<NB_PIXELS;i++)
......
......@@ -744,7 +744,7 @@ int main(int argc, char *argv[])
}
if ( strncmp(argv[i], "-h", 2) == 0 ) {
printf(
"Usage: %s [-twice] [-logo] [-slow] [-bpp n] [-gamma n] [-noframe] [-fsaa]\n",
"Usage: %s [-twice] [-logo] [-slow] [-bpp n] [-gamma n] [-noframe] [-fsaa] [-fullscreen]\n",
argv[0]);
exit(0);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment