From a30c20aee3115a7cdd1e0f02df2be325ae937e35 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 23 Aug 2003 23:20:21 +0000 Subject: [PATCH] Date: Fri, 15 Aug 2003 09:13:59 +0300 From: "Mike Gorchak" Subject: Patches for tests and QNX6 Here more fixes for the QNX6 in sdlqnx.diff file: - Spellchecked README.QNX (thanks to Julian Kinraid) - Fixed bugs in fullscreen mode: window region wasn't on top by default, so \ it caused some artifacts to be appeared on the screen, prevent window conten\ ts default filler in Photon while in fullscreen mode, it damages the screen. - Added support for the SDL_VIDEO_WINDOW_POS, SDL_VIDEO_CENTERED env variabl\ es. - Some minor code restructurization. --- BUGS | 2 +- README.QNX | 152 ++++++++++++++++---------------- src/video/photon/SDL_ph_image.c | 2 + src/video/photon/SDL_ph_modes.c | 11 +-- src/video/photon/SDL_ph_video.c | 47 ++++++++-- src/video/photon/SDL_ph_video.h | 15 ++-- 6 files changed, 131 insertions(+), 98 deletions(-) diff --git a/BUGS b/BUGS index f10c6f70f..7b6737159 100644 --- a/BUGS +++ b/BUGS @@ -142,7 +142,7 @@ EPOC: No console output screen. Printing to stdout do not have any effect. QNX: - Fullscreen switch doesn't work correctly. + Fullscreen switch doesn't work (disabled for now). OpenBSD: -= NOT YET SUPPORTED =- diff --git a/README.QNX b/README.QNX index 66102c84d..6bd64a711 100644 --- a/README.QNX +++ b/README.QNX @@ -1,112 +1,108 @@ README by Mike Gorchak , -Last changed at 29 Jul 2003. +Last changed at 12 Aug 2003. -========================================================================= +====================================================================== OpenGL: - OpenGL in window mode works well and stable, in fullscreen -mode too, but fullscreen mode has not been heavily tested yet. - If you have QNX RtP version 6.1.0 and above you must download -new Photon3D runtime from http://developers.qnx.com or install it -from public repository or from public CD, available with QNX. The -versions of OS before 6.1.0 are not supported. - While creating OpenGL context software renderer mode is -artificially selected (QSSL made acceleration only for Voodoo -boards in fullscreen mode, sorry but I don't have this board to -test OpenGL - maybe it work or maybe not :)). If you want accele- -ration - you may remove some line in source code: find the file -SDL_ph_video.c and remove the following + OpenGL works well and is stable, but fullscreen mode has not been +heavily tested yet. + If you have QNX RtP version 6.1.0 or above you must download the +Photon3D runtime from http://developers.qnx.com or install it from the +public repository or the public CD, available with QNX. OS versions +below 6.1.0 are not supported. + When creating an OpenGL context, software renderer mode is artifi- +cially selected (QSSL made acceleration only for Voodoo boards in +fullscreen mode, sorry but I don't have this board to test OpenGL - +maybe it works or maybe not :)). If you want acceleration - you can +remove one line in the source code: find the file SDL_ph_video.c and +remove the following OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FORCE_SW; -line in the ph_SetupOpenGLContext() function or change argument -to the PHOGL_ATTRIB_FORCE_HW or PHOGL_ATTRIB_FAVOR_HW. +line in the ph_SetupOpenGLContext() function or change the argument to +PHOGL_ATTRIB_FORCE_HW or PHOGL_ATTRIB_FAVOR_HW. -========================================================================= -Wheel and multibutton mouses: +====================================================================== +Wheel and multi-button mouses: - Photon emitting keyboard events (key up and down) when moved -mouse wheel. But key_scan field appears valid according to flags, -and it contain zero. It is base method of detecting mouse wheel -events under photon. It looks like a hack, but it works for me :) -on different PC configurations. + Photon emits keyboard events (key up and down) when the mouse +wheel is moved. The key_scan field appears valid, and it contains zero. +That is a basic method of detecting mouse wheel events under Photon. +It looks like a hack, but it works for me :) on various PC configura- +tions. -I'm tested it on: +I've tested it on: 1. Genius Optical NetScroll/+ (1 wheel) -2. A4Tech Optical GreatEye WheelMouse, model: WOP-35. (2 wheels + - 2 additional buttons). Wheel for vertical scrolling works as - usual, but second wheel for horizontal scrolling emitting two - consequented events up or down, so it can provide more fast - scrolling then the first wheel. Additional buttons doesn't - emitting any events, but its look like handled by photon in - unusual way - like click to front, but works not with any win- - dow, looks like bug-o-feature :). - -========================================================================= +2. A4Tech Optical GreatEye WheelMouse, model: WOP-35. (2 wheels + 2 + additional buttons). The wheel for vertical scrolling works as usu- + al, but the second wheel for horizontal scrolling emits two sequen- + tial events up or down, so it can provide faster scrolling than the + first wheel. Additional buttons don't emit any events, but it looks + like they're handled by photon in an unusual way - like click to + front, but works not with any window, looks like bug-o-feature :). + +====================================================================== CDROM handling issues: - Access to CDROM can be provided only with 'root' previleges. -I can't do anything with this fact. /dev/cd0 have the brw------- -flags and root:root rights. + Access to CDROM can only be provided with 'root' privileges. I +can't do anything about that, /dev/cd0 has brw------- permissions and +root:root rights. -========================================================================= +====================================================================== Video Overlays: - Overlays can flickering during the window movement, resizing, -etc. It happens because photon driver updates the real window -contents behind the overlay, then draws the temporary chroma key -color over window contents. It can be done without the chroma key -using but it cause overlay will be always on top. So flickering -during the movement much better in that case. - Double buffering code temporary disabled in the photon driver -code, beacuse on my GF2-MX it cause accidently buffer switch, -which going to the old frame showing. S3 Savage3D have the same -problem, but ATI Rage 128 has not this problem. I think it can be -fixed later. Current code works very fine, so maybe double buffe- -ring is not needed right now. - Something strange appears when you tried to move window with -overlay beyond the left border of the screen. Overlay trying to -stay at position x=0, but when tried to move it a bit more it -jumps at posituin x=-60. Really strange, looks like overlay -doesn't love the negotive coordinates. - -========================================================================= + Overlays can flicker during window movement, resizing, etc. It +happens because the photon driver updates the real window contents be- +hind the overlay, then draws the temporary chroma key color over the +window contents. It can be done without using the chroma key but that +causes the overlay to always be on top. So flickering during window +movement is preferred instead. + Double buffering code is temporarily disabled in the photon driver +code, because on my GF2-MX it can accidentally cause a buffer switch, +which causes the old frame to show. S3 Savage4 has the same problem, +but ATI Rage 128 doesn't. I think it can be fixed later. Current code +works very well, so maybe double buffering is not needed right now. + Something strange happens when you try to move the window with the +overlay beyond the left border of the screen. The overlay tries to +stay at position x=0, but when attempting to move it a bit more it +jumps to position x=-60 (on GF2-MX, on ATI Rage128 this value a bit +smaller). It's really strange, looks like the overlay doesn't like +negative coordinates. + +======================================================================= Shared library building: - Shared library can be built, but before running autogen.sh -script you need manually delete the libtool m4 stuff from -the acinclude.m4 file (it comes after ESD detection code up to -end of the file). Because libtool stuff in the acinclude.m4 file -very old and doesn't know anything about the QNX. Just remove it -and run autogen.sh script. + A shared library can be built, but before running the autogen.sh +script you must manually delete the libtool.m4 stuff from the acinclu- +de.m4 file (it comes after the ESD detection code up to the end of the +file), because the libtool stuff in the acinclude.m4 file is very old +and doesn't know anything about QNX. Just remove it and run autogen.sh. -========================================================================= +====================================================================== Some building issues: - Feel free to not pass --disable-shared option to configure, -if you read comment above about 'Shared library building'. Other- -wise this option is strongly recomended, because the sdl-config -script will be unfunctional. + Feel free to not use the --disable-shared configure option if you' +ve read the above comment about 'Shared library building'. Otherwise +this option is strongly recommended, as without it the sdl-config +script will be broken. - Run configure script without x11 support, e.g.: + Run the configure script without x11 support, e.g.: a) for OpenGL support: - ./configure --prefix=/usr/local \ + ./configure --prefix=/usr \ --disable-video-x11 \ --disable-shared b) without OpenGL support: - ./configure --prefix=/usr/local \ + ./configure --prefix=/usr \ --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 - + In the test directory also run the ./configure script without +x11 support, e.g.: + ./configure --with-sdl-prefix=/usr \ + --with-sdl-exec-prefix=/usr \ + --prefix=/usr --without-x diff --git a/src/video/photon/SDL_ph_image.c b/src/video/photon/SDL_ph_image.c index 28317cdef..0a2977eea 100644 --- a/src/video/photon/SDL_ph_image.c +++ b/src/video/photon/SDL_ph_image.c @@ -267,6 +267,8 @@ int ph_SetupFullScreenImage(_THIS, SDL_Surface* screen) this->UpdateRects = ph_OCDCUpdate; + PgFlush(); + return 0; } diff --git a/src/video/photon/SDL_ph_modes.c b/src/video/photon/SDL_ph_modes.c index 889319f2b..2aee1f879 100644 --- a/src/video/photon/SDL_ph_modes.c +++ b/src/video/photon/SDL_ph_modes.c @@ -297,13 +297,14 @@ int ph_EnterFullScreen(_THIS, SDL_Surface* screen) currently_fullscreen = 1; } + PgFlush(); return 1; } int ph_LeaveFullScreen(_THIS) { - PgDisplaySettings_t mymode_settings; + PgDisplaySettings_t oldmode_settings; if (currently_fullscreen) { @@ -332,11 +333,11 @@ int ph_LeaveFullScreen(_THIS) /* Restore old video mode */ if (old_video_mode != -1) { - mymode_settings.mode = (unsigned short) old_video_mode; - mymode_settings.refresh = (unsigned short) old_refresh_rate; - mymode_settings.flags = 0; + oldmode_settings.mode = (unsigned short) old_video_mode; + oldmode_settings.refresh = (unsigned short) old_refresh_rate; + oldmode_settings.flags = 0; - if (PgSetVideoMode(&mymode_settings) < 0) + if (PgSetVideoMode(&oldmode_settings) < 0) { SDL_SetError("Ph_LeaveFullScreen(): PgSetVideoMode() function failed !\n"); return 0; diff --git a/src/video/photon/SDL_ph_video.c b/src/video/photon/SDL_ph_video.c index 44ccec224..56738fcf4 100644 --- a/src/video/photon/SDL_ph_video.c +++ b/src/video/photon/SDL_ph_video.c @@ -194,9 +194,11 @@ static int ph_SetupWindow(_THIS, int w, int h, int flags) PhPoint_t pos = {0, 0}; PhDim_t dim = {w, h}; int nargs = 0; + const char* windowpos; + const char* iscentered; + int x, y; PtSetArg(&args[nargs++], Pt_ARG_DIM, &dim, 0); - PtSetArg(&args[nargs++], Pt_ARG_FILL_COLOR, Pg_BLACK, 0); if ((flags & SDL_RESIZABLE) == SDL_RESIZABLE) { @@ -234,12 +236,36 @@ static int ph_SetupWindow(_THIS, int w, int h, int flags) if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) { PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0); + PtSetArg(&args[nargs++], Pt_ARG_BASIC_FLAGS, Pt_TRUE, Pt_BASIC_PREVENT_FILL); PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_FFRONT | Ph_WM_MAX); - PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISMAX | - Ph_WM_STATE_ISFOCUS | Ph_WM_STATE_ISALTKEY); + PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISFOCUS | Ph_WM_STATE_ISALTKEY); } else { + windowpos = getenv("SDL_VIDEO_WINDOW_POS"); + iscentered = getenv("SDL_VIDEO_CENTERED"); + + if ((iscentered) || ((windowpos) && (strcmp(windowpos, "center")==0))) + { + pos.x = (desktop_mode.width - w)/2; + pos.y = (desktop_mode.height - h)/2; + PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0); + } + else + { + if (windowpos) + { + if (sscanf(windowpos, "%d,%d", &x, &y) == 2 ) + { + pos.x=x; + pos.y=y; + PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0); + } + } + } + + + PtSetArg(&args[nargs++], Pt_ARG_FILL_COLOR, Pg_BLACK, 0); PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_FALSE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISMAX | Ph_WM_STATE_ISALTKEY); PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_HIDE); PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE, Ph_WM_HIDE); @@ -248,6 +274,7 @@ static int ph_SetupWindow(_THIS, int w, int h, int flags) PtSetResources(window, nargs, args); PtRealizeWidget(window); + PtWindowToFront(window); return 0; } @@ -281,7 +308,6 @@ static const struct ColourMasks* ph_GetColourMasks(int bpp) static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat) { - PgVideoModeInfo_t my_mode_info; PgHWCaps_t my_hwcaps; int i; @@ -325,7 +351,7 @@ static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat) return -1; } - if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &my_mode_info) < 0) + if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &desktop_mode) < 0) { SDL_SetError("ph_VideoInit(): PgGetVideoModeInfo function failed !\n"); this->FreeWMCursor(this, SDL_BlankCursor); @@ -333,9 +359,9 @@ static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat) } /* 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; - desktopbpp = my_mode_info.bits_per_pixel; + vformat->BitsPerPixel = desktop_mode.bits_per_pixel; + vformat->BytesPerPixel = desktop_mode.bytes_per_scanline/desktop_mode.width; + desktopbpp = desktop_mode.bits_per_pixel; /* save current palette */ if (desktopbpp==8) @@ -434,6 +460,7 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, } current->flags &= ~SDL_RESIZABLE; /* no resize for Direct Context */ + current->flags |= SDL_HWSURFACE; } else { @@ -488,6 +515,10 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, { PtFlush(); } + else + { + PgFlush(); + } SDL_Unlock_EventThread(); diff --git a/src/video/photon/SDL_ph_video.h b/src/video/photon/SDL_ph_video.h index da5e54f9d..fd3acea77 100644 --- a/src/video/photon/SDL_ph_video.h +++ b/src/video/photon/SDL_ph_video.h @@ -72,20 +72,22 @@ struct SDL_PrivateVideoData { PgColor_t savedpal[_Pg_MAX_PALETTE]; PgColor_t syspalph[_Pg_MAX_PALETTE]; - struct { + struct + { PdDirectContext_t* direct_context; PdOffscreenContext_t* offscreen_context; PdOffscreenContext_t* offscreen_backcontext; PhDrawContext_t* oldDC; uint8_t* dc_ptr; - unsigned char* CurrentFrameData; - unsigned char* FrameData0; - unsigned char* FrameData1; - int current; - long flags; + unsigned char* CurrentFrameData; + unsigned char* FrameData0; + unsigned char* FrameData1; + int current; + long flags; } ocimage; PgHWCaps_t graphics_card_caps; /* Graphics card caps at the moment of start */ + PgVideoModeInfo_t desktop_mode; /* Current desktop video mode information */ int old_video_mode; /* Stored mode before fullscreen switch */ int old_refresh_rate; /* Stored refresh rate befor fullscreen switch */ @@ -119,6 +121,7 @@ struct SDL_PrivateVideoData { #define currently_hided (this->hidden->currently_hided) #define event (this->hidden->event) #define current_overlay (this->hidden->overlay) +#define desktop_mode (this->hidden->desktop_mode) /* Old variable names */ #define mouse_relative (this->hidden->mouse_relative)