changeset 255:dcb5e869f8b5

Updated Amiga port by Gabriele Greco
author Sam Lantinga <slouken@libsdl.org>
date Sun, 16 Dec 2001 20:00:27 +0000
parents 4fc12b8edf74
children 640dcf27d2f7
files src/audio/amigaos/SDL_ahiaudio.c src/audio/amigaos/SDL_ahiaudio.h src/joystick/amigaos/SDL_sysjoystick.c src/thread/amigaos/SDL_syssem.c src/thread/amigaos/SDL_systhread.c src/thread/amigaos/SDL_systhread_c.h src/timer/amigaos/SDL_systimer.c src/video/cybergfx/SDL_amigaevents.c src/video/cybergfx/SDL_cgxaccel.c src/video/cybergfx/SDL_cgxgl.c src/video/cybergfx/SDL_cgxgl_c.h src/video/cybergfx/SDL_cgximage.c src/video/cybergfx/SDL_cgxmodes.c src/video/cybergfx/SDL_cgxvideo.c src/video/cybergfx/SDL_cgxvideo.h
diffstat 15 files changed, 578 insertions(+), 773 deletions(-) [+]
line wrap: on
line diff
--- a/src/audio/amigaos/SDL_ahiaudio.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/audio/amigaos/SDL_ahiaudio.c	Sun Dec 16 20:00:27 2001 +0000
@@ -29,10 +29,6 @@
 
 /* Allow access to a raw mixing buffer (for AmigaOS) */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
 #include "SDL_endian.h"
 #include "SDL_audio.h"
 #include "SDL_audiomem.h"
--- a/src/audio/amigaos/SDL_ahiaudio.h	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/audio/amigaos/SDL_ahiaudio.h	Sun Dec 16 20:00:27 2001 +0000
@@ -35,6 +35,8 @@
 #else
 #include <inline/exec.h>
 #endif
+#include <stdlib.h>
+#include <string.h>
 
 #include <devices/ahi.h>
 #include "mydebug.h"
@@ -47,7 +49,7 @@
 	/* The handle for the audio device */
 	struct AHIRequest *audio_req[2];
 	struct MsgPort *audio_port;
-	Sint32 freq,type,bytespersample;
+	Sint32 freq,type,bytespersample,size;
 	Uint8 *mixbuf[2];           /* The app mixing buffer */
 	int current_buffer;
 	Uint32 playing;
--- a/src/joystick/amigaos/SDL_sysjoystick.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/joystick/amigaos/SDL_sysjoystick.c	Sun Dec 16 20:00:27 2001 +0000
@@ -31,7 +31,7 @@
 #include <stdio.h>		/* For the definition of NULL */
 
 #include <libraries/lowlevel.h>
-#ifdef __SASC
+#if defined(__SASC) || defined(STORMC4_WOS)
 #include <proto/exec.h>
 #include <proto/lowlevel.h>
 #include <proto/graphics.h>
@@ -72,7 +72,7 @@
 	JPF_BUTTON_REVERSE,
 };
 
-struct joystick_hwdata 
+struct joystick_hwdata
 {
 	ULONG joystate;
 };
@@ -128,7 +128,7 @@
 
 	for(i=0;i<20;i++)
 	{
-		temp=ReadJoyPort(joystick->index);
+		temp=ReadJoyPort(joystick->index^1); // fix to invert amiga joyports
 		WaitTOF();
 	}
 
@@ -152,7 +152,7 @@
  */
 void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
 {
-	ULONG data;	
+	ULONG data;
 	int i;
 
 	if(joystick->index<2)
--- a/src/thread/amigaos/SDL_syssem.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/thread/amigaos/SDL_syssem.c	Sun Dec 16 20:00:27 2001 +0000
@@ -61,7 +61,7 @@
 	memset(sem,0,sizeof(*sem));
 
 	InitSemaphore(&sem->Sem);
-	
+
 	return(sem);
 }
 
@@ -143,10 +143,14 @@
 Uint32 SDL_SemValue(SDL_sem *sem)
 {
 	Uint32 value;
-	
+
 	value = 0;
 	if ( sem ) {
+		#ifdef STORMC4_WOS
+		value = sem->Sem.ssppc_SS.ss_NestCount;
+		#else
 		value = sem->Sem.ss_NestCount;
+		#endif
 //		SDL_UnlockMutex(sem->count_lock);
 	}
 	return value;
--- a/src/thread/amigaos/SDL_systhread.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/thread/amigaos/SDL_systhread.c	Sun Dec 16 20:00:27 2001 +0000
@@ -32,6 +32,7 @@
 #include "SDL_thread.h"
 #include "SDL_thread_c.h"
 #include "SDL_systhread.h"
+#include "mydebug.h"
 
 typedef struct {
 	int (*func)(void *);
@@ -47,10 +48,15 @@
 #elif defined(__PPC__)
 Uint32 RunThread(char *args)
 #else
-Uint32 RunThread(char *args __asm("a0") )
+Uint32 __saveds RunThread(char *args __asm("a0") )
 #endif
 {
+	#ifdef STORMC4_WOS
+	thread_args *data=(thread_args *)args;
+	#else
 	thread_args *data=(thread_args *)atol(args);
+	#endif
+
 	struct Task *Father;
 
 	D(bug("Received data: %lx\n",data));
@@ -59,6 +65,7 @@
 	SDL_RunThread(data);
 
 	Signal(Father,SIGBREAKF_CTRL_F);
+	D(bug("Thread with data %lx ended\n",data));
 	return(0);
 }
 
@@ -68,7 +75,7 @@
 
 Uint32 RunTheThread(void)
 {
-	thread_args *data=(thread_args *)atol(REG_A0);
+	thread_args *data=(thread_args *)atol((char *)REG_A0);
 	struct Task *Father;
 
 	D(bug("Received data: %lx\n",data));
@@ -77,16 +84,18 @@
 	SDL_RunThread(data);
 
 	Signal(Father,SIGBREAKF_CTRL_F);
+	D(bug("Thread with data %lx ended\n",data));
 	return(0);
 }
 
-struct EmulLibEntry RunThread=
+struct EmulLibEntry RunThreadStruct=
 {
 	TRAP_LIB,
 	0,
-	RunTheThread
+	(ULONG)RunTheThread
 };
 
+void *RunThread=&RunThreadStruct;
 #endif
 
 
@@ -100,7 +109,14 @@
 	if(args)
 		sprintf(buffer,"%ld",args);
 
-
+	#ifdef STORMC4_WOS
+	thread->handle=CreateTaskPPCTags(TASKATTR_CODE,	RunThread,
+					TASKATTR_NAME,	"SDL subtask",
+					TASKATTR_STACKSIZE, 100000,
+					(args ? TASKATTR_R3 : TAG_IGNORE), args,
+					TASKATTR_INHERITR2, TRUE,
+					TAG_DONE);
+	#else
 	thread->handle=(struct Task *)CreateNewProcTags(NP_Output,Output(),
 					NP_Name,(ULONG)"SDL subtask",
 					NP_CloseOutput, FALSE,
@@ -108,6 +124,8 @@
 					NP_Entry,(ULONG)RunThread,
 					args ? NP_Arguments : TAG_IGNORE,(ULONG)buffer,
 					TAG_DONE);
+	#endif
+
 	if(!thread->handle)
 	{
 		SDL_SetError("Not enough resources to create thread");
--- a/src/thread/amigaos/SDL_systhread_c.h	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/thread/amigaos/SDL_systhread_c.h	Sun Dec 16 20:00:27 2001 +0000
@@ -28,7 +28,7 @@
 #include <exec/exec.h>
 #include <dos/dos.h>
 #include <dos/dostags.h>
-#ifdef __SASC
+#if defined (__SASC) || defined(STORMC4_WOS)
 #include <proto/dos.h>
 #include <proto/exec.h>
 #else
@@ -44,5 +44,25 @@
 extern struct ExecBase *SysBase;
 extern struct DosLibrary *DOSBase;
 
+#ifdef STORMC4_WOS
+#include <proto/powerpc.h>
+
+/* use powerpc.library functions instead og exec */
+#define SYS_ThreadHandle struct TaskPPC *
+#define Signal SignalPPC
+#define Wait WaitPPC
+#define Task TaskPPC
+#define FindTask FindTaskPPC
+#define SetSignal SetSignalPPC
+
+#define InitSemaphore InitSemaphorePPC
+#define ObtainSemaphore ObtainSemaphorePPC
+#define AttemptSemaphore AttemptSemaphorePPC
+#define ReleaseSemaphore ReleaseSemaphorePPC
+#define SignalSemaphore SignalSemaphorePPC
+
+#else
+
 #define SYS_ThreadHandle struct Task *
+#endif /*STORMC4_WOS*/
 
--- a/src/timer/amigaos/SDL_systimer.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/timer/amigaos/SDL_systimer.c	Sun Dec 16 20:00:27 2001 +0000
@@ -38,6 +38,10 @@
 #include <pragmas/graphics.h>
 #include <clib/exec_protos.h>
 #include <pragmas/exec.h>
+#elif defined(STORMC4_WOS)
+#include <proto/dos.h>
+#include <proto/exec.h>
+#include <proto/graphics.h>
 #else
 #include <inline/dos.h>
 #include <inline/exec.h>
@@ -59,7 +63,7 @@
 
 /* The first ticks value of the application */
 
-#ifndef __PPC__
+#if !defined(__PPC__) || defined(STORMC4_WOS) || defined(MORPHOS)
 static clock_t start;
 
 void SDL_StartTicks(void)
@@ -120,7 +124,7 @@
 	/* Set first ticks value */
 	if(!MyTimer)
 		PPC_TimerInit();
-	
+
 	PPCGetTimerObject(MyTimer,PPCTIMERTAG_CURRENTTICKS,start);
 	start[1]>>=10;
 	start[1]|=((result[0]&0x3ff)<<22);
@@ -134,7 +138,7 @@
 
 //	PPCAsr64p(result,10);
 // Non va, la emulo:
-	
+
 	result[1]>>=10;
 	result[1]|=((result[0]&0x3ff)<<22);
 
@@ -200,7 +204,7 @@
 	else
 	{
 		D(bug("Errore nell'inizializzazione del timer!\n"));
-	}	
+	}
 }
 
 #endif
@@ -234,7 +238,7 @@
 /* This is only called if the event thread is not running */
 int SDL_SYS_TimerInit(void)
 {
-	D(bug("Creo il thread per il timer (NOITMER)...\n"));
+	D(bug("Creating thread for the timer (NOITIMER)...\n"));
 
 	timer_alive = 1;
 	timer_thread = SDL_CreateThread(RunTimer, NULL);
--- a/src/video/cybergfx/SDL_amigaevents.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/video/cybergfx/SDL_amigaevents.c	Sun Dec 16 20:00:27 2001 +0000
@@ -148,7 +148,7 @@
 			break;
 #if 0
 	    /* Gaining input focus? */
-	    case IDCMP_ACTIVEWINDOW: 
+	    case IDCMP_ACTIVEWINDOW:
 			posted = SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS);
 
 			/* Queue entry into fullscreen mode */
@@ -166,7 +166,7 @@
 		    break;
 #endif
 	    /* Mouse motion? */
-	    case IDCMP_MOUSEMOVE: 
+	    case IDCMP_MOUSEMOVE:
 			if ( SDL_VideoSurface ) {
 				posted = SDL_PrivateMouseMotion(0, 0,
 						msg->MouseX-SDL_Window->BorderLeft,
@@ -179,14 +179,14 @@
 
 			if(!(code&IECODE_UP_PREFIX))
 			{
-				posted = SDL_PrivateMouseButton(SDL_PRESSED, 
+				posted = SDL_PrivateMouseButton(SDL_PRESSED,
 						amiga_GetButton(code), 0, 0);
 			    }
 	    /* Mouse button release? */
 			else
 			{
 				code&=~IECODE_UP_PREFIX;
-				posted = SDL_PrivateMouseButton(SDL_RELEASED, 
+				posted = SDL_PrivateMouseButton(SDL_RELEASED,
 						amiga_GetButton(code), 0, 0);
 			}
 			break;
@@ -211,7 +211,7 @@
 			/* Check to see if this is a repeated key */
 /*			if ( ! X11_KeyRepeat(SDL_Display, &xevent) )  */
 
-				posted = SDL_PrivateKeyboard(SDL_RELEASED, 
+				posted = SDL_PrivateKeyboard(SDL_RELEASED,
 					amiga_TranslateKey(code, &keysym));
 		    }
 		    break;
@@ -235,7 +235,7 @@
 		posted = SDL_PrivateAppActive(1, SDL_APPACTIVE);
 
 		if ( SDL_VideoSurface &&
-		     (SDL_VideoSurface->flags & SDL_FULLSCREEN) ) 
+		     (SDL_VideoSurface->flags & SDL_FULLSCREEN) )
 		{
 			CGX_EnterFullScreen(this);
 		} else {
@@ -254,9 +254,10 @@
 #endif
 
 	    /* Have we been resized? */
-	    case IDCMP_NEWSIZE: 
+	    case IDCMP_NEWSIZE:
 			SDL_PrivateResize(SDL_Window->Width-SDL_Window->BorderLeft-SDL_Window->BorderRight,
 		                  SDL_Window->Height-SDL_Window->BorderTop-SDL_Window->BorderBottom);
+
 			break;
 
 	    /* Have we been requested to quit? */
@@ -428,7 +429,11 @@
 
 SDL_keysym *amiga_TranslateKey(int code, SDL_keysym *keysym)
 {
+	#ifdef STORMC4_WOS
+	static struct Library *KeymapBase=NULL; /* Linking failed in WOS version if ConsoleDevice was used */
+	#else
 	static struct Library *ConsoleDevice=NULL;
+	#endif
 
 	/* Get the raw keyboard scancode */
 	keysym->scancode = code;
@@ -438,10 +443,17 @@
 	fprintf(stderr, "Translating key 0x%.4x (%d)\n", xsym, xkey->keycode);
 #endif
 	/* Get the translated SDL virtual keysym */
-	if ( keysym->sym==SDLK_UNKNOWN ) 
+	if ( keysym->sym==SDLK_UNKNOWN )
 	{
+		#ifdef STORMC4_WOS
+		if(!KeymapBase)
+		#else
 		if(!ConsoleDevice)
+		#endif
 		{
+			#ifdef STORMC4_WOS
+			KeymapBase=OpenLibrary("keymap.library", 0L);
+			#else
 			if(ConPort=CreateMsgPort())
 			{
 				if(ConReq=CreateIORequest(ConPort,sizeof(struct IOStdReq)))
@@ -460,9 +472,14 @@
 					ConPort=NULL;
 				}
 			}
+			#endif
 		}
 
+		#ifdef STORMC4_WOS
+		if(KeymapBase)
+		#else
 		if(ConsoleDevice)
+		#endif
 		{
 			struct InputEvent event;
 			long actual;
@@ -477,7 +494,11 @@
 			event.ie_NextEvent=NULL;
 			event.ie_Prev1DownCode=event.ie_Prev1DownQual=event.ie_Prev2DownCode=event.ie_Prev2DownQual=0;
 
+			#ifdef STORMC4_WOS
+			if( (actual=MapRawKey(&event,buffer,5,NULL))>=0)
+			#else
 			if( (actual=RawKeyConvert(&event,buffer,5,NULL))>=0)
+			#endif
 			{
 				if(actual>1)
 				{
--- a/src/video/cybergfx/SDL_cgxaccel.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/video/cybergfx/SDL_cgxaccel.c	Sun Dec 16 20:00:27 2001 +0000
@@ -1,3 +1,30 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997, 1998, 1999, 2000  Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+
+#ifdef SAVE_RCSID
+static char rcsid =
+ "@(#) $Id$";
+#endif
+
 #include "SDL_error.h"
 #include "SDL_endian.h"
 #include "SDL_sysvideo.h"
@@ -10,7 +37,7 @@
 
 // These are needed to avoid register troubles with gcc -O2!
 
-#if defined(__SASC) || defined(__PPC__)
+#if defined(__SASC) || defined(__PPC__) || defined(MORPHOS)
 #define BMKBRP(a,b,c,d,e,f,g,h,i,j) BltMaskBitMapRastPort(a,b,c,d,e,f,g,h,i,j)
 #define	BBRP(a,b,c,d,e,f,g,h,i) BltBitMapRastPort(a,b,c,d,e,f,g,h,i)
 #define BBB(a,b,c,d,e,f,g,h,i,j,k) BltBitMap(a,b,c,d,e,f,g,h,i,j,k)
@@ -18,10 +45,10 @@
 void BMKBRP(struct BitMap *a,WORD b, WORD c,struct RastPort *d,WORD e,WORD f,WORD g,WORD h,UBYTE i,APTR j)
 {BltMaskBitMapRastPort(a,b,c,d,e,f,g,h,i,j);}
 
-void BBRP(struct BitMap *a,WORD b, WORD c,struct RastPort *d,WORD e,WORD f,WORD g,WORD h,UBYTE i) 
+void BBRP(struct BitMap *a,WORD b, WORD c,struct RastPort *d,WORD e,WORD f,WORD g,WORD h,UBYTE i)
 {BltBitMapRastPort(a,b,c,d,e,f,g,h,i);}
 
-void BBB(struct BitMap *a,WORD b, WORD c,struct BitMap *d,WORD e,WORD f,WORD g,WORD h,UBYTE i,UBYTE j,UWORD *k) 
+void BBB(struct BitMap *a,WORD b, WORD c,struct BitMap *d,WORD e,WORD f,WORD g,WORD h,UBYTE i,UBYTE j,UWORD *k)
 {BltBitMap(a,b,c,d,e,f,g,h,i,j,k);}
 #endif
 
@@ -39,7 +66,7 @@
 
 			memset(surface->hwdata->mask,255,RASSIZE(surface->w,surface->h));
 
-			D(bug("Costruisco colorkey: colore: %ld, size: %ld x %ld, %ld bytes...Bpp:%ld\n",key,surface->w,surface->h,RASSIZE(surface->w,surface->h),surface->format->BytesPerPixel));
+			D(bug("Building colorkey mask: color: %ld, size: %ld x %ld, %ld bytes...Bpp:%ld\n",key,surface->w,surface->h,RASSIZE(surface->w,surface->h),surface->format->BytesPerPixel));
 
 			if(lock=LockBitMapTags(surface->hwdata->bmap,LBMI_BASEADDRESS,(ULONG)&surface->pixels,
 					LBMI_BYTESPERROW,(ULONG)&pitch,TAG_DONE))
@@ -138,7 +165,7 @@
 						ok=-1;
 				}
 				UnLockBitMap(lock);
-				D(bug("...Colorkey costruito!\n"));
+				D(bug("...Colorkey built!\n"));
 				return ok;
 			}
 		}
--- a/src/video/cybergfx/SDL_cgxgl.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/video/cybergfx/SDL_cgxgl.c	Sun Dec 16 20:00:27 2001 +0000
@@ -25,189 +25,117 @@
  "@(#) $Id$";
 #endif
 
-// #include <stdlib.h>	/* For getenv() prototype */
-// #include <string.h>
+/* StormMesa implementation of SDL OpenGL support */
 
-#include "SDL_events_c.h"
 #include "SDL_error.h"
+#include "SDL_cgxgl_c.h"
 #include "SDL_cgxvideo.h"
-#include "SDL_cgxgl_c.h"
 
-#define DEFAULT_OPENGL	"libGL.so.1"
+#ifdef HAVE_OPENGL
+AmigaMesaContext glcont=NULL;
+#endif
 
-/* return the preferred visual to use for openGL graphics */
-void *CGX_GL_GetVisual(_THIS)
+/* Init OpenGL */
+int CGX_GL_Init(_THIS)
 {
 #ifdef HAVE_OPENGL
-	/* 64 seems nice. */
-	int attribs[64];
-	int i;
+   int i = 0;
+	struct TagItem attributes [ 14 ]; /* 14 should be more than enough :) */
+   struct Window *win = (struct Window *)SDL_Window;
 
-	/* load the gl driver from a default path */
-	if ( ! this->gl_config.driver_loaded ) {
-	        /* no driver has been loaded, use default (ourselves) */
-	        if ( X11_GL_LoadLibrary(this, NULL) < 0 ) {
-		        return NULL;
-		}
-	}
-
-	/* See if we already have a window which we must use */
-	if ( SDL_windowid ) {
-		XWindowAttributes a;
-		XVisualInfo vi_in;
-		int out_count;
+	// default config. Always used...
+	attributes[i].ti_Tag = AMA_Window;	attributes[i++].ti_Data = (unsigned long)win;
+	attributes[i].ti_Tag = AMA_Left;		attributes[i++].ti_Data = 0;
+	attributes[i].ti_Tag = AMA_Bottom;	attributes[i++].ti_Data = 0;
+	attributes[i].ti_Tag = AMA_Width;	attributes[i++].ti_Data = win->Width-win->BorderLeft-win->BorderRight;
+	attributes[i].ti_Tag = AMA_Height;	attributes[i++].ti_Data = win->Height-win->BorderBottom-win->BorderTop;
+	attributes[i].ti_Tag = AMA_DirectRender; attributes[i++].ti_Data = GL_TRUE;
 
-		XGetWindowAttributes(SDL_Display, SDL_Window, &a);
-		vi_in.screen = SDL_Screen;
-		vi_in.visualid = XVisualIDFromVisual(a.visual);
-		glx_visualinfo = XGetVisualInfo(SDL_Display,
-	                     VisualScreenMask|VisualIDMask, &vi_in, &out_count);
-		return glx_visualinfo;
+	// double buffer ?
+	attributes[i].ti_Tag = AMA_DoubleBuf;
+	if ( this->gl_config.double_buffer ) {
+		attributes[i++].ti_Data = GL_TRUE;
+	}
+	else {
+		attributes[i++].ti_Data = GL_FALSE;
 	}
-
-        /* Setup our GLX attributes according to the gl_config. */
-        i = 0;
-        attribs[i++] = GLX_RGBA;
-	attribs[i++] = GLX_RED_SIZE;
-	attribs[i++] = this->gl_config.red_size;
-	attribs[i++] = GLX_GREEN_SIZE;
-	attribs[i++] = this->gl_config.green_size;
-	attribs[i++] = GLX_BLUE_SIZE;
-	attribs[i++] = this->gl_config.blue_size;
-
-	if( this->gl_config.alpha_size ) {
-		attribs[i++] = GLX_ALPHA_SIZE;
-		attribs[i++] = this->gl_config.alpha_size;
+	// RGB(A) Mode ?
+	attributes[i].ti_Tag = AMA_RGBMode;
+	if ( this->gl_config.red_size   != 0 &&
+	     this->gl_config.blue_size  != 0 &&
+	     this->gl_config.green_size != 0 ) {
+		attributes[i++].ti_Data = GL_TRUE;
 	}
-
-	if( this->gl_config.buffer_size ) {
-                attribs[i++] = GLX_BUFFER_SIZE;
-	        attribs[i++] = this->gl_config.buffer_size;
+	else {
+		attributes[i++].ti_Data = GL_FALSE;
 	}
-
-	if( this->gl_config.double_buffer ) {
-		attribs[i++] = GLX_DOUBLEBUFFER;
+	// no depth buffer ?
+	if ( this->gl_config.depth_size == 0 ) {
+		attributes[i].ti_Tag = AMA_NoDepth;
+		attributes[i++].ti_Data = GL_TRUE;
+	}
+	// no stencil buffer ?
+	if ( this->gl_config.stencil_size == 0 ) {
+		attributes[i].ti_Tag = AMA_NoStencil;
+		attributes[i++].ti_Data = GL_TRUE;
 	}
-
-	attribs[i++] = GLX_DEPTH_SIZE;
-	attribs[i++] = this->gl_config.depth_size;
-
-	if( this->gl_config.stencil_size ) {
-		attribs[i++] = GLX_STENCIL_SIZE;
-		attribs[i++] = this->gl_config.stencil_size;
+	// no accum buffer ?
+	if ( this->gl_config.accum_red_size   != 0 &&
+	     this->gl_config.accum_blue_size  != 0 &&
+	     this->gl_config.accum_green_size != 0 ) {
+		attributes[i].ti_Tag = AMA_NoAccum;
+		attributes[i++].ti_Data = GL_TRUE;
 	}
-
-	if( this->gl_config.accum_red_size ) {
-	        attribs[i++] = GLX_ACCUM_RED_SIZE;
-		attribs[i++] = this->gl_config.accum_red_size;
-	}
-
-	if( this->gl_config.accum_green_size ) {
-	        attribs[i++] = GLX_ACCUM_GREEN_SIZE;
-		attribs[i++] = this->gl_config.accum_green_size;
-	}
+	// done...
+	attributes[i].ti_Tag	= TAG_DONE;
 
-	if( this->gl_config.accum_blue_size ) {
-	        attribs[i++] = GLX_ACCUM_BLUE_SIZE;
-		attribs[i++] = this->gl_config.accum_blue_size;
+	glcont = AmigaMesaCreateContext(attributes);
+	if ( glcont == NULL ) {
+		SDL_SetError("Couldn't create OpenGL context");
+		return(-1);
 	}
-
-	if( this->gl_config.accum_alpha_size ) {
-	        attribs[i++] = GLX_ACCUM_ALPHA_SIZE;
-		attribs[i++] = this->gl_config.accum_alpha_size;
-	}
+	this->gl_data->gl_active = 1;
+	this->gl_config.driver_loaded = 1;
 
-	attribs[i++] = None;
-
- 	glx_visualinfo = this->gl_data->glXChooseVisual(GFX_Display, 
-						  SDL_Screen, attribs);
-	if( !glx_visualinfo ) {
-		SDL_SetError( "Couldn't find matching GLX visual");
-		return NULL;
-	}
-	return glx_visualinfo;
+	return(0);
 #else
-	SDL_SetError("CGX driver is not yet supporting OpenGL");
-	return NULL;
+	SDL_SetError("OpenGL support not configured");
+	return(-1);
 #endif
 }
 
-int CGX_GL_CreateWindow(_THIS, int w, int h)
+/* Quit OpenGL */
+void CGX_GL_Quit(_THIS)
 {
-	int retval;
 #ifdef HAVE_OPENGL
-	XSetWindowAttributes attributes;
-	unsigned long mask;
-	unsigned long black;
-
-	black = (glx_visualinfo->visual == DefaultVisual(SDL_Display,
-						 	SDL_Screen))
-	       	? BlackPixel(SDL_Display, SDL_Screen) : 0;
-	attributes.background_pixel = black;
-	attributes.border_pixel = black;
-	attributes.colormap = SDL_XColorMap;
-	mask = CWBackPixel | CWBorderPixel | CWColormap;
-
-	SDL_Window = XCreateWindow(SDL_Display, WMwindow,
-			0, 0, w, h, 0, glx_visualinfo->depth,
-			InputOutput, glx_visualinfo->visual,
-			mask, &attributes);
-	if ( !SDL_Window ) {
-		SDL_SetError("Could not create window");
-		return -1;
+	if ( glcont != NULL ) {
+		AmigaMesaDestroyContext(glcont);
+		glcont = NULL;
+		this->gl_data->gl_active = 0;
+		this->gl_config.driver_loaded = 0;
 	}
-	retval = 0;
-#else
-	SDL_SetError("CGX driver is not yet supporting OpenGL");
-	retval = -1;
 #endif
-	return(retval);
 }
 
-int CGX_GL_CreateContext(_THIS)
-{
-	int retval;
-#ifdef HAVE_OPENGL
-	/* We do this to create a clean separation between X and GLX errors. */
-	XSync( SDL_Display, False );
-	glx_context = this->gl_data->glXCreateContext(GFX_Display, 
-				     glx_visualinfo, NULL, True);
-	XSync( GFX_Display, False );
-
-	if (glx_context == NULL) {
-		SDL_SetError("Could not create GL context");
-		return -1;
-	}
-
-	gl_active = 1;
-#else
-	SDL_SetError("CGX driver is not yet supporting OpenGL");
-#endif
-	if ( gl_active ) {
-		retval = 0;
-	} else {
-		retval = -1;
-	}
-	return(retval);
-}
-
-void CGX_GL_Shutdown(_THIS)
+/* Attach context to another window */
+int CGX_GL_Update(_THIS)
 {
 #ifdef HAVE_OPENGL
-	/* Clean up OpenGL */
-	if( glx_context ) {
-		this->gl_data->glXMakeCurrent(GFX_Display, None, NULL);
-
-		if (glx_context != NULL)
-			this->gl_data->glXDestroyContext(GFX_Display, glx_context);
+	struct TagItem tags[2];
+	struct Window *win = (struct Window*)SDL_Window;
+	if(glcont == NULL) {
+		return -1; //should never happen
+	}
+	tags[0].ti_Tag = AMA_Window;
+	tags[0].ti_Data = (unsigned long)win;
+	tags[1].ti_Tag = TAG_DONE;
+	AmigaMesaSetRast(glcont, tags);
 
-		if( this->gl_data->glXReleaseBuffersMESA ) {
-		    this->gl_data->glXReleaseBuffersMESA(GFX_Display,SDL_Window);
-		}
-		glx_context = NULL;
-	}
-	gl_active = 0;
-#endif /* HAVE_OPENGL */
+	return 0;
+#else
+	SDL_SetError("OpenGL support not configured");
+	return -1;
+#endif
 }
 
 #ifdef HAVE_OPENGL
@@ -215,175 +143,75 @@
 /* Make the current context active */
 int CGX_GL_MakeCurrent(_THIS)
 {
-	int retval;
-
-	retval = 0;
-	if ( ! this->gl_data->glXMakeCurrent(GFX_Display,
-	                                     SDL_Window, glx_context) ) {
-		SDL_SetError("Unable to make GL context current");
-		retval = -1;
-	}
-	XSync( GFX_Display, False );
-
-	/* More Voodoo X server workarounds... Grr... */
-	SDL_Lock_EventThread();
-	X11_CheckDGAMouse(this);
-	SDL_Unlock_EventThread();
-
-	return(retval);
-}
-
-/* Get attribute data from glX. */
-int CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)
-{
-	int retval;
-	int glx_attrib = None;
+	if(glcont == NULL)
+		return -1;
 
-	switch( attrib ) {
-	    case SDL_GL_RED_SIZE:
-		glx_attrib = GLX_RED_SIZE;
-		break;
-	    case SDL_GL_GREEN_SIZE:
-		glx_attrib = GLX_GREEN_SIZE;
-		break;
-	    case SDL_GL_BLUE_SIZE:
-		glx_attrib = GLX_BLUE_SIZE;
-		break;
-	    case SDL_GL_ALPHA_SIZE:
-		glx_attrib = GLX_ALPHA_SIZE;
-		break;
-	    case SDL_GL_DOUBLEBUFFER:
-		glx_attrib = GLX_DOUBLEBUFFER;
-		break;
-	    case SDL_GL_BUFFER_SIZE:
-		glx_attrib = GLX_BUFFER_SIZE;
-		break;
-	    case SDL_GL_DEPTH_SIZE:
-		glx_attrib = GLX_DEPTH_SIZE;
-		break;
-	    case SDL_GL_STENCIL_SIZE:
-		glx_attrib = GLX_STENCIL_SIZE;
-		break;
-	    case SDL_GL_ACCUM_RED_SIZE:
-		glx_attrib = GLX_ACCUM_RED_SIZE;
-		break;
-	    case SDL_GL_ACCUM_GREEN_SIZE:
-		glx_attrib = GLX_ACCUM_GREEN_SIZE;
-		break;
-	    case SDL_GL_ACCUM_BLUE_SIZE:
-		glx_attrib = GLX_ACCUM_BLUE_SIZE;
-		break;
-	    case SDL_GL_ACCUM_ALPHA_SIZE:
-		glx_attrib = GLX_ACCUM_ALPHA_SIZE;
-		break;
-	    default:
-		return(-1);
-	}
-
-	retval = this->gl_data->glXGetConfig(GFX_Display, glx_visualinfo, glx_attrib, value);
-
-	return retval;
+	AmigaMesaMakeCurrent(glcont, glcont->buffer);
+	return 0;
 }
 
 void CGX_GL_SwapBuffers(_THIS)
 {
-	this->gl_data->glXSwapBuffers(GFX_Display, SDL_Window);
+	AmigaMesaSwapBuffers(glcont);
+}
+
+int CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) {
+	GLenum mesa_attrib;
+
+	switch(attrib) {
+		case SDL_GL_RED_SIZE:
+			mesa_attrib = GL_RED_BITS;
+			break;
+		case SDL_GL_GREEN_SIZE:
+			mesa_attrib = GL_GREEN_BITS;
+			break;
+		case SDL_GL_BLUE_SIZE:
+			mesa_attrib = GL_BLUE_BITS;
+			break;
+		case SDL_GL_ALPHA_SIZE:
+			mesa_attrib = GL_ALPHA_BITS;
+			break;
+		case SDL_GL_DOUBLEBUFFER:
+			mesa_attrib = GL_DOUBLEBUFFER;
+			break;
+		case SDL_GL_DEPTH_SIZE:
+			mesa_attrib = GL_DEPTH_BITS;
+			break;
+		case SDL_GL_STENCIL_SIZE:
+			mesa_attrib = GL_STENCIL_BITS;
+			break;
+		case SDL_GL_ACCUM_RED_SIZE:
+			mesa_attrib = GL_ACCUM_RED_BITS;
+			break;
+		case SDL_GL_ACCUM_GREEN_SIZE:
+			mesa_attrib = GL_ACCUM_GREEN_BITS;
+			break;
+		case SDL_GL_ACCUM_BLUE_SIZE:
+			mesa_attrib = GL_ACCUM_BLUE_BITS;
+			break;
+		case SDL_GL_ACCUM_ALPHA_SIZE:
+			mesa_attrib = GL_ACCUM_ALPHA_BITS;
+			break;
+		default :
+			return -1;
+	}
+
+	AmigaMesaGetConfig(glcont->visual, mesa_attrib, value);
+	return 0;
+}
+
+void *CGX_GL_GetProcAddress(_THIS, const char *proc) {
+	void *func = NULL;
+	func = AmiGetGLProc(proc);
+	return func;
+}
+
+int CGX_GL_LoadLibrary(_THIS, const char *path) {
+	/* Library is always open */
+	this->gl_config.driver_loaded = 1;
+
+	return 0;
 }
 
 #endif /* HAVE_OPENGL */
 
-void CGX_GL_UnloadLibrary(_THIS)
-{
-#ifdef HAVE_OPENGL
-	if ( this->gl_config.driver_loaded ) {
-		dlclose(this->gl_config.dll_handle);
-
-		this->gl_data->glXChooseVisual = NULL;
-		this->gl_data->glXCreateContext = NULL;
-		this->gl_data->glXDestroyContext = NULL;
-		this->gl_data->glXMakeCurrent = NULL;
-		this->gl_data->glXSwapBuffers = NULL;
-
-		this->gl_config.dll_handle = NULL;
-		this->gl_config.driver_loaded = 0;
-	}
-#endif
-}
-
-#ifdef HAVE_OPENGL
-
-/* Passing a NULL path means load pointers from the application */
-int CGX_GL_LoadLibrary(_THIS, const char* path) 
-{
-	void* handle;
-	int dlopen_flags;
-
- 	if ( gl_active ) {
- 		SDL_SetError("OpenGL context already created");
- 		return -1;
- 	}
-
-#ifdef RTLD_GLOBAL
-	dlopen_flags = RTLD_LAZY | RTLD_GLOBAL;
-#else
-	dlopen_flags = RTLD_LAZY;
-#endif
-	handle = dlopen(path, dlopen_flags);
-	/* Catch the case where the application isn't linked with GL */
-	if ( (dlsym(handle, "glXChooseVisual") == NULL) && (path == NULL) ) {
-		dlclose(handle);
-		path = getenv("SDL_VIDEO_GL_DRIVER");
-		if ( path == NULL ) {
-			path = DEFAULT_OPENGL;
-		}
-		handle = dlopen(path, dlopen_flags);
-	}
-	if ( handle == NULL ) {
-		SDL_SetError("Could not load OpenGL library");
-		return -1;
-	}
-
-	/* Unload the old driver and reset the pointers */
-	X11_GL_UnloadLibrary(this);
-
-	/* Load new function pointers */
-	this->gl_data->glXChooseVisual = dlsym(handle, "glXChooseVisual");
-	this->gl_data->glXCreateContext = dlsym(handle, "glXCreateContext");
-	this->gl_data->glXDestroyContext = dlsym(handle, "glXDestroyContext");
-	this->gl_data->glXMakeCurrent = dlsym(handle, "glXMakeCurrent");
-	this->gl_data->glXSwapBuffers = dlsym(handle, "glXSwapBuffers");
-	this->gl_data->glXGetConfig = dlsym(handle, "glXGetConfig");
-	/* We don't compare below for this in case we're not using Mesa. */
-	this->gl_data->glXReleaseBuffersMESA = dlsym( handle, "glXReleaseBuffersMESA" );
-
-	if ( (this->gl_data->glXChooseVisual == NULL) || 
-	     (this->gl_data->glXCreateContext == NULL) ||
-	     (this->gl_data->glXDestroyContext == NULL) ||
-	     (this->gl_data->glXMakeCurrent == NULL) ||
-	     (this->gl_data->glXSwapBuffers == NULL) ||
-	     (this->gl_data->glXGetConfig == NULL) ) {
-		SDL_SetError("Could not retrieve OpenGL functions");
-		return -1;
-	}
-
-	this->gl_config.dll_handle = handle;
-	this->gl_config.driver_loaded = 1;
-	if ( path ) {
-		strncpy(this->gl_config.driver_path, path,
-			sizeof(this->gl_config.driver_path)-1);
-	} else {
-		strcpy(this->gl_config.driver_path, "");
-	}
-	return 0;
-}
-
-void *CGX_GL_GetProcAddress(_THIS, const char* proc)
-{
-	void* handle;
-	
-	handle = this->gl_config.dll_handle;
-
-	return dlsym(handle, proc);
-}
-
-#endif /* HAVE_OPENGL */
--- a/src/video/cybergfx/SDL_cgxgl_c.h	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/video/cybergfx/SDL_cgxgl_c.h	Sun Dec 16 20:00:27 2001 +0000
@@ -25,74 +25,30 @@
  "@(#) $Id$";
 #endif
 
-#include <stdio.h>
+/* StormMesa implementation of SDL OpenGL support */
 
-#ifdef HAVE_OPENGL
-#include <GL/glx.h>
-#include <dlfcn.h>
-#endif
 #include "SDL_sysvideo.h"
-
-struct SDL_PrivateGLData {
-    int gl_active; /* to stop switching drivers while we have a valid context */
+#define _THIS   SDL_VideoDevice *_this
 
 #ifdef HAVE_OPENGL
-    GLXContext glx_context;	/* Current GL context */
-    XVisualInfo* glx_visualinfo; /* XVisualInfo* returned by glXChooseVisual */
-
-    XVisualInfo* (*glXChooseVisual)
-		( Display*		dpy,
-		  int			screen,
-		  int*		attribList );
-
-    GLXContext (*glXCreateContext)
-		( Display*		dpy,
-		  XVisualInfo*	vis,
-		  GLXContext		shareList,
-		  Bool		direct );
-
-    void (*glXDestroyContext)
-		( Display* 		dpy,
-		  GLXContext		ctx );
+#include <GL/Amigamesa.h>
+extern void *AmiGetGLProc(const char *proc);
+#endif /* HAVE_OPENGL */
 
-    Bool (*glXMakeCurrent)
-		( Display*		dpy,
-		  GLXDrawable		drawable,
-		  GLXContext		ctx );
-
-    void (*glXSwapBuffers)
-		( Display*		dpy,
-		  GLXDrawable		drawable );
-
-    int (*glXGetConfig)
-	 ( Display* dpy,
-	   XVisualInfo* visual_info,
-	   int attrib,
-	   int* value );
-
-    void (*glXReleaseBuffersMESA)
-	 ( Display* dpy,
-	   GLXDrawable drawable );
-
-#endif /* HAVE_OPENGL */
+struct SDL_PrivateGLData {
+	int gl_active;
 };
 
-/* Old variable names */
-#define gl_active		(this->gl_data->gl_active)
-#define glx_context		(this->gl_data->glx_context)
-#define glx_visualinfo		(this->gl_data->glx_visualinfo)
-
 /* OpenGL functions */
-extern void *CGX_GL_GetVisual(_THIS);
-extern int CGX_GL_CreateWindow(_THIS, int w, int h);
-extern int CGX_GL_CreateContext(_THIS);
-extern void CGX_GL_Shutdown(_THIS);
+extern int CGX_GL_Init(_THIS);
+extern void CGX_GL_Quit(_THIS);
+extern int CGX_GL_Update(_THIS);
 #ifdef HAVE_OPENGL
 extern int CGX_GL_MakeCurrent(_THIS);
 extern int CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value);
 extern void CGX_GL_SwapBuffers(_THIS);
-extern int CGX_GL_LoadLibrary(_THIS, const char* path);
-extern void *CGX_GL_GetProcAddress(_THIS, const char* proc);
+extern void *CGX_GL_GetProcAddress(_THIS, const char *proc);
+extern int CGX_GL_LoadLibrary(_THIS, const char *path);
 #endif
-extern void CGX_GL_UnloadLibrary(_THIS);
 
+#undef _THIS
--- a/src/video/cybergfx/SDL_cgximage.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/video/cybergfx/SDL_cgximage.c	Sun Dec 16 20:00:27 2001 +0000
@@ -52,36 +52,35 @@
 BOOL SafeDisp=TRUE,SafeChange=TRUE;
 struct MsgPort *safeport=NULL,*dispport=NULL;
 ULONG safe_sigbit,disp_sigbit;
+int use_picasso96=1;
 
 int CGX_SetupImage(_THIS, SDL_Surface *screen)
 {
-	if(screen->flags&SDL_HWSURFACE)
-	{
-		Uint32 pitch;
-		SDL_Ximage=NULL;
+	SDL_Ximage=NULL;
+
+	if(screen->flags&SDL_HWSURFACE) {
+		ULONG pitch;
 
-		if(!screen->hwdata)
-		{
+		if(!screen->hwdata) {
 			if(!(screen->hwdata=malloc(sizeof(struct private_hwdata))))
-			{
 				return -1;
-			}
+
 			D(bug("Creating system accel struct\n"));
 		}
-		screen->hwdata->lock=0;
+		screen->hwdata->lock=NULL;
+		screen->hwdata->allocated=0;
+		screen->hwdata->mask=NULL;
 		screen->hwdata->bmap=SDL_RastPort->BitMap;
 		screen->hwdata->videodata=this;
 
 		if(!(screen->hwdata->lock=LockBitMapTags(screen->hwdata->bmap,
 				LBMI_BASEADDRESS,(ULONG)&screen->pixels,
-				LBMI_BYTESPERROW,(ULONG)&pitch,TAG_DONE)))
-		{
+				LBMI_BYTESPERROW,(ULONG)&pitch,TAG_DONE))) {
 			free(screen->hwdata);
 			screen->hwdata=NULL;
 			return -1;
 		}
-		else
-		{
+		else {
 			UnLockBitMap(screen->hwdata->lock);
 			screen->hwdata->lock=NULL;
 		}
@@ -101,17 +100,6 @@
 		return(-1);
 	}
 
-/*
-	{
- 	        int bpp = screen->format->BytesPerPixel;
-			SDL_Ximage = XCreateImage(SDL_Display, SDL_Visual,
-					  this->hidden->depth, ZPixmap, 0,
-					  (char *)screen->pixels, 
-					  screen->w, screen->h,
-					  (bpp == 3) ? 32 : bpp * 8,
-					  0);
-	}
-*/
 	SDL_Ximage=screen->pixels;
 
 	if ( SDL_Ximage == NULL ) {
@@ -132,6 +120,11 @@
 	}
 	if ( screen ) {
 		screen->pixels = NULL;
+
+		if(screen->hwdata) {
+			free(screen->hwdata);
+			screen->hwdata=NULL;
+		}
 	}
 }
 
@@ -145,21 +138,16 @@
 {
 	int retval;
 
-	D(bug("Chiamata ResizeImage!\n"));
+	D(bug("Calling ResizeImage()\n"));
 
 	CGX_DestroyImage(this, screen);
 
-    if ( flags & SDL_OPENGL ) {  /* No image when using GL */
+	if ( flags & SDL_OPENGL ) {  /* No image when using GL */
         	retval = 0;
-    } else {
+	} else {
 		retval = CGX_SetupImage(this, screen);
 		/* We support asynchronous blitting on the display */
 		if ( flags & SDL_ASYNCBLIT ) {
-			/* This is actually slower on single-CPU systems,
-			   probably because of CPU contention between the
-			   X server and the application.
-			   Note: Is this still true with XFree86 4.0?
-			*/
 			if ( num_CPU() > 1 ) {
 				screen->flags |= SDL_ASYNCBLIT;
 			}
@@ -168,7 +156,6 @@
 	return(retval);
 }
 
-/* We don't actually allow hardware surfaces other than the main one */
 int CGX_AllocHWSurface(_THIS, SDL_Surface *surface)
 {
 	D(bug("Alloc HW surface...%ld x %ld x %ld!\n",surface->w,surface->h,this->hidden->depth));
@@ -185,11 +172,14 @@
 			return -1;
 	}
 
+	surface->hwdata->mask=NULL;
 	surface->hwdata->lock=NULL;
 	surface->hwdata->videodata=this;
+	surface->hwdata->allocated=0;
 
 	if(surface->hwdata->bmap=AllocBitMap(surface->w,surface->h,this->hidden->depth,BMF_MINPLANES,SDL_Display->RastPort.BitMap))
 	{
+		surface->hwdata->allocated=1;
 		surface->flags|=SDL_HWSURFACE;
 		D(bug("...OK\n"));
 		return 0;
@@ -211,11 +201,13 @@
 		if(surface->hwdata->mask)
 			free(surface->hwdata->mask);
 
-		if(surface->hwdata->bmap)
+		if(surface->hwdata->bmap&&surface->hwdata->allocated)
 			FreeBitMap(surface->hwdata->bmap);
 
 		free(surface->hwdata);
 		surface->hwdata=NULL;
+		surface->pixels=NULL;
+		D(bug("end of free hw surface\n"));
 	}
 	return;
 }
@@ -242,11 +234,11 @@
 				surface->pixels=((char *)surface->pixels)+(surface->pitch*(SDL_Window->BorderTop+SDL_Window->TopEdge)+
 					surface->format->BytesPerPixel*(SDL_Window->BorderLeft+SDL_Window->LeftEdge));
 		}
-		else
-			D(bug("Already locked!!!\n"));
+		D(else bug("Already locked!!!\n"));
 	}
 	return(0);
 }
+
 void CGX_UnlockHWSurface(_THIS, SDL_Surface *surface)
 {
 	if(surface->hwdata && surface->hwdata->lock)
@@ -398,7 +390,7 @@
 #ifndef USE_CGX_WRITELUTPIXEL
 	int bpp;
 #endif
-	if(this->hidden->same_format)
+	if(this->hidden->same_format && !use_picasso96)
 	{
 		format=RECTFMT_RAW;
 	}
@@ -445,7 +437,7 @@
 	/* Check for endian-swapped X server, swap if necessary (VERY slow!) */
 	if ( swap_pixels &&
 	     ((this->screen->format->BytesPerPixel%2) == 0) ) {
-		D(bug("Swappo! Lento!\n"));
+		D(bug("Software Swapping! SLOOOW!\n"));
 		CGX_SwapPixels(this->screen, numrects, rects);
 		for ( i=0; i<numrects; ++i ) {
 			if ( ! rects[i].w ) { /* Clipped? */
@@ -633,7 +625,7 @@
 		Uint32	destpitch;
 		APTR handle;
 
-//		D(bug("Uso customroutine!\n"));
+//		D(bug("Using customroutine!\n"));
 
 		if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,(ULONG)&bm_address,
 								LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
@@ -685,20 +677,8 @@
 			USE_WPA(this->screen->pixels,rects[i].x, rects[i].y,this->screen->pitch,
 					SDL_RastPort,SDL_Window->BorderLeft+rects[i].x,SDL_Window->BorderTop+rects[i].y,
 					rects[i].w,rects[i].h,format);
-
-/*
-			XPutImage(GFX_Display, SDL_Window, SDL_GC, SDL_Ximage,
-				rects[i].x, rects[i].y,
-				rects[i].x, rects[i].y, rects[i].w, rects[i].h);
-*/
 		}
 	}
-/*
-	if ( SDL_VideoSurface->flags & SDL_ASYNCBLIT ) {
-		++blit_queued;
-	} else {
-	}
-*/
 }
 
 void CGX_RefreshDisplay(_THIS)
@@ -712,7 +692,7 @@
 		return;
 	}
 
-	if(this->hidden->same_format)
+	if(this->hidden->same_format && !use_picasso96)
 	{
 		format=RECTFMT_RAW;
 	}
--- a/src/video/cybergfx/SDL_cgxmodes.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/video/cybergfx/SDL_cgxmodes.c	Sun Dec 16 20:00:27 2001 +0000
@@ -1,6 +1,6 @@
 /*
     SDL - Simple DirectMedia Layer
-    Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
+    Copyright (C) 1997, 1998, 1999, 2000  Sam Lantinga
 
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
@@ -66,14 +66,15 @@
 		}
 		SDL_Display=GFX_Display=OpenScreenTags(NULL,SA_Width,width,SA_Height,height,
 											SA_Depth,depth,SA_DisplayID,idok,
+											SA_ShowTitle,FALSE,
 											TAG_DONE);
 	}
 }
 
 static void get_real_resolution(_THIS, int* w, int* h)
 {
-    *w = SDL_Display->Width;
-    *h = SDL_Display->Height;
+    *w = /*SDL_Display->Width*/ SDL_Window->Width-SDL_Window->BorderLeft-SDL_Window->BorderRight;
+    *h = /*SDL_Display->Height*/ SDL_Window->Height-SDL_Window->BorderBottom-SDL_Window->BorderTop;
 }
 
 static void move_cursor_to(_THIS, int x, int y)
@@ -144,11 +145,11 @@
 						SDL_modelist = (SDL_Rect **)realloc(SDL_modelist,(nmodes+1)*sizeof(SDL_Rect *));
 						SDL_modelist[nmodes]=NULL;
 
-						if ( SDL_modelist ) 
+						if ( SDL_modelist )
 						{
 							SDL_modelist[nmodes-1] = (SDL_Rect *)malloc(sizeof(SDL_Rect));
 
-							if ( SDL_modelist[nmodes-1] == NULL ) 
+							if ( SDL_modelist[nmodes-1] == NULL )
 								break;
 
 							SDL_modelist[nmodes-1]->x = 0;
@@ -156,7 +157,7 @@
 							SDL_modelist[nmodes-1]->w = info.Nominal.MaxX+1;
 							SDL_modelist[nmodes-1]->h = info.Nominal.MaxY+1;
 						}
-					}																	
+					}
 				}
 			}
 		}
@@ -267,15 +268,18 @@
 int CGX_EnterFullScreen(_THIS)
 {
     int okay;
+	 Uint32 saved_flags;
 
     okay = 1;
-    if ( ! currently_fullscreen ) 
+    saved_flags = this->screen->flags;
+
+    if ( ! currently_fullscreen )
 	{
         int real_w, real_h;
 
         /* Map the fullscreen window to blank the screen */
         get_real_resolution(this, &real_w, &real_h);
-		
+
 		CGX_DestroyWindow(this,this->screen);
 		set_best_resolution(this, real_w,real_h);
 
@@ -297,8 +301,9 @@
 #endif
 
         currently_fullscreen = 1;
+		  this->screen->flags = saved_flags;
 
-		CGX_CreateWindow(this,this->screen,real_w,real_h,GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH),this->screen->flags);
+		  CGX_CreateWindow(this,this->screen,real_w,real_h,GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH),this->screen->flags);
 
         /* Set the new resolution */
         okay = CGX_ResizeFullScreen(this);
@@ -311,7 +316,7 @@
 			XInstallColormap(SDL_Display, SDL_XColorMap);
 		}
 */
-    }    
+    }
 //    CGX_GrabInputNoLock(this, this->input_grab | SDL_GRAB_FULLSCREEN);
     return(okay);
 }
--- a/src/video/cybergfx/SDL_cgxvideo.c	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/video/cybergfx/SDL_cgxvideo.c	Sun Dec 16 20:00:27 2001 +0000
@@ -1,6 +1,6 @@
 /*
     SDL - Simple DirectMedia Layer
-    Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
+    Copyright (C) 1997, 1998, 1999, 2000  Sam Lantinga
 
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
@@ -25,8 +25,10 @@
  "@(#) $Id$";
 #endif
 
-/* CGX based SDL video driver implementation.
-*/
+/*
+ * CGX based SDL video driver implementation by Gabriele Greco
+ * gabriele.greco@aruba.it
+ */
 
 /*
 #include <stdlib.h>
@@ -50,6 +52,7 @@
 #include "SDL_sysvideo.h"
 #include "SDL_pixels_c.h"
 #include "SDL_events_c.h"
+#include "SDL_cgxgl_c.h"
 #include "SDL_cgxvideo.h"
 #include "SDL_cgxwm_c.h"
 #include "SDL_amigamouse_c.h"
@@ -57,7 +60,6 @@
 #include "SDL_cgxmodes_c.h"
 #include "SDL_cgximage_c.h"
 #include "SDL_cgxyuv_c.h"
-#include "SDL_cgxgl_c.h"
 
 /* Initialization/Query functions */
 static int CGX_VideoInit(_THIS, SDL_PixelFormat *vformat);
@@ -73,6 +75,52 @@
 struct IntuitionBase *IntuitionBase=NULL;
 struct GfxBase *GfxBase=NULL;
 
+int CGX_SetGamma(_THIS, float red, float green, float blue)
+{
+    SDL_SetError("Gamma correction not supported");
+    return -1;
+}
+
+int CGX_GetGamma(_THIS, float red, float green, float blue)
+{
+    SDL_SetError("Gamma correction not supported");
+    return -1;
+}
+
+int CGX_SetGammaRamp(_THIS, Uint16 *ramp)
+{
+#if 0
+	Int i, ncolors;
+	XColor xcmap[256];
+
+	/* See if actually setting the gamma is supported */
+	if ( SDL_Visual->class != DirectColor ) {
+	    SDL_SetError("Gamma correction not supported on this visual");
+	    return(-1);
+	}
+
+	/* Calculate the appropriate palette for the given gamma ramp */
+	ncolors = SDL_Visual->map_entries;
+	for ( i=0; i<ncolors; ++i ) {
+		Uint8 c = (256 * i / ncolors);
+		xcmap[i].pixel = SDL_MapRGB(this->screen->format, c, c, c);
+		xcmap[i].red   = ramp[0*256+c];
+		xcmap[i].green = ramp[1*256+c];
+		xcmap[i].blue  = ramp[2*256+c];
+		xcmap[i].flags = (DoRed|DoGreen|DoBlue);
+	}
+	XStoreColors(GFX_Display, SDL_XColorMap, xcmap, ncolors);
+	XSync(GFX_Display, False);
+
+	return(0);
+
+#else
+    SDL_SetError("Gamma correction not supported on this visual");
+    return(-1);
+
+#endif
+}
+
 static void DestroyScreen(_THIS)
 {
   	if(currently_fullscreen)
@@ -98,20 +146,22 @@
 			this->hidden->SB[1]->sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort=this->hidden->SB[1]->sb_DBufInfo->dbi_DispMessage.mn_ReplyPort=NULL;
 
 			if(this->hidden->SB[1])
-				FreeScreenBuffer(SDL_Display,this->hidden->SB[0]);
+				FreeScreenBuffer(SDL_Display,this->hidden->SB[1]);
 			if(this->hidden->SB[0])
-				FreeScreenBuffer(SDL_Display,this->hidden->SB[1]);
+				FreeScreenBuffer(SDL_Display,this->hidden->SB[0]);
 
 
 			this->hidden->SB[0]=this->hidden->SB[1]=NULL;
-			free(SDL_RastPort);
+
+			if(SDL_RastPort && SDL_RastPort != &SDL_Display->RastPort)
+				free(SDL_RastPort);
+
 			SDL_RastPort=NULL;
-			this->hidden->dbuffer=0;
 		}
 		CloseScreen(GFX_Display);
 		currently_fullscreen=0;
 	}
-	else
+	else if(GFX_Display)
 		UnlockPubScreen(NULL,GFX_Display);
 
 	GFX_Display = NULL;
@@ -121,11 +171,14 @@
 {
 	struct Library *l;
 
-	l = OpenLibrary("cybergraphics.library",NULL);
+	l = OpenLibrary("cybergraphics.library",0L);
 
 	if ( l != NULL ) {
+		D(bug("CGX video device AVAILABLE\n"));
 		CloseLibrary(l);
 	}
+	D(else bug("**CGX video device UNAVAILABLE\n"));
+
 	return(l != NULL);
 }
 
@@ -157,12 +210,13 @@
 	}
 	if ( (device == NULL) || (device->hidden == NULL) ||
 	                         (device->gl_data == NULL) ) {
+		D(bug("Unable to create video device!\n"));
 		SDL_OutOfMemory();
 		CGX_DeleteDevice(device);
 		return(0);
 	}
-	memset(device->hidden, 0, (sizeof *device->hidden));
-	memset(device->gl_data, 0, (sizeof *device->gl_data));
+	memset(device->hidden, 0, sizeof(*device->hidden));
+	memset(device->gl_data, 0, sizeof(*device->gl_data));
 
 	/* Set the driver flags */
 	device->handles_any_size = 1;
@@ -188,17 +242,21 @@
 	device->UnlockHWSurface = CGX_UnlockHWSurface;
 	device->FlipHWSurface = CGX_FlipHWSurface;
 	device->FreeHWSurface = CGX_FreeHWSurface;
+	device->SetGamma = CGX_SetGamma;
+	device->GetGamma = CGX_GetGamma;
+	device->SetGammaRamp = CGX_SetGammaRamp;
+	device->GetGammaRamp = NULL;
 #ifdef HAVE_OPENGL
-	device->GL_LoadLibrary = X11_GL_LoadLibrary;
-	device->GL_GetProcAddress = X11_GL_GetProcAddress;
-	device->GL_GetAttribute = X11_GL_GetAttribute;
-	device->GL_MakeCurrent = X11_GL_MakeCurrent;
-	device->GL_SwapBuffers = X11_GL_SwapBuffers;
+	device->GL_LoadLibrary = CGX_GL_LoadLibrary;
+	device->GL_GetProcAddress = CGX_GL_GetProcAddress;
+	device->GL_GetAttribute = CGX_GL_GetAttribute;
+	device->GL_MakeCurrent = CGX_GL_MakeCurrent;
+	device->GL_SwapBuffers = CGX_GL_SwapBuffers;
 #endif
 	device->SetIcon = CGX_SetIcon;
 	device->SetCaption = CGX_SetCaption;
 	device->IconifyWindow = NULL; /* CGX_IconifyWindow; */
-	device->GrabInput = NULL /* CGX_GrabInput*/; 
+	device->GrabInput = NULL /* CGX_GrabInput*/;
 	device->GetWMInfo = CGX_GetWMInfo;
 	device->FreeWMCursor = amiga_FreeWMCursor;
 	device->CreateWMCursor = amiga_CreateWMCursor;
@@ -217,119 +275,13 @@
 	"CGX", "AmigaOS CyberGraphics", CGX_Available, CGX_CreateDevice
 };
 
-#if 0
-
-/* Create auxiliary (toplevel) windows with the current visual */
-static void create_aux_windows(_THIS)
-{
-    XSetWindowAttributes xattr;
-    XWMHints *hints;
-    XTextProperty titleprop, iconprop;
-    int def_vis = (SDL_Visual == DefaultVisual(SDL_Display, SDL_Screen));
-
-    /* Don't create any extra windows if we are being managed */
-    if ( SDL_windowid ) {
-	FSwindow = 0;
-	WMwindow = strtol(SDL_windowid, NULL, 0);
-        return;
-    }
-
-    if(FSwindow)
-	XDestroyWindow(SDL_Display, FSwindow);
-
-    xattr.override_redirect = True;
-    xattr.background_pixel = def_vis ? BlackPixel(SDL_Display, SDL_Screen) : 0;
-    xattr.border_pixel = 0;
-    xattr.colormap = SDL_XColorMap;
-
-    FSwindow = XCreateWindow(SDL_Display, SDL_Root, 0, 0, 32, 32, 0,
-			     this->hidden->depth, InputOutput, SDL_Visual,
-			     CWOverrideRedirect | CWBackPixel | CWBorderPixel
-			     | CWColormap,
-			     &xattr);
-
-    XSelectInput(SDL_Display, FSwindow, StructureNotifyMask);
-
-    /* Tell KDE to keep the fullscreen window on top */
-    {
-	XEvent ev;
-	long mask;
-
-	memset(&ev, 0, sizeof(ev));
-	ev.xclient.type = ClientMessage;
-	ev.xclient.window = SDL_Root;
-	ev.xclient.message_type = XInternAtom(SDL_Display,
-					      "KWM_KEEP_ON_TOP", False);
-	ev.xclient.format = 32;
-	ev.xclient.data.l[0] = FSwindow;
-	ev.xclient.data.l[1] = CurrentTime;
-	mask = SubstructureRedirectMask;
-	XSendEvent(SDL_Display, SDL_Root, False, mask, &ev);
-    }
-
-    hints = NULL;
-    titleprop.value = iconprop.value = NULL;
-    if(WMwindow) {
-	/* All window attributes must survive the recreation */
-	hints = XGetWMHints(SDL_Display, WMwindow);
-	XGetWMName(SDL_Display, WMwindow, &titleprop);
-	XGetWMIconName(SDL_Display, WMwindow, &iconprop);
-	XDestroyWindow(SDL_Display, WMwindow);
-    }
-
-    /* Create the window for windowed management */
-    /* (reusing the xattr structure above) */
-    WMwindow = XCreateWindow(SDL_Display, SDL_Root, 0, 0, 32, 32, 0,
-			     this->hidden->depth, InputOutput, SDL_Visual,
-			     CWBackPixel | CWBorderPixel | CWColormap,
-			     &xattr);
-
-    /* Set the input hints so we get keyboard input */
-    if(!hints) {
-	hints = XAllocWMHints();
-	hints->input = True;
-	hints->flags = InputHint;
-    }
-    XSetWMHints(SDL_Display, WMwindow, hints);
-    XFree(hints);
-    if(titleprop.value) {
-	XSetWMName(SDL_Display, WMwindow, &titleprop);
-	XFree(titleprop.value);
-    }
-    if(iconprop.value) {
-	XSetWMIconName(SDL_Display, WMwindow, &iconprop);
-	XFree(iconprop.value);
-    }
-
-    XSelectInput(SDL_Display, WMwindow,
-		 FocusChangeMask | KeyPressMask | KeyReleaseMask
-		 | PropertyChangeMask | StructureNotifyMask);
-
-    /* Set the class hints so we can get an icon (AfterStep) */
-    {
-	XClassHint *classhints;
-	classhints = XAllocClassHint();
-	if(classhints != NULL) {
-	    classhints->res_name = "SDL_App";
-	    classhints->res_class = "SDL_App";
-	    XSetClassHint(SDL_Display, WMwindow, classhints);
-	    XFree(classhints);
-	}
-    }
-
-    /* Allow the window to be deleted by the window manager */
-    WM_DELETE_WINDOW = XInternAtom(SDL_Display, "WM_DELETE_WINDOW", False);
-    XSetWMProtocols(SDL_Display, WMwindow, &WM_DELETE_WINDOW, 1);
-}
-#endif
-
 Uint32 MakeBitMask(_THIS,int type,int format,int *bpp)
 {
 	D(if(type==0)bug("REAL pixel format: "));
 
 	if(this->hidden->depth==*bpp)
 	{
-		
+
 	switch(format)
     	{
 		case PIXFMT_LUT8:
@@ -447,7 +399,7 @@
 	else
 	{
 		D(if(type==0)bug("DIFFERENT from screen.\nAllocated screen format: "));
-	
+
 		switch(*bpp)
 		{
 			case 32:
@@ -479,43 +431,63 @@
 				D(if(type==0) bug("Not supported, switching to 24bit!\n"));
 				*bpp=24;
 				goto use_truecolor;
-				break;				
+				break;
 			default:
 				D(if(type==0)bug("This is a chunky display\n"));
 // For chunky display mask is always 0;
 				return 0;
 		}
-	} 
+	}
 	return 0;
 }
 
 static int CGX_VideoInit(_THIS, SDL_PixelFormat *vformat)
 {
 	int i;
+	struct Library *RTGBase;
 
-	if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",39L)))
-	{
-		SDL_SetError("Couldn't open intuition V39+");
-		return -1;
+	D(bug("VideoInit... Opening libraries\n"));
+
+	if(!IntuitionBase) {
+		if( !(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",39L))) {
+			SDL_SetError("Couldn't open intuition V39+");
+			return -1;
+		}
+	}
+
+	if(!GfxBase) {
+		if( !(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",39L))) {
+			SDL_SetError("Couldn't open graphics V39+");
+			return -1;
+		}
 	}
-	if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",39L)))
-	{
-		SDL_SetError("Couldn't open graphics V39+");
-		return -1;
+
+	if(!CyberGfxBase) {
+		if( !(CyberGfxBase=OpenLibrary("cybergraphics.library",40L))) {
+			SDL_SetError("Couldn't open cybergraphics.");
+			return(-1);
+		}
 	}
-	if(!(CyberGfxBase=OpenLibrary("cybergraphics.library",40L)))
-	{
-		SDL_SetError("Couldn't open cybergraphics.");
-		return(-1);
+
+	if(RTGBase=OpenLibrary("libs:picasso96/rtg.library",0L)) {
+		extern int use_picasso96;
+
+		CloseLibrary(RTGBase);
+		use_picasso96=1;
 	}
 
+	D(bug("Library intialized, locking screen...\n"));
+
 	SDL_Display = LockPubScreen(NULL);
 
 	if ( SDL_Display == NULL ) {
+		D(bug("Cannot lock display...\n"));
 		SDL_SetError("Couldn't lock the display");
 		return(-1);
 	}
 
+	D(bug("Checking if we are using a CGX native display...\n"));
+
 	if(!IsCyberModeID(GetVPModeID(&SDL_Display->ViewPort)))
 	{
 		Uint32 okid=BestCModeIDTags(CYBRBIDTG_NominalWidth,SDL_Display->Width,
@@ -523,6 +495,8 @@
 				CYBRBIDTG_Depth,8,
 				TAG_DONE);
 
+		D(bug("Default visual is not CGX native!\n"));
+
 		UnlockPubScreen(NULL,SDL_Display);
 
 		GFX_Display=NULL;
@@ -556,9 +530,11 @@
 // Non e' detto che sia cosi' pero', alcune schede potrebbero gestire i modi in modo differente
 
 	if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) {
-			swap_pixels = 1;
+		swap_pixels = 1;
 	}
 
+	D(bug("Before GetVideoModes....\n"));
+
 	/* Get the available video modes */
 	if(CGX_GetVideoModes(this) < 0)
 	    return -1;
@@ -578,7 +554,7 @@
 //	SDL_XColorMap = SDL_DisplayColormap;
 
 	this->hidden->depth = this->hidden->visuals[i].depth;
-	D(bug("Setto la profiondita' dello schermo a: %ld\n",this->hidden->depth));
+	D(bug("Init: Setting screen depth to: %ld\n",this->hidden->depth));
 	vformat->BitsPerPixel = this->hidden->visuals[i].depth; /* this->hidden->visuals[i].bpp; */
 
 	{
@@ -587,16 +563,21 @@
 		struct DisplayInfo info;
 
 		if(!(handle=FindDisplayInfo(this->hidden->visuals[i].visual)))
+		{
+			D(bug("Unable to get visual info...\n"));
 			return -1;
+		}
 
-		if(!GetDisplayInfoData(handle,(char *)&info,sizeof(struct DisplayInfo),DTAG_DISP,NULL))
+		if(!GetDisplayInfoData(handle,(char *)&info,sizeof(struct DisplayInfo),DTAG_DISP,NULL)) {
+			D(bug("Unable to get visual info data...\n"));
 			return -1;
+		}
 
 		form=GetCyberIDAttr(CYBRIDATTR_PIXFMT,SDL_Visual);
 
 // In this case I use makebitmask in a way that I'm sure I'll get PIXFMT pixel mask
 
-		if ( vformat->BitsPerPixel > 8 ) 
+		if ( vformat->BitsPerPixel > 8 )
 		{
 			vformat->Rmask = MakeBitMask(this,0,form,&this->hidden->depth);
 	  		vformat->Gmask = MakeBitMask(this,1,form,&this->hidden->depth);
@@ -608,9 +589,6 @@
 /*	SDL_windowid = getenv("SDL_WINDOWID"); */
 	SDL_windowid=NULL;
 
-	/* Create the fullscreen and managed windows */
-//	create_aux_windows(this);
-
 	/* Create the blank cursor */
 	SDL_BlankCursor = AllocMem(16,MEMF_CHIP|MEMF_CLEAR);
 
@@ -625,16 +603,25 @@
 	this->hidden->same_format=0;
 	SDL_RastPort=&SDL_Display->RastPort;
 	/* We're done! */
+	D(bug("End of CGX_VideoInit\n"));
+
 	return(0);
 }
 
 void CGX_DestroyWindow(_THIS, SDL_Surface *screen)
 {
+	D(bug("Destroy Window...\n"));
+
 	if ( ! SDL_windowid ) {
 		/* Hide the managed window */
 		int was_fullscreen=0;
 
-		if ( screen && (screen->flags & SDL_FULLSCREEN) ) {	
+		/* Clean up OpenGL */
+		if ( screen ) {
+		screen->flags &= ~(SDL_OPENGL|SDL_OPENGLBLIT);
+		}
+
+		if ( screen && (screen->flags & SDL_FULLSCREEN) ) {
 			was_fullscreen=1;
 			screen->flags &= ~SDL_FULLSCREEN;
 //			CGX_LeaveFullScreen(this); tolto x crash
@@ -660,7 +647,7 @@
 
 				if(!was_fullscreen&&this->hidden->depth==8)
 				{
-					for ( pixel=0; pixel<numcolors; pixel++ ) 
+					for ( pixel=0; pixel<numcolors; pixel++ )
 					{
 						if(SDL_XPixels[pixel]>=0)
 							ReleasePen(GFX_Display->ViewPort.ColorMap,SDL_XPixels[pixel]);
@@ -669,7 +656,7 @@
 			}
 			free(SDL_XPixels);
 			SDL_XPixels = NULL;
-		} 
+		}
 	}
 }
 
@@ -701,6 +688,8 @@
 	int i, depth;
 	Uint32 vis;
 #endif
+	D(bug("CGX_CreateWindow\n"));
+
 	/* If a window is already present, destroy it and start fresh */
 	if ( SDL_Window ) {
 		CGX_DestroyWindow(this, screen);
@@ -718,11 +707,11 @@
 /* questo l'ho spostato nell'apertura dello schermo, in quanto su Amiga le finestre
    hanno il pixel mode degli schermi.
  */
-	if ( flags & SDL_OPENGL ) {
+	/*if ( flags & SDL_OPENGL ) {
 		SDL_SetError("OpenGL not supported by the Amiga SDL!");
 		return -1;
-	} 
-	else {
+	}
+	else {*/
 		for ( i = 0; i < this->hidden->nvisuals; i++ ) {
 			if ( this->hidden->visuals[i].depth == bpp ) /* era .depth */
 				break;
@@ -733,10 +722,10 @@
 		}
 		vis = this->hidden->visuals[i].visual;
 		depth = this->hidden->visuals[i].depth;
-	}
+//	}
 	SDL_Visual = vis;
 	this->hidden->depth = depth;
-	D(bug("Setto la profiondita' dello schermo a: %ld\n",this->hidden->depth));
+	D(bug("Setting screen depth to: %ld\n",this->hidden->depth));
 #endif
 
 	/* Allocate the new pixel format for this video mode */
@@ -766,7 +755,7 @@
 
 /* With this call if needed I'll revert the wanted bpp to a bpp best suited for the display, actually occurs
    only with requested format 15/16bit and display format != 15/16bit
- */	
+ */
 
 		if ( ! SDL_ReallocFormat(screen, bpp,
 				MakeBitMask(this,0,form,&bpp), MakeBitMask(this,1,form,&bpp), MakeBitMask(this,2,form,&bpp), 0) )
@@ -783,8 +772,8 @@
 	}
 */
 	if ( GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_PIXFMT)==PIXFMT_LUT8 || bpp==8 ) {
-	    int ncolors;
-	    D(bug("Alloco XPixels x la palette...\n"));
+	    int ncolors,i;
+	    D(bug("XPixels palette allocation...\n"));
 
 	    /* Allocate the pixel flags */
 
@@ -794,52 +783,30 @@
 		ncolors = 1 << screen->format->BitsPerPixel;
 
 	    SDL_XPixels = (Sint32 *)malloc(ncolors * sizeof(Sint32));
-		
+
 	    if(SDL_XPixels == NULL) {
 		SDL_OutOfMemory();
 		return -1;
 	    }
 
-	    memset(SDL_XPixels, -1, ncolors * sizeof(Sint32));
+
+	    for(i=0;i<ncolors;i++)
+		    SDL_XPixels[i]=-1;
 
 	    /* always allocate a private colormap on non-default visuals */
 	    if(bpp==8)
 		flags |= SDL_HWPALETTE;
 
-	    if ( flags & SDL_HWPALETTE ) {
+	    if ( flags & SDL_HWPALETTE )
 			screen->flags |= SDL_HWPALETTE;
-/*
-			SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root,
-		                                SDL_Visual, AllocAll);
-*/
-	    } else {
-/*
-			SDL_XColorMap = SDL_DisplayColormap;
-*/
-	    }
-	} else {
-/*
-	    SDL_XColorMap = XCreateColormap(SDL_Display, SDL_Root,
-	                                    SDL_Visual, AllocNone);
-*/
-	}
-
-	/* Recreate the auxiliary windows, if needed (required for GL) */
-/*
-	if ( vis_change )
-	    create_aux_windows(this);
-*/
+	} 
 
 	/* resize the (possibly new) window manager window */
 
 	/* Create (or use) the X11 display window */
+
 	if ( !SDL_windowid ) {
-		if ( flags & SDL_OPENGL ) {
-			return(-1);
-		} 
-		else 
-		{
-			if(flags & SDL_FULLSCREEN)
+			if( flags & SDL_FULLSCREEN )
 			{
 				SDL_Window = OpenWindowTags(NULL,WA_Width,w,WA_Height,h,
 											WA_Flags,WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_BORDERLESS|WFLG_BACKDROP|WFLG_REPORTMOUSE,
@@ -847,27 +814,25 @@
 											WA_CustomScreen,(ULONG)SDL_Display,
 											TAG_DONE);
 
-				D(bug("Apro finestra backdrop %ldx%ld su %lx!\n",w,h,SDL_Display));
+				D(bug("Opening backdrop window %ldx%ld on display %lx!\n",w,h,SDL_Display));
 			}
 			else
 			{
+				/* Create GimmeZeroZero window when OpenGL is used */
+				unsigned long gzz = FALSE;
+				if( flags & SDL_OPENGL ) {
+					gzz = TRUE;
+				}
+
 				SDL_Window = OpenWindowTags(NULL,WA_InnerWidth,w,WA_InnerHeight,h,
 											WA_Flags,WFLG_REPORTMOUSE|WFLG_ACTIVATE|WFLG_RMBTRAP | ((flags&SDL_NOFRAME) ? 0 : (WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_DRAGBAR | ((flags&SDL_RESIZABLE) ? WFLG_SIZEGADGET|WFLG_SIZEBBOTTOM : 0))),
 											WA_IDCMP,IDCMP_RAWKEY|IDCMP_CLOSEWINDOW|IDCMP_MOUSEBUTTONS|IDCMP_NEWSIZE|IDCMP_MOUSEMOVE,
 											WA_PubScreen,(ULONG)SDL_Display,
+											WA_GimmeZeroZero, gzz,
 														TAG_DONE);
-				D(bug("Apro finestra %ldx%ld sul wb!\n",w,h));
+				D(bug("Opening WB window of size: %ldx%ld!\n",w,h));
 			}
 
-		}
-		/* Only manage our input if we own the window */
-/*
-		XSelectInput(SDL_Display, SDL_Window,
-					( EnterWindowMask | LeaveWindowMask
-					| ButtonPressMask | ButtonReleaseMask
-					| PointerMotionMask | ExposureMask ));
-*/
-
 		if(!SDL_Window)
 			return -1;
 	}
@@ -885,17 +850,6 @@
 			return -1;
 	}
 	else SDL_RastPort=SDL_Window->RPort;
-#if 0
-
-	if(screen->flags & SDL_HWPALETTE) {
-	    /* Since the full-screen window might have got a nonzero background
-	       colour (0 is white on some displays), we should reset the
-	       background to 0 here since that is what the user expects
-	       with a private colormap */
-		SetAPen(SDL_Window->RPort,0);
-		RectFill(SDL_Window->RPort,SDL_Window->BorderLeft,SDL_Window->BorderTop,w+SDL_Window->BorderLeft,h+SDL_Window->BorderTop);
-	}
-#endif
 
 	if(flags&SDL_HWSURFACE)
 		screen->flags|=SDL_HWSURFACE;
@@ -928,12 +882,28 @@
 	screen->pitch = SDL_CalculatePitch(screen);
 	CGX_ResizeImage(this, screen, flags);
 
-	return(0);
+	/* Make OpenGL Context if needed*/
+	if(flags & SDL_OPENGL) {
+		if(this->gl_data->gl_active == 0) {
+			if(CGX_GL_Init(this) < 0)
+				return -1;
+			else
+				screen->flags |= SDL_OPENGL;
+		}
+		else {
+			if(CGX_GL_Update(this) < 0)
+				return -1;
+			else
+				screen->flags |= SDL_OPENGL;
+		}
+	}
 }
 
 int CGX_ResizeWindow(_THIS,
 			SDL_Surface *screen, int w, int h, Uint32 flags)
 {
+	D(bug("CGX_ResizeWindow\n"));
+
 	if ( ! SDL_windowid ) {
 		/* Resize the window manager window */
 		CGX_SetSizeHints(this, w, h, flags);
@@ -943,22 +913,6 @@
 		ChangeWindowBox(SDL_Window,SDL_Window->LeftEdge,SDL_Window->TopEdge, w+SDL_Window->BorderLeft+SDL_Window->BorderRight,
 					h+SDL_Window->BorderTop+SDL_Window->BorderBottom);
 
-		/* Resize the fullscreen and display windows */
-/*
-		if ( flags & SDL_FULLSCREEN ) {
-			if ( screen->flags & SDL_FULLSCREEN ) {
-				CGX_ResizeFullScreen(this);
-			} else {
-				screen->flags |= SDL_FULLSCREEN;
-				CGX_EnterFullScreen(this);
-			}
-		} else {
-			if ( screen->flags & SDL_FULLSCREEN ) {
-				screen->flags &= ~SDL_FULLSCREEN;
-				CGX_LeaveFullScreen(this);
-			}
-		}
-*/
 		screen->w = w;
 		screen->h = h;
 		screen->pitch = SDL_CalculatePitch(screen);
@@ -973,23 +927,25 @@
 	Uint32 saved_flags;
 	int needcreate=0;
 
+	D(bug("CGX_SetVideoMode current:%lx\n",current));
+
 	/* Lock the event thread, in multi-threading environments */
 	SDL_Lock_EventThread();
 
 // Check if the window needs to be closed or can be resized
 
-	if( (flags&SDL_FULLSCREEN) || (current->flags&SDL_FULLSCREEN && !(flags&SDL_FULLSCREEN)))
+	if( (flags&SDL_FULLSCREEN) || (current && current->flags&SDL_FULLSCREEN && !(flags&SDL_FULLSCREEN)))
 		needcreate=1;
 
-// Check if we need to close an already existing videomode... 
+// Check if we need to close an already existing videomode...
 
-	if(current->flags&SDL_FULLSCREEN && !(flags&SDL_FULLSCREEN))
-	{
+	if(current && current->flags&SDL_FULLSCREEN && !(flags&SDL_FULLSCREEN)) {
 		unsigned long i;
+		D(bug("Destroying image, window & screen!\n"));
+
 		CGX_DestroyImage(this,current);
 		CGX_DestroyWindow(this,current);
 		DestroyScreen(this);
-		D(bug("Distrutte immagine, finestra e schermo!\n"));
 		GFX_Display=SDL_Display=LockPubScreen(NULL);
 
 		bpp=this->hidden->depth=GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH);
@@ -1004,23 +960,23 @@
 		}
 		SDL_Visual = this->hidden->visuals[i].visual;
 
-		D(bug("Setto la profiondita' dello schermo a: %ld\n",this->hidden->depth));
-		
+		D(bug("Setting screen depth to: %ld\n",this->hidden->depth));
+
 	}
 	/* Check the combination of flags we were passed */
 	if ( flags & SDL_FULLSCREEN ) {
 		int i;
-	
+
 		/* Clear fullscreen flag if not supported */
 		if ( SDL_windowid ) {
 			flags &= ~SDL_FULLSCREEN;
 		}
-		else if(current->flags&SDL_FULLSCREEN )
-		{
+		else if(current && current->flags&SDL_FULLSCREEN ) {
 			if(current->w!=width ||
 				current->h!=height ||
-				this->hidden->depth!=bpp)
+				(this->hidden && this->hidden->depth!=bpp))
 			{
+				D(bug("Deleting previous window...\n"));
 				CGX_DestroyImage(this,current);
 				CGX_DestroyWindow(this,current);
 				DestroyScreen(this);
@@ -1037,8 +993,9 @@
 
 			GFX_Display=NULL;
 
+			D(bug("Opening screen...\n"));
+
 			if(okid!=INVALID_ID)
-			{
 				GFX_Display=OpenScreenTags(NULL,
 								SA_Width,width,
 								SA_Height,height,
@@ -1046,58 +1003,50 @@
 								SA_Depth,bpp,
 								SA_DisplayID,okid,
 								TAG_DONE);
-			}
 
-
-			if(!GFX_Display)
-			{
+			if(!GFX_Display) {
 				GFX_Display=SDL_Display;
 				flags &= ~SDL_FULLSCREEN;
 				flags &= ~SDL_DOUBLEBUF;
 			}
-			else
-			{
+			else {
 				UnlockPubScreen(NULL,SDL_Display);
 				SDL_Display=GFX_Display;
-
-				if(flags&SDL_DOUBLEBUF)
-				{
-					int ok=0;
+	
+				D(bug("Screen opened.\n"));
 
-					if(this->hidden->SB[0]=AllocScreenBuffer(SDL_Display,NULL,SB_SCREEN_BITMAP))
-					{
-						if(this->hidden->SB[1]=AllocScreenBuffer(SDL_Display,NULL,0L))
-						{
+				if(flags&SDL_DOUBLEBUF) {
+					int ok=0;
+					D(bug("Start of DBuffering allocations...\n"));
+
+					if(this->hidden->SB[0]=AllocScreenBuffer(SDL_Display,NULL,SB_SCREEN_BITMAP)) {
+
+						if(this->hidden->SB[1]=AllocScreenBuffer(SDL_Display,NULL,0L)) {
 							extern struct MsgPort *safeport,*dispport;
 
 							safeport=CreateMsgPort();
 							dispport=CreateMsgPort();
 
-							if(!safeport || !dispport)
-							{
-								if(safeport)
-								{
+							if(!safeport || !dispport) {
+								if(safeport) {
 									DeleteMsgPort(safeport);
 									safeport=NULL;
 								}
-								if(dispport)
-								{
+								if(dispport) {
 									DeleteMsgPort(dispport);
 									dispport=NULL;
 								}
 								FreeScreenBuffer(SDL_Display,this->hidden->SB[0]);
 								FreeScreenBuffer(SDL_Display,this->hidden->SB[1]);
 							}
-							else
-							{
+							else {
 								extern ULONG safe_sigbit,disp_sigbit;
 								int i;
 
 								safe_sigbit=1L<< safeport->mp_SigBit;
 								disp_sigbit=1L<< dispport->mp_SigBit;
-	
-								for(i=0;i<2;i++)
-								{
+
+								for(i=0;i<2;i++) {
 									this->hidden->SB[i]->sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort=safeport;
 									this->hidden->SB[i]->sb_DBufInfo->dbi_DispMessage.mn_ReplyPort=dispport;
 								}
@@ -1108,31 +1057,28 @@
 								current->flags|=SDL_DOUBLEBUF;
 							}
 						}
-						else 
-						{
+						else {
 							FreeScreenBuffer(SDL_Display,this->hidden->SB[1]);
 							this->hidden->SB[0]=NULL;
 						}
 					}
 
 					if(!ok)
-					{
 						flags&=~SDL_DOUBLEBUF;
-					}
 				}
 			}
 
 			if(GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH)==bpp)
-				this->hidden->same_format=1;				
+				this->hidden->same_format=1;
 		}
 
 		bpp=this->hidden->depth=GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH);
-		D(bug("Setto la profiondita' dello schermo a: %ld\n",this->hidden->depth));
+		D(bug("Setting screen depth to: %ld\n",this->hidden->depth));
 
-		for ( i = 0; i < this->hidden->nvisuals; i++ ) {
+		for ( i = 0; i < this->hidden->nvisuals; i++ )
 			if ( this->hidden->visuals[i].depth == bpp ) /* era .depth */
 				break;
-		}
+
 		if ( i == this->hidden->nvisuals ) {
 			SDL_SetError("No matching visual for requested depth");
 			return NULL;	/* should never happen */
@@ -1202,11 +1148,14 @@
 		this->screen->flags &= ~SDL_FULLSCREEN;
 		CGX_LeaveFullScreen(this);
 	}
+
 	CGX_RefreshDisplay(this);
 	if ( event_thread ) {
 		SDL_Unlock_EventThread();
 	}
+
 	SDL_ResetKeyboard();
+
 	return(1);
 }
 
@@ -1274,7 +1223,7 @@
 			break;
 
 		default:
-			D(bug("Errore, SetSingleColor con PIXFMT %ld!\n",fmt));
+			D(bug("Error, SetSingleColor with PIXFMT %ld!\n",fmt));
 	}
 }
 
@@ -1292,11 +1241,11 @@
 	else
 	{
 		if(	SDL_Display->MouseX>=(SDL_Window->LeftEdge+SDL_Window->BorderLeft) && SDL_Display->MouseX<(SDL_Window->LeftEdge+SDL_Window->Width-SDL_Window->BorderRight) &&
-			SDL_Display->MouseY>=(SDL_Window->TopEdge+SDL_Window->BorderLeft) && SDL_Display->MouseY<(SDL_Window->TopEdge+SDL_Window->Height-SDL_Window->BorderBottom) 
+			SDL_Display->MouseY>=(SDL_Window->TopEdge+SDL_Window->BorderLeft) && SDL_Display->MouseY<(SDL_Window->TopEdge+SDL_Window->Height-SDL_Window->BorderBottom)
 			)
 		{
 			SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
-			SDL_PrivateMouseMotion(0, 0, SDL_Display->MouseX-SDL_Window->LeftEdge-SDL_Window->BorderLeft, 
+			SDL_PrivateMouseMotion(0, 0, SDL_Display->MouseX-SDL_Window->LeftEdge-SDL_Window->BorderLeft,
 										SDL_Display->MouseY-SDL_Window->TopEdge-SDL_Window->BorderTop);
 		}
 		else
@@ -1314,7 +1263,7 @@
 	/* Check to make sure we have a colormap allocated */
 
 	/* It's easy if we have a hidden colormap */
-	if ( (this->screen->flags & SDL_HWPALETTE) && currently_fullscreen ) 
+	if ( (this->screen->flags & SDL_HWPALETTE) && currently_fullscreen )
 	{
 		ULONG  xcmap[256*3+2];
 
@@ -1343,7 +1292,7 @@
 		{
 // In this case I have to unalloc and realloc the full palette
 			D(bug("Obtaining %ld colors on the screen\n",ncolors));
-	
+
 		/* Free existing allocated colors */
 			for ( pixel=0; pixel<this->screen->format->palette->ncolors; ++pixel ) {
 				if(SDL_XPixels[pixel]>=0)
@@ -1356,7 +1305,7 @@
 			}
 		}
 		else
-		{			
+		{
 #ifndef USE_CGX_WRITELUTPIXEL
 			Uint32 fmt;
 			D(bug("Preparing a conversion pixel table...\n"));
@@ -1368,7 +1317,7 @@
 				SetSingleColor(fmt,colors[firstcolor+i].r,colors[firstcolor+i].g,colors[firstcolor+i].b,(unsigned char *)&SDL_XPixels[firstcolor+i]);
 			}
 #else
-//			D(bug("Eseguo remap degli XPixel(%lx): (da %ld, %ld colori) primo: r%ld g%ld b%ld\n",SDL_XPixels,firstcolor,ncolors,colors[firstcolor].r,colors[firstcolor].g,colors[firstcolor].b));
+//			D(bug("Executing XPixel(%lx) remapping: (from %ld, %ld colors) first: r%ld g%ld b%ld\n",SDL_XPixels,firstcolor,ncolors,colors[firstcolor].r,colors[firstcolor].g,colors[firstcolor].b));
 			for(i=0;i<ncolors;i++)
 				SDL_XPixels[i+firstcolor]=(colors[firstcolor+i].r<<16)+(colors[firstcolor+i].g<<8)+colors[firstcolor+i].b;
 #endif
@@ -1387,32 +1336,23 @@
 {
 	/* Shutdown everything that's still up */
 	/* The event thread should be done, so we can touch SDL_Display */
+	D(bug("CGX_VideoQuit\n"));
+
 	if ( SDL_Display != NULL ) {
 		/* Clean up OpenGL */
-
+		if(this->gl_data->gl_active == 1) {
+			CGX_GL_Quit(this);
+		}
 		/* Start shutting down the windows */
+		D(bug("Destroying image...\n"));
 		CGX_DestroyImage(this, this->screen);
+		D(bug("Destroying window...\n"));
 		CGX_DestroyWindow(this, this->screen);
 // Otherwise SDL_VideoQuit will try to free it!
 		SDL_VideoSurface=NULL;
+
 		CGX_FreeVideoModes(this);
 
-/*
-		if ( SDL_iconcolors ) {
-			unsigned long pixel;
-			int numcolors =
-				((this->screen->format)->palette)->ncolors;
-			for ( pixel=0; pixel<numcolors; ++pixel ) {
-				while ( SDL_iconcolors[pixel] > 0 ) {
-					XFreeColors(SDL_Display,
-						SDL_DisplayColormap,&pixel,1,0);
-					--SDL_iconcolors[pixel];
-				}
-			}
-			free(SDL_iconcolors);
-			SDL_iconcolors = NULL;
-		} 
-*/
 		/* Free that blank cursor */
 		if ( SDL_BlankCursor != NULL ) {
 			FreeMem(SDL_BlankCursor,16);
@@ -1422,6 +1362,8 @@
 		/* Close the X11 graphics connection */
 		this->hidden->same_format=0;
 
+		D(bug("Destroying screen...\n"));
+
 		if ( GFX_Display != NULL )
 			DestroyScreen(this);
 
@@ -1431,19 +1373,18 @@
 		/* Unload GL library after X11 shuts down */
 	}
 
-	if( CyberGfxBase)
-	{
+	D(bug("Closing libraries...\n"));
+
+	if( CyberGfxBase) {
 		CloseLibrary(CyberGfxBase);
 		CyberGfxBase=NULL;
 	}
 
-	if (IntuitionBase)
-	{
+	if (IntuitionBase) {
 		CloseLibrary((struct Library *)IntuitionBase);
 		IntuitionBase=NULL;
 	}
-	if (GfxBase)
-	{
+	if (GfxBase) {
 		CloseLibrary((struct Library *)GfxBase);
 		GfxBase=NULL;
 	}
@@ -1452,5 +1393,7 @@
 		/* Direct screen access, no memory buffer */
 		this->screen->pixels = NULL;
 	}
+	D(bug("End of CGX_VideoQuit.\n"));
+
 }
 
--- a/src/video/cybergfx/SDL_cgxvideo.h	Fri Dec 14 13:13:20 2001 +0000
+++ b/src/video/cybergfx/SDL_cgxvideo.h	Sun Dec 16 20:00:27 2001 +0000
@@ -38,7 +38,7 @@
 #include <graphics/scale.h>
 #include <graphics/gfx.h>
 #include <intuition/intuition.h>
-#ifdef __SASC
+#if defined(__SASC) || defined(STORMC4_WOS)
 #include <proto/exec.h>
 #include <proto/cybergraphics.h>
 #include <proto/graphics.h>
@@ -177,6 +177,7 @@
 	APTR lock;
 	struct SDL_VideoDevice *videodata;
 	APTR mask;
+	int allocated;
 };
 
 int CGX_CheckHWBlit(_THIS,SDL_Surface *src,SDL_Surface *dst);