Skip to content
Permalink
Browse files

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.
  • Loading branch information
slouken committed Aug 23, 2003
1 parent 0ef4e82 commit a30c20aee3115a7cdd1e0f02df2be325ae937e35
Showing with 131 additions and 98 deletions.
  1. +1 −1 BUGS
  2. +74 −78 README.QNX
  3. +2 −0 src/video/photon/SDL_ph_image.c
  4. +6 −5 src/video/photon/SDL_ph_modes.c
  5. +39 −8 src/video/photon/SDL_ph_video.c
  6. +9 −6 src/video/photon/SDL_ph_video.h
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 =-
@@ -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,17 +351,17 @@ 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);
return -1;
}

/* 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)

0 comments on commit a30c20a

Please sign in to comment.