From 0448ba78f5d9cbfe5b3e41b41665fdd3bc405d19 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 2 Mar 2002 16:50:35 +0000 Subject: [PATCH] Date: Thu, 21 Feb 2002 09:18:24 +0200 From: "Mike Gorchak" Subject: Re: Patches for QNX RtP again. SDL_ph_image.c - Added OpenGL update functions - fixed some application crashes. Some dead code removed, reformatting some functions. SDL_ph_image_c.h - Added OpenGL update function prototype. SDL_ph_video.c - Added GL_GetAttribute and GL_SetAttribute functions with next supported flags: SDL_GL_DOUBLEBUFFER, SDL_GL_STENCIL_SIZE, SDL_GL_DEPTH_SIZE GetWMInfo function (stub) has been implemented by me, but not listed in device structure - fixed. SDL_ph_wm.c - fixed warning 'no return in non-void function'. README.QNX - Updating readme. Some spellcheck. ;-) --- README.QNX | 24 ++--- src/video/photon/SDL_ph_image.c | 158 +++++++++++++++--------------- src/video/photon/SDL_ph_image_c.h | 2 +- src/video/photon/SDL_ph_video.c | 110 ++++++++++++--------- src/video/photon/SDL_ph_wm.c | 2 + 5 files changed, 158 insertions(+), 138 deletions(-) diff --git a/README.QNX b/README.QNX index c342dd945..e964bad52 100644 --- a/README.QNX +++ b/README.QNX @@ -1,17 +1,17 @@ -README by Mike Gorchak +README by Mike Gorchak - Experimentally added OpenGL support in window mode (in fullscreen -mode not yet). If you have QNX RtP v6.1.0 w/ or w/o Patch A you need -to download new Photon3D runtime from http://developers.qnx.com. The -versions of OS before 6.1.0 is not supported. + OpenGL support was experimentally added in window mode (in +fullscreen mode not yet). If you have QNX RtP v6.1.0 w/ or w/o +Patch A you must download new Photon3D runtime from http://de- +velopers.qnx.com. The versions of OS before 6.1.0 are not sup- +ported. Problems: -1. OpenGL support is very raw. It is often fail. Update function has - not been written yet. Fullscreen mode has not been written yet. -2. Photon has some errors in detecting how much bits per pixel has - videomode, creating images with different color depth. -3. No shared libraries yet. We need manually set flags as - --disable-shared. +1. Fullscreen mode (in OpenGL mode) has not been written yet. +2. Photon has some errors in detecting how much bits per pi- + xel videomode has. +3. No shared libraries yet. We need manually set flag to + 'configure' --disable-shared. Some building issues: @@ -22,7 +22,7 @@ Some building issues: --disable-video-x11 \ --disable-shared - a) without OpenGL support: + b) without OpenGL support: ./configure --prefix=/usr/local \ --disable-video-x11 \ --disable-shared \ diff --git a/src/video/photon/SDL_ph_image.c b/src/video/photon/SDL_ph_image.c index 636787183..e3533edca 100644 --- a/src/video/photon/SDL_ph_image.c +++ b/src/video/photon/SDL_ph_image.c @@ -33,62 +33,54 @@ static char rcsid = #include "SDL_endian.h" #include "SDL_ph_image_c.h" -//printf("%s:%s:%d\n", __FILE__, __PRETTY_FUNCTION__, __LINE__ ); - -/* Various screen update functions available */ -//static void ph_NormalUpdate(_THIS, int numrects, SDL_Rect *rects); -//static void ph_DummyUpdate(_THIS, int numrects, SDL_Rect *rects); - int ph_SetupImage(_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; - } - break; + /* 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:{ + /* should never get here */ + fprintf(stderr,"error: unsupported bbp = %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; - } + /* using shared memory for speed (set last param to 1) */ + if ((SDL_Image = PhCreateImage(NULL, screen->w, screen->h, type, NULL, 0, 1)) == NULL) + { + fprintf(stderr,"error: PhCreateImage failed.\n"); + return -1; + } - //using shared memory for speed (set last param to 1) - if ((SDL_Image = PhCreateImage( NULL, screen->w, screen->h, type, NULL, 0, 1 )) == NULL) - { - fprintf(stderr,"error: PhCreateImage failed.\n"); - return -1; - } + screen->pixels = SDL_Image->image; - screen->pixels = SDL_Image->image; - - this->UpdateRects = ph_NormalUpdate; + this->UpdateRects = ph_NormalUpdate; - return 0; + return 0; } int ph_SetupOCImage(_THIS, SDL_Surface *screen) //Offscreen context @@ -172,39 +164,36 @@ int ph_SetupOCImage(_THIS, SDL_Surface *screen) //Offscreen context return 0; } +int ph_SetupOpenGLImage(_THIS, SDL_Surface* screen) +{ + this->UpdateRects = ph_OpenGLUpdate; + + return 0; +} void ph_DestroyImage(_THIS, SDL_Surface *screen) { -#if 0 - if(SDL_Image == NULL) - return; -#endif + if (OCImage.offscreen_context != NULL) + { + PhDCRelease(OCImage.offscreen_context); + OCImage.offscreen_context = NULL; + free(OCImage.FrameData0); + OCImage.FrameData0 = NULL; + free(OCImage.FrameData1); + OCImage.FrameData1 = NULL; + } - if (OCImage.offscreen_context != NULL) - { - PhDCRelease(OCImage.offscreen_context); - OCImage.offscreen_context = NULL; - free(OCImage.FrameData0); - OCImage.FrameData0 = NULL; - free(OCImage.FrameData1); - OCImage.FrameData1 = NULL; - } - - if (SDL_Image) - { - // SDL_Image->flags=Ph_RELEASE_IMAGE; - // PhReleaseImage(SDL_Image); - if (SDL_Image->image) - PgShmemDestroy(SDL_Image->image); // Use this if you using shared memory, or uncomment - // lines above if not (and comment this line ;-) - free(SDL_Image); - SDL_Image = NULL; - } + if (SDL_Image) + { + PgShmemDestroy(SDL_Image->image); + free(SDL_Image); + SDL_Image = NULL; + } - if ( screen ) - { - screen->pixels = NULL; - } + if (screen) + { + screen->pixels = NULL; + } } int ph_ResizeImage(_THIS, SDL_Surface *screen, Uint32 flags) @@ -213,12 +202,12 @@ int ph_ResizeImage(_THIS, SDL_Surface *screen, Uint32 flags) if( flags & SDL_HWSURFACE) { - OCImage.flags = flags; //needed for SDL_DOUBLEBUF check - return ph_SetupOCImage(this,screen); + OCImage.flags = flags; /* needed for SDL_DOUBLEBUF check */ + return ph_SetupOCImage(this, screen); } - else if(flags & SDL_OPENGL) /* No image when using GL */ + else if(flags & SDL_OPENGL) { - return 0; + return ph_SetupOpenGLImage(this, screen); } else { @@ -260,6 +249,13 @@ static PhPoint_t ph_pos; static PhRect_t ph_rect; static int i; +void ph_OpenGLUpdate(_THIS, int numrects, SDL_Rect* rects) +{ + this->GL_SwapBuffers(this); + + return; +} + void ph_NormalUpdate(_THIS, int numrects, SDL_Rect *rects) { diff --git a/src/video/photon/SDL_ph_image_c.h b/src/video/photon/SDL_ph_image_c.h index 6352f67ed..46fac1623 100644 --- a/src/video/photon/SDL_ph_image_c.h +++ b/src/video/photon/SDL_ph_image_c.h @@ -39,4 +39,4 @@ extern int ph_FlipHWSurface(_THIS, SDL_Surface *surface); extern void ph_NormalUpdate(_THIS, int numrects, SDL_Rect *rects); extern void ph_OCUpdate(_THIS, int numrects, SDL_Rect *rects); -extern void ph_DummyUpdate(_THIS, int numrects, SDL_Rect *rects); +extern void ph_OpenGLUpdate(_THIS, int numrects, SDL_Rect *rects); diff --git a/src/video/photon/SDL_ph_video.c b/src/video/photon/SDL_ph_video.c index fc454a11c..c735c6738 100644 --- a/src/video/photon/SDL_ph_video.c +++ b/src/video/photon/SDL_ph_video.c @@ -56,7 +56,11 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors); static void ph_VideoQuit(_THIS); static void ph_DeleteDevice(SDL_VideoDevice *device); + +#ifdef HAVE_OPENGL static void ph_GL_SwapBuffers(_THIS); +static int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value); +#endif /* HAVE_OPENGL */ #ifdef HAVE_OPENGL PdOpenGLContext_t* OGLContext=NULL; @@ -64,7 +68,7 @@ PdOpenGLContext_t* OGLContext=NULL; static int ph_Available(void) { - return 1; + return 1; } static SDL_VideoDevice *ph_CreateDevice(int devindex) @@ -112,7 +116,7 @@ static SDL_VideoDevice *ph_CreateDevice(int devindex) device->SetIcon = NULL; device->IconifyWindow = ph_IconifyWindow; device->GrabInput = ph_GrabInput; - device->GetWMInfo = NULL; + device->GetWMInfo = ph_GetWMInfo; device->FreeWMCursor = ph_FreeWMCursor; device->CreateWMCursor = ph_CreateWMCursor; device->ShowWMCursor = ph_ShowWMCursor; @@ -124,12 +128,13 @@ static SDL_VideoDevice *ph_CreateDevice(int devindex) /* OpenGL support. */ device->GL_LoadLibrary = NULL; device->GL_GetProcAddress = NULL; - device->GL_GetAttribute = NULL; device->GL_MakeCurrent = NULL; #ifdef HAVE_OPENGL device->GL_SwapBuffers = ph_GL_SwapBuffers; + device->GL_GetAttribute = ph_GL_GetAttribute; #else device->GL_SwapBuffers = NULL; + device->GL_GetAttribute = NULL; #endif /* HAVE_OPENGL */ device->free = ph_DeleteDevice; @@ -271,10 +276,6 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags) { PgDisplaySettings_t settings; -/* - PgHWCaps_t my_hwcaps; - PgVideoModeInfo_t mode_info; -*/ int mode, actual_width, actual_height; PtArg_t arg[5]; PhDim_t dim; @@ -285,7 +286,8 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, #ifdef HAVE_OPENGL uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS]; -#endif // HAVE_OPENGL + int OGLargc; +#endif /* HAVE_OPENGL */ actual_width = width; actual_height = height; @@ -312,11 +314,9 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, { if ((mode = get_mode(width, height, bpp)) == 0) { - fprintf(stderr,"error: get_mode failed\n"); - exit(1); + fprintf(stderr,"error: get_mode failed\n"); + exit(1); } - - } settings.mode = mode; settings.refresh = 0; @@ -327,14 +327,13 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, fprintf(stderr,"error: PgSetVideoMode failed\n"); } - /* Get the true height and width */ - - current->flags = (flags & (~SDL_RESIZABLE)); /* no resize for Direct Context */ + /* Get the true height and width */ - /* Begin direct mode */ - ph_EnterFullScreen(this); + current->flags = (flags & (~SDL_RESIZABLE)); /* no resize for Direct Context */ - + /* Begin direct mode */ + + ph_EnterFullScreen(this); } /* end fullscreen flag */ else @@ -352,17 +351,40 @@ static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current, #ifdef HAVE_OPENGL if (flags & SDL_OPENGL) /* for now support OpenGL in window mode only */ { - OGLAttrib[0]=PHOGL_ATTRIB_DEPTH_BITS; - OGLAttrib[1]=bpp; - OGLAttrib[2]=PHOGL_ATTRIB_NONE; - OGLContext=PdCreateOpenGLContext(2, &dim, 0, OGLAttrib); + 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"); + fprintf(stderr,"error: cannot create OpenGL context.\n"); exit(1); } PhDCSetCurrent(OGLContext); } +#else + if (flags & SDL_OPENGL) /* if no OpenGL support */ + { + fprintf(stderr, "error: no OpenGL support, try to recompile library.\n"); + exit(1); + } + #endif /* HAVE_OPENGL */ } @@ -488,28 +510,28 @@ static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) #ifdef HAVE_OPENGL void ph_GL_SwapBuffers(_THIS) { - PgSetRegion(PtWidgetRid(window)); - PdOpenGLContextSwapBuffers(OGLContext); + PgSetRegion(PtWidgetRid(window)); + PdOpenGLContextSwapBuffers(OGLContext); } -#endif // HAVE_OPENGL -/* -static int ph_ResizeWindow(_THIS, - SDL_Surface *screen, int w, int h, Uint32 flags) +int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) { - PhWindowEvent_t winevent; - - memset( &winevent, 0, sizeof(winevent) ); - winevent.event_f = Ph_WM_RESIZE; - winevent.size.w = w; - winevent.size.h = h; - winevent.rid = PtWidgetRid( window ); - if (PtForwardWindowEvent( &winevent ) < 0) - { - fprintf(stderr,"error: PtForwardWindowEvent failed.\n"); - } - current_w = w; - current_h = h; - return(0); + switch (attrib) + { + case SDL_GL_DOUBLEBUFFER: + *value=this->gl_config.double_buffer; + break; + case SDL_GL_STENCIL_SIZE: + *value=this->gl_config.stencil_size; + break; + case SDL_GL_DEPTH_SIZE: + *value=this->gl_config.depth_size; + break; + default: + *value=0; + return(-1); + } + return 0; } -*/ + +#endif /* HAVE_OPENGL */ diff --git a/src/video/photon/SDL_ph_wm.c b/src/video/photon/SDL_ph_wm.c index 08e7171a5..6d47eaea0 100644 --- a/src/video/photon/SDL_ph_wm.c +++ b/src/video/photon/SDL_ph_wm.c @@ -242,6 +242,8 @@ int ph_IconifyWindow(_THIS) windowevent.rid = PtWidgetRid( window ); PtForwardWindowEvent( &windowevent ); SDL_Unlock_EventThread(); + + return 0; } SDL_GrabMode ph_GrabInputNoLock(_THIS, SDL_GrabMode mode)