Mike Gorchak added some QNX tweaks, including OpenGL support
authorSam Lantinga <slouken@libsdl.org>
Thu, 14 Feb 2002 02:15:15 +0000
changeset 279 04351f59b051
parent 278 dcd9f7b50a1c
child 280 0ddcea45d829
Mike Gorchak added some QNX tweaks, including OpenGL support
BUGS
README.QNX
configure.in
src/video/photon/SDL_ph_video.c
--- a/BUGS	Thu Feb 14 01:24:08 2002 +0000
+++ b/BUGS	Thu Feb 14 02:15:15 2002 +0000
@@ -190,10 +190,6 @@
 	http://www.kom.e-technik.tu-darmstadt.de/~griff/SDL/
 
 QNX:  -= NOT YET SUPPORTED =-
-	Configuration doesn't work right, Makefiles still need to be
-	tweaked (need to add libraries to any apps that use sdl_config
-	to figure out what libs they need).
- 
 	Only static libraries are being made, no shared ones.
  
 	The only hardware surface is the primary view surface.
@@ -204,9 +200,6 @@
  
 	The software surfaces could use some speed up.
  
-	It doesn't look like the OpenGL stuff is there. (did a grep for
-	PdCreateOpenGLContext, nothing found).
- 
 	The mouse cursor doesn't look right.
 
 AmigaOS:  -= NOT YET SUPPORTED =-
--- a/README.QNX	Thu Feb 14 01:24:08 2002 +0000
+++ b/README.QNX	Thu Feb 14 02:15:15 2002 +0000
@@ -3,17 +3,34 @@
     Experimentally added OpenGL support in window mode (in fullscreen
 mode not yet). If you have QNX RtP v6.1.0 w/ or w/o Patch A you  need
 to download new Photon3D runtime from http://developers.qnx.com.  The
-versions of OS before 6.1.0 is not supported. OpenGL support is  very
-raw. It is often fail.
+versions of OS before 6.1.0 is not supported.
+
+Problems:
+1. OpenGL support is very raw. It is often fail. Update function has
+   not been written yet. Fullscreen mode has not been written yet.
+2. Photon has some errors in detecting how much bits per pixel has
+   videomode, creating images with different color depth.
+3. No shared libraries yet. We need manually set flags as
+   --disable-shared.
 
 Some building issues:
 
     Run configure script without x11 support, e.g.:
 
-    ./configure --prefix=/usr/local --disable-video-x11
+    a) for OpenGL support:
+    ./configure --prefix=/usr/local \
+                --disable-video-x11 \
+                --disable-shared
+
+    a) without OpenGL support:
+    ./configure --prefix=/usr/local \
+                --disable-video-x11 \
+                --disable-shared    \
+                --disable-video-opengl
 
     In test directory also run ./configure script without x11 support, e.g.:
 
     ./configure  --with-sdl-prefix=/usr/local      \
                  --with-sdl-exec-prefix=/usr/local \
                  --prefix=/usr/local --without-x
+
--- a/configure.in	Thu Feb 14 01:24:08 2002 +0000
+++ b/configure.in	Thu Feb 14 02:15:15 2002 +0000
@@ -647,6 +647,7 @@
         fi
     fi
 }
+
 CheckPHOTON()
 {
     AC_ARG_ENABLE(video-photon,
@@ -671,6 +672,7 @@
             SYSTEM_LIBS="$SYSTEM_LIBS -lph"
             VIDEO_SUBDIRS="$VIDEO_SUBDIRS photon"
             VIDEO_DRIVERS="$VIDEO_DRIVERS photon/libvideo_photon.la"
+            CheckOpenGLQNX
         fi
     fi
 }
@@ -947,6 +949,26 @@
     fi
 }
 
+dnl Find QNX RtP OpenGL
+CheckOpenGLQNX()
+{
+    if test x$enable_video = xyes -a x$enable_video_opengl = xyes; then
+        AC_MSG_CHECKING(for OpenGL (Photon) support)
+        video_opengl=no
+        AC_TRY_COMPILE([
+         #include <GL/gl.h>
+        ],[
+        ],[
+        video_opengl=yes
+        ])
+        AC_MSG_RESULT($video_opengl)
+        if test x$video_opengl = xyes; then
+            CFLAGS="$CFLAGS -DHAVE_OPENGL"
+            SYSTEM_LIBS="$SYSTEM_LIBS -lGL"
+        fi
+    fi
+}
+
 dnl Check for BeOS OpenGL
 CheckBeGL()
 {
@@ -2162,6 +2184,7 @@
 AM_CONDITIONAL(TARGET_BEOS, test $ARCH = beos)
 AM_CONDITIONAL(TARGET_MACOS, test $ARCH = macos)
 AM_CONDITIONAL(TARGET_MACOSX, test $ARCH = macosx)
+AM_CONDITIONAL(TARGET_QNX, test $ARCH = qnx)
 
 # Set conditional variables for shared and static library selection.
 # These are not used in any Makefile.am but in sdl-config.in.
--- a/src/video/photon/SDL_ph_video.c	Thu Feb 14 01:24:08 2002 +0000
+++ b/src/video/photon/SDL_ph_video.c	Thu Feb 14 02:15:15 2002 +0000
@@ -58,7 +58,9 @@
 static void ph_DeleteDevice(SDL_VideoDevice *device);
 static void ph_GL_SwapBuffers(_THIS);
 
+#ifdef HAVE_OPENGL
 PdOpenGLContext_t* OGLContext=NULL;
+#endif /* HAVE_OPENGL */
 
 static int ph_Available(void)
 {
@@ -85,7 +87,7 @@
     memset(device->hidden, 0, (sizeof *device->hidden));
 
     /* Set the driver flags */
-    device->handles_any_size = 1; //JB not true for fullscreen
+    device->handles_any_size = 1; /* JB not true for fullscreen */
 
     /* Set the function pointers */
     device->CreateYUVOverlay = ph_CreateYUVOverlay;
@@ -95,7 +97,7 @@
     device->ToggleFullScreen =  ph_ToggleFullScreen;
     device->UpdateMouse = NULL;	
     device->SetColors = ph_SetColors;
-    device->UpdateRects =  NULL; //set in ph_ResizeImage
+    device->UpdateRects = NULL; /* ph_ResizeImage; */
     device->VideoQuit = ph_VideoQuit;
     device->AllocHWSurface = ph_AllocHWSurface;
     device->CheckHWBlit = NULL;
@@ -119,12 +121,16 @@
     device->InitOSKeymap = ph_InitOSKeymap;
     device->PumpEvents = ph_PumpEvents;
 
-    // OpenGL support.
+    /* OpenGL support. */
     device->GL_LoadLibrary = NULL;
     device->GL_GetProcAddress = NULL;
     device->GL_GetAttribute = NULL;
     device->GL_MakeCurrent = NULL;
+#ifdef HAVE_OPENGL
     device->GL_SwapBuffers = ph_GL_SwapBuffers;
+#else
+    device->GL_SwapBuffers = NULL;
+#endif /* HAVE_OPENGL */
 
     device->free = ph_DeleteDevice;
 
@@ -196,7 +202,6 @@
   	{
   		printf("Photon application init failed, probably Photon is not running.\n");
         	exit( EXIT_FAILURE );
-//        PtExit(EXIT_FAILURE);         // Got SEGFAULT.
   	}
 
 	//PgSetDrawBufferSize(16 *1024);
@@ -216,29 +221,21 @@
 
 	if(SDL_BlankCursor == NULL)
 	  printf("could not create blank cursor\n");
-     /* Get the video mode */
-     /*    
-         if (PgGetVideoMode( &mysettings ) < 0)
-            {
-                fprintf(stderr,"ph_VideoInit:  PgGetVideoMode failed patch A?? \n");
-      			//QNX6/Patch A always fails return code even though call succeeds. fixed Patch B
-            }
-       */
+
          if (PgGetGraphicsHWCaps(&my_hwcaps) < 0)
          {
                 fprintf(stderr,"ph_VideoInit:  GetGraphicsHWCaps failed!! \n");
-      			//that HAVE to work
          }
          if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &my_mode_info) < 0)
          {
                 fprintf(stderr,"ph_VideoInit:  PgGetVideoModeInfo failed\n");
          }
 
-       //We need to return BytesPerPixel as it in used by CreateRGBsurface
-       vformat->BitsPerPixel = my_mode_info.bits_per_pixel;
-       vformat->BytesPerPixel = vformat->BitsPerPixel/8;
- 
-       //return a palette if we are in 256 color mode           
+         //We need to return BytesPerPixel as it in used by CreateRGBsurface
+         vformat->BitsPerPixel = my_mode_info.bits_per_pixel;
+         vformat->BytesPerPixel = my_mode_info.bytes_per_scanline/my_mode_info.width;
+         
+         //return a palette if we are in 256 color mode           
 		if(vformat->BitsPerPixel == 8)
 		{
 			vformat->palette = malloc(sizeof(SDL_Palette));
@@ -251,7 +248,7 @@
 			if(rtnval < 0)
 			   printf("ph_VideoInit:  PgGetPalette failed\n");
 			   
-       	tempptr = (unsigned long *)vformat->palette->colors;
+                        tempptr = (unsigned long *)vformat->palette->colors;
 
 			for(i=0;i<256; i++)
 			{
@@ -273,10 +270,11 @@
 static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
                 int width, int height, int bpp, Uint32 flags)
 {
-//    PhRegion_t region_info;
     PgDisplaySettings_t settings;
+/*
     PgHWCaps_t my_hwcaps;
     PgVideoModeInfo_t mode_info;
+*/
     int mode, actual_width, actual_height;
     PtArg_t arg[5];
     PhDim_t dim;	
@@ -284,7 +282,10 @@
     PgColor_t ph_palette[_Pg_MAX_PALETTE];
     int i;
     unsigned long *tempptr;
+
+#ifdef HAVE_OPENGL
     uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS];
+#endif // HAVE_OPENGL
 
     actual_width = width;
     actual_height = height;
@@ -296,37 +297,9 @@
     SDL_Lock_EventThread();
 
      /* Initialize the window */
-    if (flags & SDL_FULLSCREEN) //Direct Context , assume SDL_HWSURFACE also set
+    if (flags & SDL_FULLSCREEN) /* Direct Context , assume SDL_HWSURFACE also set */
     {
-/*  
-	if (old_video_mode==-1)
-	{
-		PgGetGraphicsHWCaps(&graphics_card_caps);
-		old_video_mode=graphics_card_caps.current_video_mode;
-		old_refresh_rate=graphics_card_caps.current_rrate;
-	}
-*/    	
-
         /* Get the video mode and set it */
-        if (bpp == 0)
-        {
-            /*again same issue, same solution
-            if (PgGetVideoMode( &settings ) < 0)
-            {
-                fprintf(stderr,"error: PgGetVideoMode failed\n");
-            }
-            */
-           if (PgGetGraphicsHWCaps(&my_hwcaps) < 0)
-           {
-                   fprintf(stderr,"ph_SetVideoMode:  GetGraphicsHWCaps failed!! \n");
-      	           //that HAVE to work
-           }
-           if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &mode_info) < 0)
-           {
-               fprintf(stderr,"ph_SetVideoMode:  PgGetVideoModeInfo failed\n");
-           }
-           bpp = mode_info.bits_per_pixel;
-        }
         if (flags & SDL_ANYFORMAT)
         {
             if ((mode = get_mode_any_format(width, height, bpp)) == 0)
@@ -356,27 +329,28 @@
 
 		/* Get the true height and width */
 		
-      current->flags = (flags|(~SDL_RESIZABLE)); //no resize for Direct Context
+      current->flags = (flags|(~SDL_RESIZABLE)); /* no resize for Direct Context */
 
 		 /* Begin direct mode */
 		 ph_EnterFullScreen(this);
 
        
 
-    } //end fullscreen flag
+    } /* end fullscreen flag */
     else
     {
        if (flags & SDL_HWSURFACE)  /* Use offscreen memory iff SDL_HWSURFACE flag is set */
        {
-         // Hardware surface is Offsceen Context.  ph_ResizeImage handles the switch
-         current->flags = (flags|(~SDL_RESIZABLE)); //no stretch blit in offscreen context
+         /* Hardware surface is Offsceen Context.  ph_ResizeImage handles the switch */
+         current->flags = (flags|(~SDL_RESIZABLE)); /* no stretch blit in offscreen context */
        }
-       else // must be SDL_SWSURFACE
+       else /* must be SDL_SWSURFACE */
        {
-          current->flags = (flags|SDL_RESIZABLE); //yes we can resize as this is a software surface
+          current->flags = (flags|SDL_RESIZABLE); /* yes we can resize as this is a software surface */
        }
-       
-       if (flags & SDL_OPENGL) // for now support OpenGL in window mode only
+
+#ifdef HAVE_OPENGL       
+       if (flags & SDL_OPENGL) /* for now support OpenGL in window mode only */
        {
           OGLAttrib[0]=PHOGL_ATTRIB_DEPTH_BITS;
           OGLAttrib[1]=bpp;
@@ -389,17 +363,18 @@
           }
           PhDCSetCurrent(OGLContext);
        }
+#endif /* HAVE_OPENGL */
        
     }
 
-	//If we are setting video to use the palette make sure we have allocated memory for it
+	/* If we are setting video to use the palette make sure we have allocated memory for it */
 	if(bpp == 8)
 	{
 		current->format->palette = malloc(sizeof(SDL_Palette));
 		memset(current->format->palette, 0, sizeof(SDL_Palette));
 		current->format->palette->ncolors = 256;
 		current->format->palette->colors = (SDL_Color *)malloc(256 *sizeof(SDL_Color));
-		//fill the palette
+		/* fill the palette */
 		rtnval = PgGetPalette(ph_palette);
 
                 tempptr = (unsigned long *)current->format->palette->colors;
@@ -413,10 +388,10 @@
 	}
 
 
-	//Current window dimensions
+	/* Current window dimensions */
 	PtGetResource( window, Pt_ARG_DIM, &dim, 0 );
-	
-	//If we need to resize the window
+
+	/* If we need to resize the window */
 	if((dim.w != width)||(dim.h != height))
 	{
 	    dim.w=width;
@@ -426,13 +401,12 @@
             current->w = width;
             current->h = height;
             current->format->BitsPerPixel = bpp;
-            current->format->BytesPerPixel = bpp/8;
+            current->format->BytesPerPixel = (bpp+7)/8;
             current->pitch = SDL_CalculatePitch(current);
-            //Must call at least once it setup image planes 
+            /* Must call at least once it setup image planes */
             ph_ResizeImage(this, current, flags);
         }
 
-
     SDL_Unlock_EventThread();
 
     /* We're done! */
@@ -441,20 +415,18 @@
 
 static void ph_VideoQuit(_THIS)
 {
-		
-	if(SDL_Image != NULL)
-	{
-  	    ph_DestroyImage(this, SDL_VideoSurface); 
-	}
+    if (SDL_Image != NULL)
+    {
+        ph_DestroyImage(this, SDL_VideoSurface); 
+    }
 
-	if (currently_fullscreen)
-	{
-		PdDirectStop( directContext );
-		PdReleaseDirectContext( directContext );
-		directContext=0;	
-		currently_fullscreen = 0;
-	}
-	
+    if (currently_fullscreen)
+    {
+        PdDirectStop( directContext );
+        PdReleaseDirectContext( directContext );
+        directContext=0;	
+        currently_fullscreen = 0;
+    }
 }
 
 
@@ -516,11 +488,13 @@
 	return alloct_all;
 }
 
+#ifdef HAVE_OPENGL
 void ph_GL_SwapBuffers(_THIS)
 {
    PgSetRegion(PtWidgetRid(window));
    PdOpenGLContextSwapBuffers(OGLContext);
 }
+#endif // HAVE_OPENGL
 
 /*
 static int ph_ResizeWindow(_THIS,