Commit 4c4f326a authored by Sam Lantinga's avatar Sam Lantinga

Date: Sat, 18 May 2002 17:40:53 +0300

From: Mike Gorchak <mike@malva.ua>
Subject: New QNX patches

- Added more error check to avoid SEGFAULTS;
- Fixed bug in update function for SDL_HWSURFACE. BTW: update is much
faster than before.
- Added checks for SDL_HWSURFACE flag, chosen bpp must be equal to
desktop bpp for SDL_HWSURFACE.
- Fixed overlay bug, no more SEGFAULTS.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40371
parent 725baca3
......@@ -65,9 +65,7 @@ int ph_SetupImage(_THIS, SDL_Surface *screen)
}
break;
default:{
/* should never get here */
fprintf(stderr,"error: unsupported bbp = %d\n",
screen->format->BitsPerPixel);
fprintf(stderr,"ph_SetupImage(): unsupported bbp = %d\n", screen->format->BitsPerPixel);
return -1;
}
break;
......@@ -106,83 +104,82 @@ int ph_SetupImage(_THIS, SDL_Surface *screen)
int ph_SetupOCImage(_THIS, SDL_Surface *screen)
{
int type = 0;
int type = 0;
/* Determine image type */
switch(screen->format->BitsPerPixel)
{
case 8:{
type = Pg_IMAGE_PALETTE_BYTE;
}
break;
case 15:{
type = Pg_IMAGE_DIRECT_555;
}
break;
case 16:{
type = Pg_IMAGE_DIRECT_565;
/* Determine image type */
switch(screen->format->BitsPerPixel)
{
case 8: {
type = Pg_IMAGE_PALETTE_BYTE;
}
break;
case 15:{
type = Pg_IMAGE_DIRECT_555;
}
break;
case 16:{
type = Pg_IMAGE_DIRECT_565;
}
break;
case 24:{
type = Pg_IMAGE_DIRECT_888;
}
break;
case 32:{
type = Pg_IMAGE_DIRECT_8888;
}
break;
default:{
fprintf(stderr,"ph_SetupOCImage(): unsupported bpp = %d\n", screen->format->BitsPerPixel);
return -1;
}
break;
}
case 24:{
type = Pg_IMAGE_DIRECT_888;
}
break;
case 32:{
type = Pg_IMAGE_DIRECT_8888;
}
break;
default:{
/* should never get here */
fprintf(stderr,"error: unsupported bbp = %d\n",
screen->format->BitsPerPixel);
return -1;
}
break;
}
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.offscreen_context = PdCreateOffscreenContext(0,screen->w,screen->h, Pg_OSC_MEM_PAGE_ALIGN);
if (OCImage.offscreen_context == NULL)
{
printf("PdCreateOffscreenContext failed\n");
return -1;
}
OCImage.Stride = OCImage.offscreen_context->pitch;
if (OCImage.flags & SDL_DOUBLEBUF)
printf("hardware flag for doublebuf offscreen context\n");
OCImage.dc_ptr.ptr8 = (unsigned char *) PdGetOffscreenContextPtr(OCImage.offscreen_context);
OCImage.CurrentFrameData = OCImage.FrameData0;
OCImage.CurrentFrameData->Y = OCImage.dc_ptr.ptr8;
OCImage.CurrentFrameData->U = NULL;
OCImage.CurrentFrameData->V = NULL;
OCImage.current = 0;
if(OCImage.dc_ptr.ptr8 == NULL)
{
printf("PdGetOffscreenContextPtr failed\n");
return -1;
}
PhDCSetCurrent(OCImage.offscreen_context);
screen->pixels = OCImage.CurrentFrameData->Y;
this->UpdateRects = ph_OCUpdate;
return 0;
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.offscreen_context = PdCreateOffscreenContext(0, screen->w, screen->h, Pg_OSC_MEM_PAGE_ALIGN);
if (OCImage.offscreen_context == NULL)
{
fprintf(stderr, "ph_SetupOCImage(): PdCreateOffscreenContext failed !\n");
return -1;
}
OCImage.Stride = OCImage.offscreen_context->pitch;
if (OCImage.flags & SDL_DOUBLEBUF)
{
fprintf(stderr, "ph_SetupOCImage(): Hardware flag for doublebuf offscreen context\n");
}
OCImage.dc_ptr.ptr8 = (unsigned char *) PdGetOffscreenContextPtr(OCImage.offscreen_context);
if (OCImage.dc_ptr.ptr8 == NULL)
{
fprintf(stderr, "ph_SetupOCImage(): PdGetOffscreenContextPtr failed !\n");
return -1;
}
OCImage.CurrentFrameData = OCImage.FrameData0;
OCImage.CurrentFrameData->Y = OCImage.dc_ptr.ptr8;
OCImage.CurrentFrameData->U = NULL;
OCImage.CurrentFrameData->V = NULL;
OCImage.current = 0;
PhDCSetCurrent(OCImage.offscreen_context);
screen->pixels = OCImage.CurrentFrameData->Y;
this->UpdateRects = ph_OCUpdate;
return 0;
}
int ph_SetupOpenGLImage(_THIS, SDL_Surface* screen)
......@@ -242,7 +239,6 @@ int ph_ResizeImage(_THIS, SDL_Surface *screen, Uint32 flags)
return ph_SetupImage(this, screen);
}
}
int ph_AllocHWSurface(_THIS, SDL_Surface *surface)
{
return(-1);
......@@ -302,20 +298,21 @@ void ph_NormalUpdate(_THIS, int numrects, SDL_Rect *rects)
if (PgDrawPhImageRectmx(&ph_pos, SDL_Image, &ph_rect, 0) < 0)
{
fprintf(stderr,"ph_NormalUpdate: PgDrawPhImageRectmx failed.\n");
fprintf(stderr,"ph_NormalUpdate(): PgDrawPhImageRectmx failed.\n");
}
}
if (PgFlush() < 0)
{
fprintf(stderr,"ph_NormalUpdate: PgFlush failed.\n");
fprintf(stderr,"ph_NormalUpdate(): PgFlush failed.\n");
}
}
void ph_OCUpdate(_THIS, int numrects, SDL_Rect *rects)
{
PhPoint_t zero = {0};
PhRect_t src_rect;
PhRect_t dest_rect;
PhArea_t src_rect;
PhArea_t dest_rect;
if(OCImage.direct_context == NULL)
{
......@@ -323,7 +320,7 @@ void ph_OCUpdate(_THIS, int numrects, SDL_Rect *rects)
}
PgSetRegion(PtWidgetRid(window));
PgSetClipping(0,NULL);
PgSetClipping(0, NULL);
PgWaitHWIdle();
for (i=0; i<numrects; ++i)
......@@ -333,24 +330,27 @@ void ph_OCUpdate(_THIS, int numrects, SDL_Rect *rects)
continue;
}
src_rect.ul.x=rects[i].x;
src_rect.ul.y=rects[i].y;
dest_rect.ul.x=rects[i].x;
dest_rect.ul.y=rects[i].y;
src_rect.pos.x=rects[i].x;
src_rect.pos.y=rects[i].y;
dest_rect.pos.x=rects[i].x;
dest_rect.pos.y=rects[i].y;
dest_rect.lr.x=src_rect.lr.x= rects[i].x +rects[i].w;
dest_rect.lr.y=src_rect.lr.y= rects[i].y +rects[i].h;
src_rect.size.w=rects[i].w;
src_rect.size.h=rects[i].h;
dest_rect.size.w=rects[i].w;
dest_rect.size.h=rects[i].h;
zero.x = zero.y = 0;
PgSetTranslation (&zero, 0);
zero.x = 0;
zero.y = 0;
PgSetTranslation(&zero, 0);
PgSetRegion(PtWidgetRid(window));
PgSetClipping(0,NULL);
PgContextBlitArea(OCImage.offscreen_context, (PhArea_t *)(&src_rect), NULL, (PhArea_t *)(&dest_rect));
PgSetClipping(0, NULL);
PgContextBlitArea(OCImage.offscreen_context, &src_rect, NULL, &dest_rect);
}
if (PgFlush() < 0)
{
fprintf(stderr,"ph_OCUpdate: PgFlush failed.\n");
fprintf(stderr,"ph_OCUpdate(): PgFlush failed.\n");
}
/* later used to toggling double buffer */
......
......@@ -255,6 +255,16 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
if ((flags & SDL_OPENGL)!=SDL_OPENGL)
{
pargc=0;
// prevent using HWSURFACE in window mode if desktop bpp != chosen bpp
if ((flags & SDL_HWSURFACE) && (!(flags & SDL_FULLSCREEN)))
{
if (desktopbpp!=bpp)
{
fprintf(stderr, "ph_SetVideoMode(): SDL_HWSURFACE available only with chosen bpp equal desktop bpp !\n");
return NULL;
}
}
PtSetArg(&arg[pargc++], Pt_ARG_DIM, &dim, 0);
PtSetArg(&arg[pargc++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE, Pt_RESIZE_XY_AS_REQUIRED);
......@@ -317,7 +327,7 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
#else
if (flags & SDL_OPENGL) /* if no built-in OpenGL support */
{
fprintf(stderr, "error: no OpenGL support, try to recompile library.\n");
fprintf(stderr, "ph_SetVideoMode(): no OpenGL support, try to recompile library.\n");
current->flags=(flags & (~SDL_OPENGL));
return NULL;
#endif /* HAVE_OPENGL */
......@@ -332,7 +342,7 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
{
if ((mode = get_mode_any_format(width, height, bpp)) == 0)
{
fprintf(stderr,"error: get_mode_any_format failed\n");
fprintf(stderr,"ph_SetVideoMode(): get_mode_any_format failed !\n");
exit(1);
}
}
......@@ -340,7 +350,7 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
{
if ((mode = get_mode(width, height, bpp)) == 0)
{
fprintf(stderr,"error: get_mode failed\n");
fprintf(stderr,"ph_SetVideoMode(): get_mode failed !\n");
exit(1);
}
}
......@@ -362,7 +372,7 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
if (PgSetVideoMode(&settings) < 0)
{
fprintf(stderr,"error: PgSetVideoMode failed\n");
fprintf(stderr,"ph_SetVideoMode(): PgSetVideoMode failed !\n");
}
current->flags = (flags & (~SDL_RESIZABLE)); /* no resize for Direct Context */
......@@ -424,8 +434,15 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
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);
rtnval = ph_ResizeImage(this, current, flags);
if (rtnval==-1)
{
fprintf(stderr,"ph_SetVideoMode(): ph_ResizeImage failed !\n");
return NULL;
}
/* delayed set caption call */
if (captionflag)
......@@ -512,9 +529,10 @@ static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
SDL_Image->palette[i] |= colors[i-firstcolor].g<<8;
SDL_Image->palette[i] |= colors[i-firstcolor].b;
}
/* image needs to be redrawed, very slow method */
PgDrawPhImage(&point, SDL_Image, 0);
}
/* image needs to be redrawed, very slow method */
PgDrawPhImage(&point, SDL_Image, 0);
}
else
{
......@@ -533,7 +551,10 @@ static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
/* window mode must use soft palette */
PgSetPalette((PgColor_t*)&syspalph[firstcolor], 0, firstcolor, ncolors, Pg_PALSET_SOFT, 0);
/* image needs to be redrawed, very slow method */
PgDrawPhImage(&point, SDL_Image, 0);
if (SDL_Image)
{
PgDrawPhImage(&point, SDL_Image, 0);
}
}
else
{
......@@ -602,7 +623,7 @@ int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags)
if (oglctx==NULL)
{
fprintf(stderr,"ph_SetupOpenGLContext: cannot create OpenGL context.\n");
fprintf(stderr,"ph_SetupOpenGLContext(): cannot create OpenGL context.\n");
return (-1);
}
......
......@@ -29,7 +29,6 @@ static char rcsid =
#include <stdlib.h>
#include <string.h>
//#include <ncurses.h> //only for bool
#ifndef bool
#define bool char
#define TRUE 1
......@@ -104,7 +103,7 @@ struct private_yuvhwdata {
FRAMEDATA *FrameData0;
FRAMEDATA *FrameData1;
PgScalerProps_t props;
PgScalerCaps_t caps;
PgScalerCaps_t caps;
PgVideoChannel_t *channel;
SDL_Rect CurrentWindow;
long format;
......@@ -142,7 +141,7 @@ grab_ptrs2(PgVideoChannel_t *channel, FRAMEDATA *Frame0, FRAMEDATA *Frame1 )
}
SDL_Overlay *ph_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SDL_Surface *display)
SDL_Overlay* ph_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SDL_Surface *display)
{
SDL_Overlay *overlay;
struct private_yuvhwdata *hwdata;
......@@ -162,7 +161,8 @@ SDL_Overlay *ph_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SD
PhDCSetCurrent(0); //Need to set draw context to window esp. if we we in Offscreeen mode
/* Create the overlay structure */
overlay = (SDL_Overlay *)malloc(sizeof *overlay);
overlay = (SDL_Overlay *)malloc(sizeof(SDL_Overlay));
memset(overlay, 0x00, sizeof(SDL_Overlay));
if ( overlay == NULL ) {
SDL_OutOfMemory();
return(NULL);
......@@ -178,7 +178,8 @@ SDL_Overlay *ph_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SD
overlay->hwfuncs = &ph_yuvfuncs;
/* Create the pixel data and lookup tables */
hwdata = (struct private_yuvhwdata *)malloc(sizeof *hwdata);
hwdata = (struct private_yuvhwdata *)malloc(sizeof(struct private_yuvhwdata));
memset(hwdata, 0x00, sizeof(struct private_yuvhwdata));
overlay->hwdata = hwdata;
if ( hwdata == NULL ) {
SDL_OutOfMemory();
......@@ -186,54 +187,41 @@ SDL_Overlay *ph_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SD
return(NULL);
}
if (overlay->hwdata->channel == NULL)
{
if ((overlay->hwdata->channel = PgCreateVideoChannel(Pg_VIDEO_CHANNEL_SCALER,0)) == NULL)
{
SDL_SetError("Create channel failed:%s\n", strerror( errno ));
free(overlay->hwdata);
free(overlay);
return(NULL);
}
#if 0
overlay->hwdata->caps.size = sizeof (overlay->hwdata->caps);
PgGetScalerCapabilities(overlay->hwdata->channel, 0, &(overlay->hwdata->caps));
if (overlay->hwdata->caps.flags & Pg_SCALER_CAP_DOUBLE_BUFFER)
overlay->hwdata->props.flags |= Pg_SCALER_PROP_DOUBLE_BUFFER;
#endif
}
overlay->hwdata->CurrentWindow.x = 0;
overlay->hwdata->CurrentWindow.y = 0;
overlay->hwdata->CurrentWindow.w = 320;
overlay->hwdata->CurrentWindow.h = 240;
overlay->hwdata->State = OVERLAY_STATE_UNINIT;
overlay->hwdata->screen_bpp = 2;
overlay->hwdata->scaler_on = FALSE;
overlay->hwdata->screen_width = 1024;
overlay->hwdata->screen_height = 768;
overlay->hwdata->FrameData0 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA)));
overlay->hwdata->FrameData1 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA)));
overlay->hwdata->caps.size = sizeof(overlay->hwdata->caps);
if (overlay->hwdata->channel == NULL)
{
if ((overlay->hwdata->channel = PgCreateVideoChannel(Pg_VIDEO_CHANNEL_SCALER,0)) == NULL)
{
SDL_SetError("ph_CreateYUVOverlay(): Create channel failed: %s\n", strerror( errno ));
free(overlay->hwdata);
free(overlay);
return (NULL);
}
}
overlay->hwdata->CurrentWindow.x = 0;
overlay->hwdata->CurrentWindow.y = 0;
overlay->hwdata->CurrentWindow.w = 320;
overlay->hwdata->CurrentWindow.h = 240;
overlay->hwdata->State = OVERLAY_STATE_UNINIT;
overlay->hwdata->screen_bpp = 2;
overlay->hwdata->scaler_on = FALSE;
overlay->hwdata->screen_width = 1024;
overlay->hwdata->screen_height = 768;
overlay->hwdata->FrameData0 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA)));
overlay->hwdata->FrameData1 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA)));
overlay->hwdata->caps.size = sizeof(overlay->hwdata->caps);
//Note you really don't need to do this for SDL as you are given a format, but this is a good example
xv_port = -1;
i=0;
xv_port = -1;
i=0;
while(PgGetScalerCapabilities(overlay->hwdata->channel, i++, &(overlay->hwdata->caps)) == 0)
{
if(overlay->hwdata->caps.format == Pg_VIDEO_FORMAT_YV12) //in SDL
{
......
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