Commit 2c07cb4d authored by Sam Lantinga's avatar Sam Lantinga

*** empty log message ***

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40310
parent d6eaf8e9
README by Mike Gorchak <mike@malva.ua> README by Mike Gorchak <mike@malva.ua>
OpenGL support was experimentally added in window mode (in OpenGL in window mode works well and stable, in fullscreen
fullscreen mode not yet). If you have QNX RtP v6.1.0 w/ or w/o mode too, but fullscreen mode has not been heavily tested.
Patch A you must download new Photon3D runtime from http://de- If you have QNX RtP 6.1.0 w/ or w/o Patch A you must download
velopers.qnx.com. The versions of OS before 6.1.0 are not sup- new Photon3D runtime from http://developers.qnx.com. The versions
ported. of OS before 6.1.0 are not supported.
Problems: Problems:
1. Fullscreen mode (in OpenGL mode) has not been written yet. 1. While creating OpenGL context artificially selected software
2. Photon has some errors in detecting how much bits per pi- renderer mode (QSSL made acceleration only for Voodoo boards
xel videomode has. in fullscreen mode, sorry but I don't have this board, if you
3. No shared libraries yet. We need manually set flag to want acceleration - you may remove some line in source).
2. Photon has some errors in detecting how much bits per pixel
videomode has.
3. No shared libraries yet. We need manually set flag to
'configure' --disable-shared. 'configure' --disable-shared.
Some building issues: Some building issues:
......
...@@ -155,54 +155,52 @@ int ph_GetVideoModes(_THIS) ...@@ -155,54 +155,52 @@ int ph_GetVideoModes(_THIS)
SDL_Rect **ph_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags) SDL_Rect **ph_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
{ {
int i = 0; int i = 0;
int j = 0; int j = 0;
SDL_Rect Amodelist[PH_MAX_VIDEOMODES]; SDL_Rect Amodelist[PH_MAX_VIDEOMODES];
for (i=0; i<PH_MAX_VIDEOMODES; i++) for (i=0; i<PH_MAX_VIDEOMODES; i++)
{ {
SDL_modearray[i]=&SDL_modelist[i]; SDL_modearray[i]=&SDL_modelist[i];
} }
if (PgGetVideoModeList( &mode_list ) < 0)
{
fprintf(stderr,"error: PgGetVideoModeList failed\n");
return NULL;
}
mode_info.bits_per_pixel = 0; if (PgGetVideoModeList( &mode_list ) < 0)
{
fprintf(stderr,"error: PgGetVideoModeList failed\n");
return NULL;
}
for (i=0; i < mode_list.num_modes; i++) mode_info.bits_per_pixel = 0;
{
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
{
fprintf(stderr,"error: PgGetVideoModeInfo failed on mode: 0x%x\n",
mode_list.modes[i]);
return NULL;
}
if(mode_info.bits_per_pixel == format->BitsPerPixel) for (i=0; i < mode_list.num_modes; i++)
{ {
Amodelist[j].w = mode_info.width; if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
Amodelist[j].h = mode_info.height; {
Amodelist[j].x = 0; fprintf(stderr,"error: PgGetVideoModeInfo failed on mode: 0x%x\n", mode_list.modes[i]);
Amodelist[j].y = 0; return NULL;
j++; }
} if(mode_info.bits_per_pixel == format->BitsPerPixel)
} {
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 /* reorder biggest for smallest, assume width dominates */
for(i=0; i< j ; i++) for(i=0; i<j; i++)
{ {
SDL_modelist[i].w = Amodelist[j - i -1].w; SDL_modelist[i].w = Amodelist[j - i -1].w;
SDL_modelist[i].h = Amodelist[j - i -1].h; SDL_modelist[i].h = Amodelist[j - i -1].h;
SDL_modelist[i].x = Amodelist[j - i -1].x; SDL_modelist[i].x = Amodelist[j - i -1].x;
SDL_modelist[i].y = Amodelist[j - i -1].y; SDL_modelist[i].y = Amodelist[j - i -1].y;
} }
SDL_modearray[j]=NULL; SDL_modearray[j]=NULL;
return SDL_modearray; return SDL_modearray;
} }
void ph_FreeVideoModes(_THIS) void ph_FreeVideoModes(_THIS)
...@@ -281,82 +279,53 @@ static void set_best_resolution(_THIS, int width, int height) ...@@ -281,82 +279,53 @@ static void set_best_resolution(_THIS, int width, int height)
} }
} }
/*
static void get_real_resolution(_THIS, int* w, int* h)
{
if ( use_vidmode ) {
//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;
// }
if (PgGetGraphicsHWCaps(&my_hwcaps) >= 0)
{
if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &current_mode_info) < 0)
{
fprintf(stderr,"get_real_resolution: PgGetVideoModeInfo failed\n");
}
*w = current_mode_info.width;
*h = current_mode_info.height;
}
}
// *w = DisplayWidth(SDL_Display, SDL_Screen);
// *h = DisplayHeight(SDL_Display, SDL_Screen);
}
*/
int ph_ResizeFullScreen(_THIS) int ph_ResizeFullScreen(_THIS)
{ {
if (currently_fullscreen) {
if ( currently_fullscreen ) {
set_best_resolution(this, current_w, current_h); set_best_resolution(this, current_w, current_h);
} }
return(1); return (1);
} }
int get_mode(int width, int height, int bpp)
/* return the mode associated with width, height and bpp */ /* return the mode associated with width, height and bpp */
/* if there is no mode then zero is returned */ /* if there is no mode then zero is returned */
int get_mode(int width, int height, int bpp)
{ {
int i; int i;
if(width<640)
{
width=640;
}
if(height<480)
{
height=480;
}
if(width <640) if (PgGetVideoModeList(&mode_list) < 0)
width = 640; {
if(height < 480) fprintf(stderr,"error: PgGetVideoModeList failed\n");
height = 480; return -1;
}
/* search list for exact match */
for (i=0;i<mode_list.num_modes;i++)
{
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
{
fprintf(stderr,"error: PgGetVideoModeInfo failed\n");
return 0;
}
if (PgGetVideoModeList( &mode_list ) < 0) if ((mode_info.width == width) &&
{ (mode_info.height == height) &&
fprintf(stderr,"error: PgGetVideoModeList failed\n"); (mode_info.bits_per_pixel == bpp))
return -1; {
} return mode_list.modes[i];
}
}
// search list for exact match return (i == mode_list.num_modes) ? 0 : mode_list.modes[i];
for (i=0;i<mode_list.num_modes;i++)
{
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
{
fprintf(stderr,"error: PgGetVideoModeInfo failed\n");
return 0;
}
if ((mode_info.width == width) &&
(mode_info.height == height) &&
(mode_info.bits_per_pixel == bpp))
{
return mode_list.modes[i];
}
}
return (i == mode_list.num_modes) ? 0 : mode_list.modes[i];
} }
int get_mode_any_format(int width, int height, int bpp) int get_mode_any_format(int width, int height, int bpp)
...@@ -421,7 +390,7 @@ int get_mode_any_format(int width, int height, int bpp) ...@@ -421,7 +390,7 @@ int get_mode_any_format(int width, int height, int bpp)
return mode_list.modes[ closest ]; return mode_list.modes[ closest ];
} }
else else
return 0; return 0;
} }
void ph_WaitMapped(_THIS); void ph_WaitMapped(_THIS);
...@@ -430,78 +399,88 @@ void ph_QueueEnterFullScreen(_THIS); ...@@ -430,78 +399,88 @@ void ph_QueueEnterFullScreen(_THIS);
int ph_ToggleFullScreen(_THIS, int on) int ph_ToggleFullScreen(_THIS, int on)
{ {
if (currently_fullscreen)
if(currently_fullscreen) {
ph_LeaveFullScreen(this); return ph_LeaveFullScreen(this);
else }
ph_EnterFullScreen(this); else
{
return ph_EnterFullScreen(this);
}
return 0; return 0;
} }
int ph_EnterFullScreen(_THIS) int ph_EnterFullScreen(_THIS)
{ {
if ( ! currently_fullscreen ) if (!currently_fullscreen)
{ {
if ((this->screen->flags & SDL_OPENGL)==SDL_OPENGL)
if (old_video_mode==-1) {
{ #ifdef HAVE_OPENGL
PgGetGraphicsHWCaps(&graphics_card_caps); #endif /* HAVE_OPENGL */
old_video_mode=graphics_card_caps.current_video_mode; return 0;
old_refresh_rate=graphics_card_caps.current_rrate; }
} else
{
if (old_video_mode==-1)
if(OCImage.direct_context == NULL) {
OCImage.direct_context=(PdDirectContext_t*)PdCreateDirectContext(); PgGetGraphicsHWCaps(&graphics_card_caps);
if( !OCImage.direct_context ) old_video_mode=graphics_card_caps.current_video_mode;
fprintf(stderr, "error: Can't create direct context\n" ); old_refresh_rate=graphics_card_caps.current_rrate;
}
/* Remove the cursor if in full screen mode */
/*
region_info.cursor_type = Ph_CURSOR_NONE;
region_info.rid=PtWidgetRid(window);
PhRegionChange(Ph_REGION_CURSOR,0,&region_info,NULL,NULL);
*/
PdDirectStart( OCImage.direct_context ); if(OCImage.direct_context == NULL)
{
OCImage.direct_context=(PdDirectContext_t*)PdCreateDirectContext();
}
if(!OCImage.direct_context)
{
fprintf(stderr, "error: Can't create direct context\n" );
}
currently_fullscreen = 1; PdDirectStart(OCImage.direct_context);
}
currently_fullscreen = 1;
}
}
return 1;
return 1;
} }
int ph_LeaveFullScreen(_THIS ) int ph_LeaveFullScreen(_THIS )
{ {
PgDisplaySettings_t mymode_settings; PgDisplaySettings_t mymode_settings;
if ( currently_fullscreen ) if (currently_fullscreen)
{ {
PdDirectStop(OCImage.direct_context); if ((this->screen->flags & SDL_OPENGL)==SDL_OPENGL)
PdReleaseDirectContext(OCImage.direct_context); {
#ifdef HAVE_OPENGL
#endif /* HAVE_OPENGL */
return 0;
}
else
{
PdDirectStop(OCImage.direct_context);
PdReleaseDirectContext(OCImage.direct_context);
//Restore old video mode /* Restore old video mode */
if (old_video_mode != -1) if (old_video_mode != -1)
{ {
mymode_settings.mode= (unsigned short) old_video_mode; mymode_settings.mode= (unsigned short) old_video_mode;
mymode_settings.refresh= (unsigned short) old_refresh_rate; mymode_settings.refresh= (unsigned short) old_refresh_rate;
mymode_settings.flags = 0; mymode_settings.flags = 0;
if(PgSetVideoMode(&mymode_settings) < 0) if (PgSetVideoMode(&mymode_settings) < 0)
{ {
fprintf(stderr,"error: PgSetVideoMode failed\n"); fprintf(stderr,"error: PgSetVideoMode failed\n");
} }
} }
old_video_mode=-1; old_video_mode=-1;
old_refresh_rate=-1; old_refresh_rate=-1;
}
// Restore cursor
}
} return 1;
return 1;
} }
...@@ -58,17 +58,24 @@ static void ph_VideoQuit(_THIS); ...@@ -58,17 +58,24 @@ static void ph_VideoQuit(_THIS);
static void ph_DeleteDevice(SDL_VideoDevice *device); static void ph_DeleteDevice(SDL_VideoDevice *device);
#ifdef HAVE_OPENGL #ifdef HAVE_OPENGL
int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags);
static void ph_GL_SwapBuffers(_THIS); static void ph_GL_SwapBuffers(_THIS);
static int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value); static int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value);
#endif /* HAVE_OPENGL */ #endif /* HAVE_OPENGL */
#ifdef HAVE_OPENGL
PdOpenGLContext_t* OGLContext=NULL;
#endif /* HAVE_OPENGL */
static int ph_Available(void) static int ph_Available(void)
{ {
return 1; int phstat=-1;
phstat=PtInit(0);
if (phstat==0)
{
return 1;
}
else
{
return 0;
}
} }
static SDL_VideoDevice *ph_CreateDevice(int devindex) static SDL_VideoDevice *ph_CreateDevice(int devindex)
...@@ -77,7 +84,7 @@ static SDL_VideoDevice *ph_CreateDevice(int devindex) ...@@ -77,7 +84,7 @@ static SDL_VideoDevice *ph_CreateDevice(int devindex)
/* Initialize all variables that we clean on shutdown */ /* Initialize all variables that we clean on shutdown */
device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice)); device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));
if ( device ) { if (device) {
memset(device, 0, (sizeof *device)); memset(device, 0, (sizeof *device));
device->hidden = (struct SDL_PrivateVideoData *) device->hidden = (struct SDL_PrivateVideoData *)
malloc((sizeof *device->hidden)); malloc((sizeof *device->hidden));
...@@ -98,10 +105,10 @@ static SDL_VideoDevice *ph_CreateDevice(int devindex) ...@@ -98,10 +105,10 @@ static SDL_VideoDevice *ph_CreateDevice(int devindex)
device->VideoInit = ph_VideoInit; device->VideoInit = ph_VideoInit;
device->ListModes = ph_ListModes; device->ListModes = ph_ListModes;
device->SetVideoMode = ph_SetVideoMode; device->SetVideoMode = ph_SetVideoMode;
device->ToggleFullScreen = ph_ToggleFullScreen; device->ToggleFullScreen = ph_ToggleFullScreen;
device->UpdateMouse = NULL; device->UpdateMouse = NULL;
device->SetColors = ph_SetColors; device->SetColors = ph_SetColors;
device->UpdateRects = NULL; /* ph_ResizeImage; */ device->UpdateRects = NULL; /* ph_ResizeImage */
device->VideoQuit = ph_VideoQuit; device->VideoQuit = ph_VideoQuit;
device->AllocHWSurface = ph_AllocHWSurface; device->AllocHWSurface = ph_AllocHWSurface;
device->CheckHWBlit = NULL; device->CheckHWBlit = NULL;
...@@ -149,13 +156,15 @@ VideoBootStrap ph_bootstrap = { ...@@ -149,13 +156,15 @@ VideoBootStrap ph_bootstrap = {
static void ph_DeleteDevice(SDL_VideoDevice *device) static void ph_DeleteDevice(SDL_VideoDevice *device)
{ {
if (device)
if ( device ) { {
if ( device->hidden ) { if (device->hidden)
{
free(device->hidden); free(device->hidden);
device->hidden = NULL; device->hidden = NULL;
} }
if ( device->gl_data ) { if (device->gl_data)
{
free(device->gl_data); free(device->gl_data);
device->gl_data = NULL; device->gl_data = NULL;
} }
...@@ -166,104 +175,68 @@ static void ph_DeleteDevice(SDL_VideoDevice *device) ...@@ -166,104 +175,68 @@ static void ph_DeleteDevice(SDL_VideoDevice *device)
static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat) static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat)
{ {
PtArg_t arg[1]; PgColor_t ph_palette[_Pg_MAX_PALETTE];
PhDim_t dim; int i;
PgColor_t ph_palette[_Pg_MAX_PALETTE]; unsigned long *tempptr;
int i; int rtnval;
unsigned long *tempptr; PgVideoModeInfo_t my_mode_info;
int rtnval; PgHWCaps_t my_hwcaps;
// PgDisplaySettings_t mysettings;
PgVideoModeInfo_t my_mode_info;
PgHWCaps_t my_hwcaps;
if( NULL == ( event = malloc( EVENT_SIZE ) ) )
exit( EXIT_FAILURE );
/* Create a widget 'window' to capture events */ window=NULL;
dim.w=0; //JB test320; oglctx=NULL;
dim.h=0; //JB test240;
//We need to return BytesPerPixel as it in used by CreateRGBsurface
PtSetArg(&arg[0], Pt_ARG_DIM, &dim,0); if (NULL == (event = malloc(EVENT_SIZE)))
{
/* exit(EXIT_FAILURE);
PtSetArg(&arg[1], Pt_ARG_RESIZE_FLAGS, Pt_TRUE, Pt_RESIZE_XY_AS_REQUIRED); }
PtSetArg(&arg[2], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT |
Ph_WM_STATE_ISMAX | /* Create the blank cursor */
Ph_WM_STATE_ISFOCUS); SDL_BlankCursor = this->CreateWMCursor(this, blank_cdata, blank_cmask,
(int)BLANK_CWIDTH, (int)BLANK_CHEIGHT,
PtSetArg(&arg[3], Pt_ARG_WINDOW_RENDER_FLAGS,Pt_FALSE,~0); (int)BLANK_CHOTX, (int)BLANK_CHOTY);
PtSetArg(&arg[4], Pt_ARG_WINDOW_MANAGED_FLAGS,Pt_TRUE,
Ph_WM_FFRONT | if (SDL_BlankCursor == NULL)
Ph_WM_CLOSE | {
Ph_WM_TOFRONT | printf("ph_VideoInit: could not create blank cursor\n");
Ph_WM_CONSWITCH); }
*/
if (PgGetGraphicsHWCaps(&my_hwcaps) < 0)
{
window=PtAppInit(NULL, NULL, NULL, 1, arg); fprintf(stderr,"ph_VideoInit: GetGraphicsHWCaps failed!! \n");
}
if(window == NULL)
{ if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &my_mode_info) < 0)
printf("Photon application init failed, probably Photon is not running.\n"); {
exit( EXIT_FAILURE ); fprintf(stderr,"ph_VideoInit: PgGetVideoModeInfo failed\n");
} }
//PgSetDrawBufferSize(16 *1024); /* We need to return BytesPerPixel as it in used by CreateRGBsurface */
PgSetRegion(PtWidgetRid(window)); vformat->BitsPerPixel = my_mode_info.bits_per_pixel;
PgSetClipping(0,NULL); vformat->BytesPerPixel = my_mode_info.bytes_per_scanline/my_mode_info.width;
PtRealizeWidget(window);
/* Get the available video modes */
// if(ph_GetVideoModes(this) < 0)
// return -1;
/* Create the blank cursor */
SDL_BlankCursor = this->CreateWMCursor(this, blank_cdata, blank_cmask,
(int)BLANK_CWIDTH, (int)BLANK_CHEIGHT,
(int)BLANK_CHOTX, (int)BLANK_CHOTY);
if(SDL_BlankCursor == NULL)
printf("could not create blank cursor\n");
if (PgGetGraphicsHWCaps(&my_hwcaps) < 0)
{
fprintf(stderr,"ph_VideoInit: GetGraphicsHWCaps failed!! \n");
}
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 = my_mode_info.bytes_per_scanline/my_mode_info.width;
//return a palette if we are in 256 color mode /* return a palette if we are in 256 color mode */
if(vformat->BitsPerPixel == 8) if (vformat->BitsPerPixel == 8)
{ {
vformat->palette = malloc(sizeof(SDL_Palette)); vformat->palette = malloc(sizeof(SDL_Palette));
memset(vformat->palette, 0, sizeof(SDL_Palette)); memset(vformat->palette, 0, sizeof(SDL_Palette));
vformat->palette->ncolors = 256; vformat->palette->ncolors = 256;
vformat->palette->colors = (SDL_Color *)malloc(256 *sizeof(SDL_Color)); vformat->palette->colors = (SDL_Color *)malloc(256 *sizeof(SDL_Color));
//fill the palette /* fill the palette */
rtnval = PgGetPalette(ph_palette); rtnval = PgGetPalette(ph_palette);
if(rtnval < 0) if (rtnval < 0)
printf("ph_VideoInit: PgGetPalette failed\n"); {
fprintf(stderr, "ph_VideoInit: PgGetPalette failed\n");
tempptr = (unsigned long *)vformat->palette->colors; }
for(i=0;i<256; i++)
{
*tempptr = (((unsigned long)ph_palette[i]) << 8);
tempptr++;
} tempptr = (unsigned long *)vformat->palette->colors;
}
for(i=0;i<256; i++)
{
*tempptr = (((unsigned long)ph_palette[i]) << 8);
tempptr++;
}
}
currently_fullscreen = 0; currently_fullscreen = 0;
...@@ -276,21 +249,14 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, ...@@ -276,21 +249,14 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
int width, int height, int bpp, Uint32 flags) int width, int height, int bpp, Uint32 flags)
{ {
PgDisplaySettings_t settings; PgDisplaySettings_t settings;
int mode, actual_width, actual_height; int mode;
PtArg_t arg[5]; PtArg_t arg[32];
PhDim_t dim; PhDim_t dim;
int rtnval; int rtnval;
PgColor_t ph_palette[_Pg_MAX_PALETTE]; PgColor_t ph_palette[_Pg_MAX_PALETTE];
int i; int i;
unsigned long *tempptr; unsigned long *tempptr;
int pargc;
#ifdef HAVE_OPENGL
uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS];
int OGLargc;
#endif /* HAVE_OPENGL */
actual_width = width;
actual_height = height;
dim.w=width; dim.w=width;
dim.h=height; dim.h=height;
...@@ -298,137 +264,132 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, ...@@ -298,137 +264,132 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
/* Lock the event thread, in multi-threading environments */ /* Lock the event thread, in multi-threading environments */
SDL_Lock_EventThread(); SDL_Lock_EventThread();
/* Initialize the window */ /* create window if no OpenGL support selected */
if (flags & SDL_FULLSCREEN) /* Direct Context , assume SDL_HWSURFACE also set */ if ((flags & SDL_OPENGL)!=SDL_OPENGL)
{ {
/* Get the video mode and set it */ pargc=0;
if (flags & SDL_ANYFORMAT)
{ PtSetArg(&arg[pargc++], Pt_ARG_DIM, &dim, 0);
if ((mode = get_mode_any_format(width, height, bpp)) == 0) PtSetArg(&arg[pargc++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE, Pt_RESIZE_XY_AS_REQUIRED);
{
fprintf(stderr,"error: get_mode_any_format failed\n");
exit(1);
}
}
else
{
if ((mode = get_mode(width, height, bpp)) == 0)
{
fprintf(stderr,"error: get_mode failed\n");
exit(1);
}
}
settings.mode = mode;
settings.refresh = 0;
settings.flags = 0;
if (PgSetVideoMode( &settings ) < 0) if (window!=NULL)
{ {
fprintf(stderr,"error: PgSetVideoMode failed\n"); PtUnrealizeWidget(window);
PtDestroyWidget(window);
window=NULL;
} }
/* Get the true height and width */ window=PtCreateWidget(PtWindow, NULL, pargc-1, arg);
PtRealizeWidget(window);
current->flags = (flags & (~SDL_RESIZABLE)); /* no resize for Direct Context */
/* Begin direct mode */ PtFlush();
}
ph_EnterFullScreen(this);
} /* end fullscreen flag */ #ifdef HAVE_OPENGL
else if (flags & SDL_OPENGL)
{ {
if (flags & SDL_HWSURFACE) /* Use offscreen memory iff SDL_HWSURFACE flag is set */ /* ph_SetupOpenGLContext creates also window as need */
{ if (ph_SetupOpenGLContext(this, width, height, bpp, flags)==0)
/* Hardware surface is Offsceen Context. ph_ResizeImage handles the switch */ {
current->flags = (flags & (~SDL_RESIZABLE)); /* no stretch blit in offscreen context */ current->flags=flags;
} /* setup OGL update function ... ugly method */
else /* must be SDL_SWSURFACE */ ph_ResizeImage(this, current, flags);
{ }
current->flags = (flags | SDL_RESIZABLE); /* yes we can resize as this is a software surface */ else
} {
/* if context creation fail, report no OpenGL to high level */
#ifdef HAVE_OPENGL current->flags=(flags & (~SDL_OPENGL));
if (flags & SDL_OPENGL) /* for now support OpenGL in window mode only */ }
{
OGLargc=0;
if (this->gl_config.depth_size)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DEPTH_BITS;
OGLAttrib[OGLargc++]=this->gl_config.depth_size;
}
if (this->gl_config.stencil_size)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_STENCIL_BITS;
OGLAttrib[OGLargc++]=this->gl_config.stencil_size;
}
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_NONE;
if (this->gl_config.double_buffer)
{
OGLContext=PdCreateOpenGLContext(2, &dim, 0, OGLAttrib);
}
else
{
OGLContext=PdCreateOpenGLContext(1, &dim, 0, OGLAttrib);
}
if (OGLContext==NULL)
{
fprintf(stderr,"error: cannot create OpenGL context.\n");
exit(1);
}
PhDCSetCurrent(OGLContext);
}
#else #else
if (flags & SDL_OPENGL) /* if no OpenGL support */ if (flags & SDL_OPENGL) /* if no built-in OpenGL support */
{ {
fprintf(stderr, "error: no OpenGL support, try to recompile library.\n"); fprintf(stderr, "error: no OpenGL support, try to recompile library.\n");
exit(1); current->flags=(flags & (~SDL_OPENGL));
} return NULL;
#endif /* HAVE_OPENGL */ #endif /* HAVE_OPENGL */
} }
else
{
/* Initialize the window */
if (flags & SDL_FULLSCREEN) /* Direct Context , assume SDL_HWSURFACE also set */
{
/* Get the video mode and set it */
if (flags & SDL_ANYFORMAT)
{
if ((mode = get_mode_any_format(width, height, bpp)) == 0)
{
fprintf(stderr,"error: get_mode_any_format failed\n");
exit(1);
}
}
else
{
if ((mode = get_mode(width, height, bpp)) == 0)
{
fprintf(stderr,"error: get_mode failed\n");
exit(1);
}
}
settings.mode = mode;
settings.refresh = 0;
settings.flags = 0;
/* If we are setting video to use the palette make sure we have allocated memory for it */ if (PgSetVideoMode( &settings ) < 0)
if(bpp == 8) {
{ fprintf(stderr,"error: PgSetVideoMode failed\n");
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 */
rtnval = PgGetPalette(ph_palette);
tempptr = (unsigned long *)current->format->palette->colors; /* Get the true height and width */
for(i=0;i<256; i++) current->flags = (flags & (~SDL_RESIZABLE)); /* no resize for Direct Context */
{
*tempptr = (((unsigned long)ph_palette[i]) << 8);
tempptr++;
} /* Begin direct mode */
}
ph_EnterFullScreen(this);
/* Current window dimensions */ } /* end fullscreen flag */
PtGetResource( window, Pt_ARG_DIM, &dim, 0 ); 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 */
}
else /* must be SDL_SWSURFACE */
{
current->flags = (flags | SDL_RESIZABLE); /* yes we can resize as this is a software surface */
}
}
/* If we need to resize the window */ /* If we are setting video to use the palette make sure we have allocated memory for it */
if((dim.w != width)||(dim.h != height)) if (bpp==8)
{ {
dim.w=width; current->format->palette = malloc(sizeof(SDL_Palette));
dim.h=height; memset(current->format->palette, 0, sizeof(SDL_Palette));
PtSetArg(&arg[0], Pt_ARG_DIM, &dim,0); current->format->palette->ncolors = 256;
PtSetResources( window, 1, arg ); current->format->palette->colors = (SDL_Color *)malloc(256 *sizeof(SDL_Color));
current->w = width; /* fill the palette */
current->h = height; rtnval = PgGetPalette(ph_palette);
current->format->BitsPerPixel = bpp;
current->format->BytesPerPixel = (bpp+7)/8; tempptr = (unsigned long *)current->format->palette->colors;
current->pitch = SDL_CalculatePitch(current);
/* Must call at least once it setup image planes */ for(i=0; i<256; i++)
ph_ResizeImage(this, current, flags); {
*tempptr = (((unsigned long)ph_palette[i]) << 8);
tempptr++;
}
} }
}
current->w = width;
current->h = height;
current->format->BitsPerPixel = bpp;
current->format->BytesPerPixel = (bpp+7)/8;
current->pitch = SDL_CalculatePitch(current);
/* Must call at least once it setup image planes */
ph_ResizeImage(this, current, flags);
SDL_Unlock_EventThread(); SDL_Unlock_EventThread();
/* We're done! */ /* We're done! */
...@@ -437,17 +398,46 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, ...@@ -437,17 +398,46 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
static void ph_VideoQuit(_THIS) static void ph_VideoQuit(_THIS)
{ {
PhRegion_t region_info;
ph_DestroyImage(this, SDL_VideoSurface); ph_DestroyImage(this, SDL_VideoSurface);
if (currently_fullscreen) if (currently_fullscreen)
{ {
PdDirectStop( directContext ); PdDirectStop(directContext);
PdReleaseDirectContext( directContext ); PdReleaseDirectContext(directContext);
directContext=0; directContext=0;
currently_fullscreen = 0; currently_fullscreen=0;
} }
}
#ifdef HAVE_OPENGL
if (((this->screen->flags & SDL_FULLSCREEN)==SDL_FULLSCREEN) &&
((this->screen->flags & SDL_OPENGL)==SDL_OPENGL))
{
region_info.cursor_type=Ph_CURSOR_POINTER;
region_info.rid=PtWidgetRid(window);
PhRegionChange(Ph_REGION_CURSOR, 0, &region_info, NULL, NULL);
}
PtFlush();
#endif /* HAVE_OPENGL */
if (window)
{
PtUnrealizeWidget(window);
PtDestroyWidget(window);
window=NULL;
}
#ifdef HAVE_OPENGL
if (oglctx)
{
PhDCSetCurrent(NULL);
PhDCRelease(oglctx);
oglctx=NULL;
}
#endif /* HAVE_OPENGL */
}
static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
{ {
...@@ -508,10 +498,110 @@ static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) ...@@ -508,10 +498,110 @@ static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
} }
#ifdef HAVE_OPENGL #ifdef HAVE_OPENGL
int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags)
{
PtArg_t args[8];
PhDim_t dim;
uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS];
int OGLargc;
int pargc;
dim.w=width;
dim.h=height;
if (oglctx!=NULL)
{
PhDCSetCurrent(NULL);
PhDCRelease(oglctx);
oglctx=NULL;
}
OGLargc=0;
if (this->gl_config.depth_size)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DEPTH_BITS;
OGLAttrib[OGLargc++]=this->gl_config.depth_size;
}
if (this->gl_config.stencil_size)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_STENCIL_BITS;
OGLAttrib[OGLargc++]=this->gl_config.stencil_size;
}
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FORCE_SW;
if (flags & SDL_FULLSCREEN)
{
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN;
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DIRECT;
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_BEST;
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_CENTER;
}
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_NONE;
if (this->gl_config.double_buffer)
{
oglctx=PdCreateOpenGLContext(2, &dim, 0, OGLAttrib);
}
else
{
oglctx=PdCreateOpenGLContext(1, &dim, 0, OGLAttrib);
}
if (oglctx==NULL)
{
fprintf(stderr,"error: cannot create OpenGL context.\n");
return (-1);
}
PhDCSetCurrent(oglctx);
pargc=0;
PtSetArg(&args[pargc++], Pt_ARG_DIM, &dim, 0);
PtSetArg(&args[pargc++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE, Pt_RESIZE_XY_AS_REQUIRED);
PtSetArg(&args[pargc++], Pt_ARG_FILL_COLOR, Pg_BLACK, 0);
if (flags & SDL_FULLSCREEN)
{
PhPoint_t pos;
pos.x=0;
pos.y=0;
PtSetArg(&args[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, ~0);
PtSetArg(&args[pargc++], Pt_ARG_WINDOW_MANAGED_FLAGS,Pt_TRUE, Ph_WM_FFRONT | Ph_WM_CLOSE | Ph_WM_TOFRONT | Ph_WM_CONSWITCH);
PtSetArg(&args[pargc++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISFOCUS);
PtSetArg(&args[pargc++], Pt_ARG_POS, &pos, 0);
}
if (window!=NULL)
{
PtUnrealizeWidget(window);
PtDestroyWidget(window);
window=NULL;
}
window=PtCreateWidget(PtWindow, NULL, pargc-1, args);
PtRealizeWidget(window);
/* disable mouse for fullscreen */
if (flags & SDL_FULLSCREEN)
{
PhRegion_t region_info;
region_info.cursor_type=Ph_CURSOR_NONE;
region_info.rid=PtWidgetRid(window);
PhRegionChange(Ph_REGION_CURSOR, 0, &region_info, NULL, NULL);
}
PtFlush();
return 0;
}
void ph_GL_SwapBuffers(_THIS) void ph_GL_SwapBuffers(_THIS)
{ {
PgSetRegion(PtWidgetRid(window)); PgSetRegion(PtWidgetRid(window));
PdOpenGLContextSwapBuffers(OGLContext); PdOpenGLContextSwapBuffers(oglctx);
} }
int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)
......
...@@ -19,26 +19,6 @@ ...@@ -19,26 +19,6 @@
Sam Lantinga Sam Lantinga
slouken@libsdl.org slouken@libsdl.org
*/ */
/*
static PhEvent_t *event;
static PtAppContext_t app;
static PtWidget_t *window;
static PgVideoModes_t modelist;
static PdOffscreenContext_t *Buff[2];
static PdDirectContext_t *directContext;
static PhRect_t screenRect,windowRect;
static PgColor_t currRGB;
static PhPoint_t zeroPoint;
static char keyque[ QUE_SIZE ],keyMatrix[256];
static int queput,queget;
static int modeSet;
static PgHWCaps_t hwCaps;
static PgDisplaySettings_t mode_settings;
static int rshift1,rshift2,gshift1,gshift2,bshift1,bshift2;
static int backPitch;
static unsigned RBitMask,GBitMask,BBitMask;
static unsigned TranslatedFillColor;
*/
#ifndef _SDL_ph_video_h #ifndef _SDL_ph_video_h
#define _SDL_ph_video_h #define _SDL_ph_video_h
...@@ -50,7 +30,9 @@ static unsigned TranslatedFillColor; ...@@ -50,7 +30,9 @@ static unsigned TranslatedFillColor;
#include "Pt.h" #include "Pt.h"
#include <photon/Pg.h> #include <photon/Pg.h>
#include <photon/PdDirect.h> #include <photon/PdDirect.h>
#ifdef HAVE_OPENGL
#include <photon/PdGL.h> #include <photon/PdGL.h>
#endif /* HAVE_OPENGL */
/* Hidden "this" pointer for the video functions */ /* Hidden "this" pointer for the video functions */
#define _THIS SDL_VideoDevice *this #define _THIS SDL_VideoDevice *this
...@@ -76,31 +58,32 @@ struct SDL_PrivateVideoData { ...@@ -76,31 +58,32 @@ struct SDL_PrivateVideoData {
int local_ph; /* Flag: true if local display */ int local_ph; /* Flag: true if local display */
PtAppContext_t app; PtAppContext_t app;
PgDisplaySettings_t mode_settings; PgDisplaySettings_t mode_settings;
PtWidget_t *window; /* used to handle input events */ PtWidget_t *Window; /* used to handle input events */
PhImage_t *image; /* used to display image */ PhImage_t *image; /* used to display image */
#ifdef HAVE_OPENGL
struct { PdOpenGLContext_t* OGLContext;
PdDirectContext_t *direct_context; #endif /* HAVE_OPENGL */
PdOffscreenContext_t *offscreen_context;
VidPtr_t dc_ptr; struct {
FRAMEDATA *CurrentFrameData; PdDirectContext_t *direct_context;
FRAMEDATA *FrameData0; PdOffscreenContext_t *offscreen_context;
FRAMEDATA *FrameData1; VidPtr_t dc_ptr;
int current; FRAMEDATA *CurrentFrameData;
long Stride; FRAMEDATA *FrameData0;
long flags; FRAMEDATA *FrameData1;
} ocimage; int current;
long Stride;
long flags;
} ocimage;
PhDrawContext_t *ScreenDC; //=NULL; PhDrawContext_t *ScreenDC; //=NULL;
signed short old_video_mode; //=-1; signed short old_video_mode; //=-1;
signed short old_refresh_rate; //=-1; signed short old_refresh_rate; //=-1;
PgHWCaps_t graphics_card_caps; PgHWCaps_t graphics_card_caps;
PdDirectContext_t *directContext; PdDirectContext_t *directContext;
PdOffscreenContext_t *Buff[2]; PdOffscreenContext_t *Buff[2];
struct _Ph_ctrl* ctrl_channel; struct _Ph_ctrl* ctrl_channel;
PhGC_t *Pt_GC, *Pg_GC; /* Graphic contexts to switch between Pt and Pg APIs */
/* The variables used for displaying graphics */ /* The variables used for displaying graphics */
...@@ -113,15 +96,15 @@ struct SDL_PrivateVideoData { ...@@ -113,15 +96,15 @@ struct SDL_PrivateVideoData {
int x; int x;
int y; int y;
} mouse_last; } mouse_last;
struct { struct {
int numerator; int numerator;
int denominator; int denominator;
int threshold; int threshold;
} mouse_accel; } mouse_accel;
int mouse_relative;
WMcursor* BlankCursor;
int mouse_relative;
WMcursor* BlankCursor;
int depth; /* current visual depth (not bpp) */ int depth; /* current visual depth (not bpp) */
...@@ -136,40 +119,39 @@ struct SDL_PrivateVideoData { ...@@ -136,40 +119,39 @@ struct SDL_PrivateVideoData {
int blit_queued; int blit_queued;
short *iconcolors; /* List of colors used by the icon */ short *iconcolors; /* List of colors used by the icon */
PhEvent_t* event; PhEvent_t* event;
}; };
#define local_ph (this->hidden->local_ph) #define local_ph (this->hidden->local_ph)
#define app (this->hidden->app) #define app (this->hidden->app)
#define mode_settings (this->hidden->mode_settings) #define mode_settings (this->hidden->mode_settings)
#define window (this->hidden->window) #define window (this->hidden->Window)
#define directContext (this->hidden->directContext) #define oglctx (this->hidden->OGLContext)
#define Buff (this->hidden->Buff) #define directContext (this->hidden->directContext)
#define ctrl_channel (this->hidden->ctrl_channel) #define Buff (this->hidden->Buff)
#define SDL_Image (this->hidden->image) #define ctrl_channel (this->hidden->ctrl_channel)
#define OCImage (this->hidden->ocimage) #define SDL_Image (this->hidden->image)
#define old_video_mode (this->hidden->old_video_mode) #define OCImage (this->hidden->ocimage)
#define old_refresh_rate (this->hidden->old_refresh_rate) #define old_video_mode (this->hidden->old_video_mode)
#define graphics_card_caps (this->hidden->graphics_card_caps) #define old_refresh_rate (this->hidden->old_refresh_rate)
#define Pt_GC (this->hidden->Pt_GC) #define graphics_card_caps (this->hidden->graphics_card_caps)
#define Pg_GC (this->hidden->Pg_GC)
/* Old variable names */ /* Old variable names */
#define swap_pixels (this->hidden->swap_pixels) #define swap_pixels (this->hidden->swap_pixels)
#define current_w (this->hidden->current_w) #define current_w (this->hidden->current_w)
#define current_h (this->hidden->current_h) #define current_h (this->hidden->current_h)
#define mouse_last (this->hidden->mouse_last) #define mouse_last (this->hidden->mouse_last)
#define mouse_accel (this->hidden->mouse_accel) #define mouse_accel (this->hidden->mouse_accel)
#define mouse_relative (this->hidden->mouse_relative) #define mouse_relative (this->hidden->mouse_relative)
#define saved_mode (this->hidden->saved_mode) #define saved_mode (this->hidden->saved_mode)
#define saved_view (this->hidden->saved_view) #define saved_view (this->hidden->saved_view)
#define use_vidmode (this->hidden->use_vidmode) #define use_vidmode (this->hidden->use_vidmode)
#define currently_fullscreen (this->hidden->currently_fullscreen) #define currently_fullscreen (this->hidden->currently_fullscreen)
#define switch_waiting (this->hidden->switch_waiting) #define switch_waiting (this->hidden->switch_waiting)
#define switch_time (this->hidden->switch_time) #define switch_time (this->hidden->switch_time)
#define blit_queued (this->hidden->blit_queued) #define blit_queued (this->hidden->blit_queued)
#define SDL_iconcolorIs (this->hidden->iconcolors) #define SDL_iconcolorIs (this->hidden->iconcolors)
#define event (this->hidden->event) #define event (this->hidden->event)
#define SDL_BlankCursor (this->hidden->BlankCursor) #define SDL_BlankCursor (this->hidden->BlankCursor)
#endif /* _SDL_x11video_h */ #endif /* _SDL_x11video_h */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment