From 230e852232353174703d736342ec175e76b52ce3 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 18 Jan 2002 18:14:03 +0000 Subject: [PATCH] Added QNX cleanups by Mike Gorchak (thanks!) --- README.QNX | 19 ++++ src/video/SDL_video.c | 4 +- src/video/photon/SDL_ph_events.c | 10 +- src/video/photon/SDL_ph_image.c | 58 +++++----- src/video/photon/SDL_ph_modes.c | 106 +++++++++---------- src/video/photon/SDL_ph_modes_c.h | 4 +- src/video/photon/SDL_ph_mouse.c | 38 +++---- src/video/photon/SDL_ph_video.c | 160 ++++++++++++++++------------ src/video/photon/SDL_ph_video.h | 3 + src/video/photon/SDL_ph_wm.c | 170 ++++-------------------------- test/testvidinfo.c | 2 +- 11 files changed, 245 insertions(+), 329 deletions(-) create mode 100644 README.QNX diff --git a/README.QNX b/README.QNX new file mode 100644 index 000000000..caec4b73a --- /dev/null +++ b/README.QNX @@ -0,0 +1,19 @@ +README by Mike Gorchak + + 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. + +Some building issues: + + Run configure script without x11 support, e.g.: + + ./configure --prefix=/usr/local --disable-video-x11 + + 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 diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 4160024f4..c56745bc5 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -1391,7 +1391,9 @@ void SDL_GL_SwapBuffers(void) SDL_VideoDevice *this = current_video; if ( video->screen->flags & SDL_OPENGL ) { - video->GL_SwapBuffers( this ); + video->GL_SwapBuffers(this); + } else { + SDL_SetError("OpenGL video mode has not been set"); } } diff --git a/src/video/photon/SDL_ph_events.c b/src/video/photon/SDL_ph_events.c index 29e97ed5c..4c9c8e55c 100644 --- a/src/video/photon/SDL_ph_events.c +++ b/src/video/photon/SDL_ph_events.c @@ -55,9 +55,10 @@ SDL_keysym *ph_TranslateKey(PhKeyEvent_t *key, SDL_keysym *keysym); (idea shamelessly lifted from GII -- thanks guys! :) */ +/* static int ph_KeyRepeat(_THIS, PhKeyEvent_t* keyevent) { - PhEvent_t* peekevent; +// PhEvent_t* peekevent; PhKeyEvent_t* keyEvent; int repeated; @@ -84,11 +85,13 @@ static int ph_KeyRepeat(_THIS, PhKeyEvent_t* keyevent) } break; - default: /* no events pending */ + default: // no events pending } return(repeated); } +*/ + /* Note: The X server buffers and accumulates mouse motion events, so the motion event generated by the warp may not appear exactly as we expect it to. We work around this (and improve performance) by only @@ -118,7 +121,7 @@ static inline int X11_WarpedMotion(_THIS, XEvent *xevent) (xevent->xmotion.x > (w-MOUSE_FUDGE_FACTOR)) || (xevent->xmotion.y < MOUSE_FUDGE_FACTOR) || (xevent->xmotion.y > (h-MOUSE_FUDGE_FACTOR)) ) { - /* Get the events that have accumulated */ + // Get the events that have accumulated /* while ( XCheckTypedEvent(SDL_Display, MotionNotify, xevent) ) { deltax = xevent->xmotion.x - mouse_last.x; deltay = xevent->xmotion.y - mouse_last.y; @@ -161,6 +164,7 @@ static inline int X11_WarpedMotion(_THIS, XEvent *xevent) /* Control which motion flags the window has set, a flags value of -1 sets * MOTION_BUTTON and MOTION_NOBUTTON */ + static void set_motion_sensitivity(_THIS, unsigned int flags) { int rid, fields = Ph_EV_PTR_MOTION_BUTTON | Ph_EV_PTR_MOTION_NOBUTTON; diff --git a/src/video/photon/SDL_ph_image.c b/src/video/photon/SDL_ph_image.c index 46b5afa95..9afd36115 100644 --- a/src/video/photon/SDL_ph_image.c +++ b/src/video/photon/SDL_ph_image.c @@ -129,24 +129,24 @@ int ph_SetupOCImage(_THIS, SDL_Surface *screen) //Offscreen context break; } - OCImage.FrameData0 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA))); - OCImage.FrameData1 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA))); + OCImage.FrameData0 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA))); + OCImage.FrameData1 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA))); if(OCImage.direct_context == NULL) - OCImage.direct_context = PdCreateDirectContext(); + OCImage.direct_context = PdCreateDirectContext(); - OCImage.offscreen_context = PdCreateOffscreenContext(0,screen->w,screen->h, Pg_OSC_MEM_PAGE_ALIGN); + OCImage.offscreen_context = PdCreateOffscreenContext(0,screen->w,screen->h, Pg_OSC_MEM_PAGE_ALIGN); - if (OCImage.offscreen_context == NULL) - { - printf("PdCreateOffscreenContext failed\n"); - return -1; - } + if (OCImage.offscreen_context == NULL) + { + printf("PdCreateOffscreenContext failed\n"); + return -1; + } - OCImage.Stride = OCImage.offscreen_context->pitch; + OCImage.Stride = OCImage.offscreen_context->pitch; - if (OCImage.flags & SDL_DOUBLEBUF) - printf("hardware flag for doublebuf offscreen context\n"); + if (OCImage.flags & SDL_DOUBLEBUF) + printf("hardware flag for doublebuf offscreen context\n"); OCImage.dc_ptr.ptr8 = (unsigned char *) PdGetOffscreenContextPtr(OCImage.offscreen_context); @@ -175,21 +175,18 @@ int ph_SetupOCImage(_THIS, SDL_Surface *screen) //Offscreen context void ph_DestroyImage(_THIS, SDL_Surface *screen) { - - if(SDL_Image == NULL) return; - if (OCImage.offscreen_context != NULL) - { - - PhDCRelease(OCImage.offscreen_context); - OCImage.offscreen_context = NULL; - free(OCImage.FrameData0); - OCImage.FrameData0 = NULL; - free(OCImage.FrameData1); - OCImage.FrameData1 = NULL; - } + if (OCImage.offscreen_context != NULL) + { + PhDCRelease(OCImage.offscreen_context); + OCImage.offscreen_context = NULL; + free(OCImage.FrameData0); + OCImage.FrameData0 = NULL; + free(OCImage.FrameData1); + OCImage.FrameData1 = NULL; + } if (SDL_Image->image) { @@ -210,7 +207,6 @@ void ph_DestroyImage(_THIS, SDL_Surface *screen) int ph_ResizeImage(_THIS, SDL_Surface *screen, Uint32 flags) { - ph_DestroyImage(this, screen); if( flags & SDL_HWSURFACE) @@ -226,30 +222,25 @@ int ph_ResizeImage(_THIS, SDL_Surface *screen, Uint32 flags) { return ph_SetupImage(this, screen); } - } int ph_AllocHWSurface(_THIS, SDL_Surface *surface) { - return(-1); } void ph_FreeHWSurface(_THIS, SDL_Surface *surface) { - return; } int ph_FlipHWSurface(_THIS, SDL_Surface *surface) { - return(0); } int ph_LockHWSurface(_THIS, SDL_Surface *surface) { - if ( (surface == SDL_VideoSurface) && blit_queued ) { // XSync(GFX_Display, False); PgFlush(); @@ -260,7 +251,6 @@ int ph_LockHWSurface(_THIS, SDL_Surface *surface) void ph_UnlockHWSurface(_THIS, SDL_Surface *surface) { - return; } @@ -290,7 +280,7 @@ void ph_NormalUpdate(_THIS, int numrects, SDL_Rect *rects) } } if (PgFlush() < 0) - { + { fprintf(stderr,"error: PgFlush failed.\n"); } } @@ -326,13 +316,13 @@ void ph_OCUpdate(_THIS, int numrects, SDL_Rect *rects) zero.x = zero.y = 0; PgSetTranslation (&zero, 0); - PgSetRegion(PtWidgetRid(window)); + PgSetRegion(PtWidgetRid(window)); PgSetClipping(0,NULL); PgContextBlitArea(OCImage.offscreen_context, (PhArea_t *)(&src_rect), NULL, (PhArea_t *)(&dest_rect)); } if (PgFlush() < 0) - { + { fprintf(stderr,"error: PgFlush failed.\n"); } diff --git a/src/video/photon/SDL_ph_modes.c b/src/video/photon/SDL_ph_modes.c index 5889c2bd9..5a1fffa23 100644 --- a/src/video/photon/SDL_ph_modes.c +++ b/src/video/photon/SDL_ph_modes.c @@ -25,16 +25,15 @@ static char rcsid = "@(#) $Id$"; #endif - #include "SDL_ph_modes_c.h" static unsigned long key1, key2; static PgVideoModeInfo_t mode_info; static PgVideoModes_t mode_list; + /* The current list of available video modes */ - SDL_Rect SDL_modelist[127]; - SDL_Rect *SDLmod_ptr; - SDL_Rect **SDLmod_ptrptr ; +SDL_Rect SDL_modelist[PH_MAX_VIDEOMODES]; +SDL_Rect* SDL_modearray[PH_MAX_VIDEOMODES]; static int compare_modes_by_res(const void* mode1, const void* mode2) { @@ -43,17 +42,17 @@ static int compare_modes_by_res(const void* mode1, const void* mode2) { fprintf(stderr,"error: In compare_modes_by_res PgGetVideoModeInfo failed on mode: 0x%x\n", *(unsigned short*)mode1); - return 0; + return 0; } key1 = mode_info.width * mode_info.height; if (PgGetVideoModeInfo(*(unsigned short*)mode2, &mode_info) < 0) { - fprintf(stderr,"error: In compare_modes_by_res PgGetVideoModeInfo failed on mode: 0x%x\n", + fprintf(stderr,"error: In compare_modes_by_res PgGetVideoModeInfo failed on mode: 0x%x\n", *(unsigned short*)mode2); return 0; } - key2 = mode_info.width * mode_info.height; + key2 = mode_info.width * mode_info.height; if (key1 > key2) return 1; @@ -63,6 +62,7 @@ static int compare_modes_by_res(const void* mode1, const void* mode2) return -1; } +/* static int compare_modes_by_bpp(const void* mode1, const void* mode2) { @@ -89,7 +89,9 @@ static int compare_modes_by_bpp(const void* mode1, const void* mode2) else return -1; } +*/ +/* int ph_GetVideoModes(_THIS) { unsigned short *front; @@ -149,19 +151,24 @@ int ph_GetVideoModes(_THIS) return 0; } +*/ -static SDL_Rect** ph_SupportedVisual( SDL_PixelFormat *format) +SDL_Rect **ph_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) { int i = 0; int j = 0; - SDL_Rect Amodelist[127]; + SDL_Rect Amodelist[PH_MAX_VIDEOMODES]; + for (i=0; iBitsPerPixel) { - Amodelist[j].w = mode_info.width; - Amodelist[j].h = mode_info.height; - Amodelist[j].x = 0; - Amodelist[j].y = 0; - j++; - } + Amodelist[j].w = mode_info.width; + Amodelist[j].h = mode_info.height; + Amodelist[j].x = 0; + Amodelist[j].y = 0; + j++; + } } - //reorder biggest for smallest , assume width dominates - for(i=0; i< j ; i++) - { - SDL_modelist[i].w = Amodelist[j - i -1].w; - SDL_modelist[i].h = Amodelist[j - i -1].h; - SDL_modelist[i].x = Amodelist[j - i -1].x; - SDL_modelist[i].y = Amodelist[j - i -1].y; - } - - SDLmod_ptr = SDL_modelist; - SDLmod_ptrptr = &SDLmod_ptr; - return SDLmod_ptrptr; -} + //reorder biggest for smallest, assume width dominates -SDL_Rect **ph_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) -{ - return ph_SupportedVisual( format); + for(i=0; i< j ; i++) + { + SDL_modelist[i].w = Amodelist[j - i -1].w; + SDL_modelist[i].h = Amodelist[j - i -1].h; + SDL_modelist[i].x = Amodelist[j - i -1].x; + SDL_modelist[i].y = Amodelist[j - i -1].y; + } + SDL_modearray[j]=NULL; + + return SDL_modearray; } void ph_FreeVideoModes(_THIS) { -// int i; - - // if ( SDL_modelist ) { - // for ( i=0; SDL_modelist[i]; ++i ) { - // free(SDL_modelist[i]); - // } - // free(SDL_modelist); - // SDL_modelist = NULL; -// } + return; } static void set_best_resolution(_THIS, int width, int height) @@ -287,6 +281,7 @@ static void set_best_resolution(_THIS, int width, int height) } } +/* static void get_real_resolution(_THIS, int* w, int* h) { @@ -294,13 +289,13 @@ static void get_real_resolution(_THIS, int* w, int* h) //PgDisplaySettings_t settings; PgVideoModeInfo_t current_mode_info; PgHWCaps_t my_hwcaps; - int unused; - /* - if (PgGetVideoMode( &settings ) >= 0) { - *w = settings.xres; - *h = settings.yres; - return; - }*/ +// int unused; + +// if (PgGetVideoMode( &settings ) >= 0) { +// *w = settings.xres; +// *h = settings.yres; +// return; +// } if (PgGetGraphicsHWCaps(&my_hwcaps) >= 0) { if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, ¤t_mode_info) < 0) @@ -314,6 +309,7 @@ static void get_real_resolution(_THIS, int* w, int* h) // *w = DisplayWidth(SDL_Display, SDL_Screen); // *h = DisplayHeight(SDL_Display, SDL_Screen); } +*/ int ph_ResizeFullScreen(_THIS) { @@ -496,9 +492,9 @@ int ph_LeaveFullScreen(_THIS ) mymode_settings.refresh= (unsigned short) old_refresh_rate; mymode_settings.flags = 0; if(PgSetVideoMode(&mymode_settings) < 0) - { - fprintf(stderr,"error: PgSetVideoMode failed\n"); - } + { + fprintf(stderr,"error: PgSetVideoMode failed\n"); + } } old_video_mode=-1; diff --git a/src/video/photon/SDL_ph_modes_c.h b/src/video/photon/SDL_ph_modes_c.h index d98d4d767..863126e1e 100644 --- a/src/video/photon/SDL_ph_modes_c.h +++ b/src/video/photon/SDL_ph_modes_c.h @@ -31,7 +31,9 @@ static char rcsid = #include "SDL_ph_video.h" -extern int ph_GetVideoModes(_THIS); +#define PH_MAX_VIDEOMODES 127 + +//extern int ph_GetVideoModes(_THIS); extern SDL_Rect **ph_ListModes(_THIS,SDL_PixelFormat *format, Uint32 flags); extern void ph_FreeVideoModes(_THIS); extern int ph_ResizeFullScreen(_THIS); diff --git a/src/video/photon/SDL_ph_mouse.c b/src/video/photon/SDL_ph_mouse.c index e4968534a..089d44143 100644 --- a/src/video/photon/SDL_ph_mouse.c +++ b/src/video/photon/SDL_ph_mouse.c @@ -85,22 +85,23 @@ WMcursor *ph_CreateWMCursor(_THIS, cursor->ph_cursor->bytesperline1 = (char)w/8; cursor->ph_cursor->color1 = Pg_WHITE; cursor->ph_cursor->size2.x = (short)w; - cursor->ph_cursor->size2.y = (short)h; - cursor->ph_cursor->offset2.x = (short)hot_x; - cursor->ph_cursor->offset2.y = (short)hot_y; - cursor->ph_cursor->bytesperline2 = (char)w/8; - cursor->ph_cursor->color2 = Pg_BLACK; + cursor->ph_cursor->size2.y = (short)h; + cursor->ph_cursor->offset2.x = (short)hot_x; + cursor->ph_cursor->offset2.y = (short)hot_y; + cursor->ph_cursor->bytesperline2 = (char)w/8; + cursor->ph_cursor->color2 = Pg_BLACK; clen = (w/8)*h; /* Copy the mask and the data to different bitmap planes */ - for ( i=0; iph_cursor->images[i] = data[i]; - cursor->ph_cursor->images[i+clen] = mask[i]; - } + for ( i=0; iph_cursor->images[i] = data[i]; + cursor->ph_cursor->images[i+clen] = mask[i]; + } - //#bytes following the hdr struct + //#bytes following the hdr struct cursor->ph_cursor->hdr.len =sizeof(PhCursorDef_t) + clen*2 - sizeof(PhRegionDataHdr_t); return (cursor); @@ -109,7 +110,6 @@ WMcursor *ph_CreateWMCursor(_THIS, PhCursorDef_t ph_GetWMPhCursor(WMcursor *cursor) { - return(*cursor->ph_cursor); } @@ -120,8 +120,6 @@ int ph_ShowWMCursor(_THIS, WMcursor *cursor) int nargs = 0; short cursor_is_defined = 0; - - /* Don't do anything if the display is gone */ if ( window == NULL ) { return(0); @@ -145,8 +143,8 @@ int ph_ShowWMCursor(_THIS, WMcursor *cursor) cursor_is_defined = 1; } if (cursor_is_defined) - { - SDL_Lock_EventThread(); + { + SDL_Lock_EventThread(); if (PtSetResources( window, nargs, args ) < 0 ) { @@ -163,15 +161,13 @@ int ph_ShowWMCursor(_THIS, WMcursor *cursor) void ph_WarpWMCursor(_THIS, Uint16 x, Uint16 y) { - - SDL_Lock_EventThread(); - PhMoveCursorRel( PhInputGroup(NULL), x, y ); - SDL_Unlock_EventThread(); + SDL_Lock_EventThread(); + PhMoveCursorRel( PhInputGroup(NULL), x, y ); + SDL_Unlock_EventThread(); } void ph_CheckMouseMode(_THIS) { - - mouse_relative = 1; + mouse_relative = 1; } diff --git a/src/video/photon/SDL_ph_video.c b/src/video/photon/SDL_ph_video.c index dbca76e28..1de2bed88 100644 --- a/src/video/photon/SDL_ph_video.c +++ b/src/video/photon/SDL_ph_video.c @@ -56,10 +56,12 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors); static void ph_VideoQuit(_THIS); static void ph_DeleteDevice(SDL_VideoDevice *device); +static void ph_GL_SwapBuffers(_THIS); + +PdOpenGLContext_t* OGLContext=NULL; static int ph_Available(void) { - return 1; } @@ -86,7 +88,7 @@ static SDL_VideoDevice *ph_CreateDevice(int devindex) device->handles_any_size = 1; //JB not true for fullscreen /* Set the function pointers */ - device->CreateYUVOverlay = ph_CreateYUVOverlay; + device->CreateYUVOverlay = ph_CreateYUVOverlay; device->VideoInit = ph_VideoInit; device->ListModes = ph_ListModes; device->SetVideoMode = ph_SetVideoMode; @@ -117,6 +119,13 @@ static SDL_VideoDevice *ph_CreateDevice(int devindex) device->InitOSKeymap = ph_InitOSKeymap; device->PumpEvents = ph_PumpEvents; + // OpenGL support. + device->GL_LoadLibrary = NULL; + device->GL_GetProcAddress = NULL; + device->GL_GetAttribute = NULL; + device->GL_MakeCurrent = NULL; + device->GL_SwapBuffers = ph_GL_SwapBuffers; + device->free = ph_DeleteDevice; return device; @@ -147,17 +156,17 @@ static void ph_DeleteDevice(SDL_VideoDevice *device) static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat) { PtArg_t arg[1]; - PhDim_t dim; + PhDim_t dim; PgColor_t ph_palette[_Pg_MAX_PALETTE]; int i; unsigned long *tempptr; int rtnval; - PgDisplaySettings_t mysettings; +// PgDisplaySettings_t mysettings; PgVideoModeInfo_t my_mode_info; PgHWCaps_t my_hwcaps; - if( NULL == ( event = malloc( EVENT_SIZE ) ) ) - exit( EXIT_FAILURE ); + if( NULL == ( event = malloc( EVENT_SIZE ) ) ) + exit( EXIT_FAILURE ); /* Create a widget 'window' to capture events */ dim.w=0; //JB test320; @@ -190,10 +199,10 @@ static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat) // PtExit(EXIT_FAILURE); // Got SEGFAULT. } - //PgSetDrawBufferSize(16 *1024); - PgSetRegion(PtWidgetRid(window)); - PgSetClipping(0,NULL); - PtRealizeWidget(window); + //PgSetDrawBufferSize(16 *1024); + PgSetRegion(PtWidgetRid(window)); + PgSetClipping(0,NULL); + PtRealizeWidget(window); /* Get the available video modes */ @@ -216,14 +225,15 @@ static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat) } */ 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; @@ -263,32 +273,31 @@ static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat) static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags) { - PhRegion_t region_info; +// PhRegion_t region_info; PgDisplaySettings_t settings; PgHWCaps_t my_hwcaps; - PgVideoModeInfo_t mode_info; + PgVideoModeInfo_t mode_info; int mode, actual_width, actual_height; - PtArg_t arg[5]; - PhDim_t dim; - int rtnval; - SDL_Rect ** mymodelist; - SDL_PixelFormat myformat; - PgColor_t ph_palette[_Pg_MAX_PALETTE]; - int i; - unsigned long *tempptr; + PtArg_t arg[5]; + PhDim_t dim; + int rtnval; + PgColor_t ph_palette[_Pg_MAX_PALETTE]; + int i; + unsigned long *tempptr; + uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS]; - actual_width = width; - actual_height = height; + actual_width = width; + actual_height = height; + dim.w=width; + dim.h=height; /* Lock the event thread, in multi-threading environments */ SDL_Lock_EventThread(); - /* Initialize the window */ if (flags & SDL_FULLSCREEN) //Direct Context , assume SDL_HWSURFACE also set { - /* if (old_video_mode==-1) { @@ -297,9 +306,7 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, old_refresh_rate=graphics_card_caps.current_rrate; } */ - - - + /* Get the video mode and set it */ if (bpp == 0) { @@ -309,15 +316,15 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, 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"); - } + 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) @@ -341,8 +348,7 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, settings.mode = mode; settings.refresh = 0; settings.flags = 0; - - + if (PgSetVideoMode( &settings ) < 0) { fprintf(stderr,"error: PgSetVideoMode failed\n"); @@ -358,16 +364,33 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, } //end fullscreen flag - else if (flags & SDL_HWSURFACE) /* Use offscreen memory iff SDL_HWSURFACE flag is set */ + else { - // Hardware surface is Offsceen Context. ph_ResizeImage handles the switch - current->flags = (flags|(~SDL_RESIZABLE)); //no stretch blit in offscreen context + 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 + } + else // must be SDL_SWSURFACE + { + 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 + { + OGLAttrib[0]=PHOGL_ATTRIB_DEPTH_BITS; + OGLAttrib[1]=bpp; + OGLAttrib[2]=PHOGL_ATTRIB_NONE; + OGLContext=PdCreateOpenGLContext(2, &dim, 0, OGLAttrib); + if (OGLContext==NULL) + { + fprintf(stderr,"error: cannot create OpenGL context\n"); + exit(1); + } + PhDCSetCurrent(OGLContext); + } + } - else // must be SDL_SWSURFACE - { - current->flags = (flags|SDL_RESIZABLE); //yes we can resize as this is a software surface - } - //If we are setting video to use the palette make sure we have allocated memory for it if(bpp == 8) @@ -379,7 +402,7 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, //fill the palette rtnval = PgGetPalette(ph_palette); - tempptr = (unsigned long *)current->format->palette->colors; + tempptr = (unsigned long *)current->format->palette->colors; for(i=0;i<256; i++) { @@ -397,17 +420,17 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, if((dim.w != width)||(dim.h != height)) { dim.w=width; - dim.h=height; - PtSetArg(&arg[0], Pt_ARG_DIM, &dim,0); - PtSetResources( window, 1, arg ); - current->w = width; - current->h = height; - current->format->BitsPerPixel = bpp; - current->format->BytesPerPixel = bpp/8; - current->pitch = SDL_CalculatePitch(current); - //Must call at least once it setup image planes - ph_ResizeImage(this, current, flags); - } + dim.h=height; + PtSetArg(&arg[0], Pt_ARG_DIM, &dim,0); + PtSetResources( window, 1, arg ); + current->w = width; + current->h = height; + current->format->BitsPerPixel = bpp; + current->format->BytesPerPixel = bpp/8; + current->pitch = SDL_CalculatePitch(current); + //Must call at least once it setup image planes + ph_ResizeImage(this, current, flags); + } SDL_Unlock_EventThread(); @@ -421,8 +444,7 @@ static void ph_VideoQuit(_THIS) if(SDL_Image != NULL) { - ph_DestroyImage(this, SDL_VideoSurface); - + ph_DestroyImage(this, SDL_VideoSurface); } if (currently_fullscreen) @@ -494,6 +516,13 @@ static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) return alloct_all; } +void ph_GL_SwapBuffers(_THIS) +{ + PgSetRegion(PtWidgetRid(window)); + PdOpenGLContextSwapBuffers(OGLContext); +} + +/* static int ph_ResizeWindow(_THIS, SDL_Surface *screen, int w, int h, Uint32 flags) { @@ -512,5 +541,4 @@ static int ph_ResizeWindow(_THIS, current_h = h; return(0); } - - +*/ diff --git a/src/video/photon/SDL_ph_video.h b/src/video/photon/SDL_ph_video.h index e09e48042..a0cd3e472 100644 --- a/src/video/photon/SDL_ph_video.h +++ b/src/video/photon/SDL_ph_video.h @@ -50,10 +50,13 @@ static unsigned TranslatedFillColor; #include "Pt.h" #include #include +#include /* Hidden "this" pointer for the video functions */ #define _THIS SDL_VideoDevice *this +#define PH_OGL_MAX_ATTRIBS 32 + typedef union vidptr{ uint8_t *volatile ptr8; uint16_t *volatile ptr16; diff --git a/src/video/photon/SDL_ph_wm.c b/src/video/photon/SDL_ph_wm.c index a30e8910c..48ce063eb 100644 --- a/src/video/photon/SDL_ph_wm.c +++ b/src/video/photon/SDL_ph_wm.c @@ -230,168 +230,44 @@ void ph_SetCaption(_THIS, const char *title, const char *icon) SDL_Unlock_EventThread(); } -/* Iconify the window (stolen from PhHotKey sources by phearbear ;-) */ +/* Iconify current window */ int ph_IconifyWindow(_THIS) { -#if 1 /* Code submitted by Luca */ - WmApiContext_t context=WmCreateContext(); - WmWindowDefinition_t -**wininfo=malloc(sizeof(WmWindowDefinition_t)*2); - int num; - SDL_Lock_EventThread(); - WmGetFocusList(context,2,&num,wininfo); - WmPerformFrameAction(context, wininfo[0]->rid,Pt_ACTION_MIN); - - WmDestroyContext (context); - SDL_Unlock_EventThread(); - free(wininfo); - return (0); -#else - int result=0; - int myerr; - int num; - PtConnectionClient_t *Client=0; - WmMsg_t* Message=malloc(sizeof(WmMsg_t)); - WmReply_t *Reply=malloc(sizeof(WmReply_t)); - WmApiContext_t MsgStruct=malloc(sizeof(WmApiContext_t)); - WmWindowDefinition_t **WNDDEF=malloc(sizeof(WmWindowDefinition_t)*2); - - SDL_Lock_EventThread(); - - PtInit("/dev/photon"); - - Client=PtConnectionFindName("pwm",0,0); - - if(!Client) - { - return result; - } + WmApiContext_t context=WmCreateContext(); + WmWindowDefinition_t **wininfo=malloc(sizeof(WmWindowDefinition_t)*2); + int num; - MsgStruct->input_group=PhInputGroup(0); - MsgStruct->connection=PtConnectionFindName("pwm",0,0); - myerr=WmGetFocusList(MsgStruct,2,&num,WNDDEF); + SDL_Lock_EventThread(); + WmGetFocusList(context,2,&num,wininfo); + WmPerformFrameAction(context, wininfo[0]->rid,Pt_ACTION_MIN); - Message->hdr.type=WM_REQUEST_WIN_ACTION; - Message->hdr.subtype=Pt_ACTION_MIN; - Message->hdr.rid=WNDDEF[0]->rid; - myerr=WmSendMessage(Client,Message,Reply,0); + WmDestroyContext (context); + SDL_Unlock_EventThread(); + free(wininfo); - free(Message); - free(Reply); - - SDL_Unlock_EventThread(); - - return(result); -#endif /* 1 */ + return (0); } SDL_GrabMode ph_GrabInputNoLock(_THIS, SDL_GrabMode mode) { -#if 0 /*big*/ - int numtries, result; - - if ( this->screen == NULL ) { - return(SDL_GRAB_OFF); - } - if ( ! SDL_Window ) { - return(mode); /* Will be set later on mode switch */ - } - if ( mode == SDL_GRAB_OFF ) { - XUngrabPointer(SDL_Display, CurrentTime); - if ( this->screen->flags & SDL_FULLSCREEN ) { - /* Rebind the mouse to the fullscreen window */ - for ( numtries = 0; numtries < 10; ++numtries ) { - result = XGrabPointer(SDL_Display, FSwindow, - True, 0, - GrabModeAsync, GrabModeAsync, - FSwindow, None, CurrentTime); - if ( result == AlreadyGrabbed ) { - break; - } - SDL_Delay(100); - } - } -#ifdef GRAB_FULLSCREEN - if ( !(this->screen->flags & SDL_FULLSCREEN) ) -#endif - XUngrabKeyboard(SDL_Display, CurrentTime); - } else { - if ( this->screen->flags & SDL_FULLSCREEN ) { - /* Unbind the mouse from the fullscreen window */ - XUngrabPointer(SDL_Display, CurrentTime); - } - /* Try to grab the mouse */ - for ( numtries = 0; numtries < 10; ++numtries ) { - result = XGrabPointer(SDL_Display, SDL_Window, True, 0, - GrabModeAsync, GrabModeAsync, - SDL_Window, None, CurrentTime); - if ( result != AlreadyGrabbed ) { - break; - } - SDL_Delay(100); - } -#ifdef GRAB_FULLSCREEN - if ( !(this->screen->flags & SDL_FULLSCREEN) ) -#endif - XGrabKeyboard(SDL_Display, WMwindow, True, - GrabModeAsync, GrabModeAsync, CurrentTime); - } - XSync(SDL_Display, False); - - -#endif /*big*/ - return(mode); + return(mode); } SDL_GrabMode ph_GrabInput(_THIS, SDL_GrabMode mode) { -#if 0 - SDL_Lock_EventThread(); - mode = X11_GrabInputNoLock(this, mode); - SDL_Unlock_EventThread(); -#endif - return(mode); + return(mode); } -/* If 'info' is the right version, this function fills it and returns 1. - Otherwise, in case of a version mismatch, it returns -1. -*/ -static void lock_display(void) -{ - SDL_Lock_EventThread(); -} -static void unlock_display(void) -{ -#if 0 - /* Make sure any X11 transactions are completed */ - SDL_VideoDevice *this = current_video; - XSync(SDL_Display, False); -#endif - SDL_Unlock_EventThread(); -} int ph_GetWMInfo(_THIS, SDL_SysWMinfo *info) { -#if 0 - if ( info->version.major <= SDL_MAJOR_VERSION ) { - info->subsystem = SDL_SYSWM_X11; - info->info.x11.display = SDL_Display; - info->info.x11.window = SDL_Window; - if ( SDL_VERSIONNUM(info->version.major, - info->version.minor, - info->version.patch) >= 1002 ) { - info->info.x11.fswindow = FSwindow; - info->info.x11.wmwindow = WMwindow; - } - info->info.x11.lock_func = lock_display; - info->info.x11.unlock_func = unlock_display; - return(1); - } else { - SDL_SetError("Application not compiled with SDL %d.%d\n", - SDL_MAJOR_VERSION, SDL_MINOR_VERSION); - return(-1); - } -#endif - return -1; // for now ... + if (info->version.major <= SDL_MAJOR_VERSION) + { + return 1; + } + else + { + SDL_SetError("Application not compiled with SDL %d.%d\n", + SDL_MAJOR_VERSION, SDL_MINOR_VERSION); + return -1; + } } - - diff --git a/test/testvidinfo.c b/test/testvidinfo.c index f630ee73a..4ad7fff41 100644 --- a/test/testvidinfo.c +++ b/test/testvidinfo.c @@ -35,7 +35,7 @@ int main(int argc, char *argv[]) } else { printf("Fullscreen video modes:\n"); for ( i=0; modes[i]; ++i ) { - printf("\t%dx%d\n", modes[i]->w, modes[i]->h); + printf("\t%dx%dx%d\n", modes[i]->w, modes[i]->h, info->vfmt->BitsPerPixel); } } if ( info->wm_available ) {