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. --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40693
This commit is contained in:
parent
0cc5681acd
commit
b0204f4006
6 changed files with 129 additions and 96 deletions
2
BUGS
2
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 =-
|
||||
|
|
148
README.QNX
148
README.QNX
|
@ -1,112 +1,108 @@
|
|||
README by Mike Gorchak <mike@malva.ua>, <lestat@i.com.ua>
|
||||
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
|
||||
|
|
|
@ -267,6 +267,8 @@ int ph_SetupFullScreenImage(_THIS, SDL_Surface* screen)
|
|||
|
||||
this->UpdateRects = ph_OCDCUpdate;
|
||||
|
||||
PgFlush();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue