146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/*
246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    SDL - Simple DirectMedia Layer
346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Copyright (C) 1997-2006 Sam Lantinga
446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is free software; you can redistribute it and/or
646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    modify it under the terms of the GNU Lesser General Public
746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License as published by the Free Software Foundation; either
846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    version 2.1 of the License, or (at your option) any later version.
946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    This library is distributed in the hope that it will be useful,
1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    but WITHOUT ANY WARRANTY; without even the implied warranty of
1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Lesser General Public License for more details.
1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    You should have received a copy of the GNU Lesser General Public
1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    License along with this library; if not, write to the Free Software
1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    Sam Lantinga
2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner    slouken@libsdl.org
2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h"
2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_video.h"
2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_mouse.h"
2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_sysvideo.h"
2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../SDL_pixels_c.h"
2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_events_c.h"
2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_dcvideo.h"
3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_dcevents_c.h"
3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_dcmouse_c.h"
3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <dc/video.h>
3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <dc/pvr.h>
3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Initialization/Query functions */
3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_VideoInit(_THIS, SDL_PixelFormat *vformat);
4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_Rect **DC_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_Surface *DC_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_VideoQuit(_THIS);
4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Hardware surface functions */
4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_AllocHWSurface(_THIS, SDL_Surface *surface);
4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_LockHWSurface(_THIS, SDL_Surface *surface);
4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_UnlockHWSurface(_THIS, SDL_Surface *surface);
4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_FreeHWSurface(_THIS, SDL_Surface *surface);
5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_FlipHWSurface(_THIS, SDL_Surface *surface);
5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* etc. */
5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* OpenGL */
5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void *DC_GL_GetProcAddress(_THIS, const char *proc);
5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_GL_LoadLibrary(_THIS, const char *path);
5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value);
6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_GL_SwapBuffers(_THIS);
6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* DC driver bootstrap functions */
6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_Available(void)
6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return 1;
6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_DeleteDevice(SDL_VideoDevice *device)
7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_free(device->hidden);
7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_free(device);
7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_VideoDevice *DC_CreateDevice(int devindex)
7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_VideoDevice *device;
7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Initialize all variables that we clean on shutdown */
8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice));
8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( device ) {
8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_memset(device, 0, (sizeof *device));
8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		device->hidden = (struct SDL_PrivateVideoData *)
8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				SDL_malloc((sizeof *device->hidden));
8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( (device == NULL) || (device->hidden == NULL) ) {
8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_OutOfMemory();
8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if ( device ) {
9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner			SDL_free(device);
9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		}
9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(0);
9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	SDL_memset(device->hidden, 0, (sizeof *device->hidden));
9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set the function pointers */
9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->VideoInit = DC_VideoInit;
9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->ListModes = DC_ListModes;
9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetVideoMode = DC_SetVideoMode;
10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->CreateYUVOverlay = NULL;
10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetColors = DC_SetColors;
10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->UpdateRects = DC_UpdateRects;
10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->VideoQuit = DC_VideoQuit;
10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->AllocHWSurface = DC_AllocHWSurface;
10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->CheckHWBlit = NULL;
10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FillHWRect = NULL;
10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetHWColorKey = NULL;
10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetHWAlpha = NULL;
10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->LockHWSurface = DC_LockHWSurface;
11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->UnlockHWSurface = DC_UnlockHWSurface;
11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FlipHWSurface = DC_FlipHWSurface;
11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->FreeHWSurface = DC_FreeHWSurface;
11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GL_LoadLibrary = DC_GL_LoadLibrary;
11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GL_GetProcAddress = DC_GL_GetProcAddress;
11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GL_GetAttribute = DC_GL_GetAttribute;
11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GL_MakeCurrent = NULL;
11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GL_SwapBuffers = DC_GL_SwapBuffers;
11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetCaption = NULL;
12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->SetIcon = NULL;
12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->IconifyWindow = NULL;
12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GrabInput = NULL;
12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->GetWMInfo = NULL;
12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->InitOSKeymap = DC_InitOSKeymap;
12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->PumpEvents = DC_PumpEvents;
12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	device->free = DC_DeleteDevice;
12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return device;
13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13346be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerVideoBootStrap DC_bootstrap = {
13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	"dcvideo", "Dreamcast Video",
13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DC_Available, DC_CreateDevice
13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner};
13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint DC_VideoInit(_THIS, SDL_PixelFormat *vformat)
14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Determine the screen depth (use default 16-bit depth) */
14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* we change this during the SDL_SetVideoMode implementation... */
14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	vformat->BitsPerPixel = 16;
14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	vformat->Rmask = 0x0000f800;
14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	vformat->Gmask = 0x000007e0;
14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	vformat->Bmask = 0x0000001f;
14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* We're done! */
14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerconst static SDL_Rect
15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	RECT_800x600 = {0,0,800,600},
15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	RECT_640x480 = {0,0,640,480},
15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	RECT_320x240 = {0,0,320,240};
15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerconst static SDL_Rect *vid_modes[] = {
15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	&RECT_800x600,
15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	&RECT_640x480,
15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	&RECT_320x240,
16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	NULL
16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner};
16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
16346be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_Rect **DC_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	switch(format->BitsPerPixel) {
16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case 15:
16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case 16:
16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return &vid_modes;
16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case 32:
17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if (!(flags & SDL_OPENGL))
17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return &vid_modes;
17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	default:
17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return NULL;
17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//	return (SDL_Rect **) -1;
17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerpvr_init_params_t params = {
17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        /* Enable opaque and translucent polygons with size 16 */
18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        { PVR_BINSIZE_16, PVR_BINSIZE_0, PVR_BINSIZE_16, PVR_BINSIZE_0, PVR_BINSIZE_16 },
18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        /* Vertex buffer size */
18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner        512*1024
18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner};
18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int pvr_inited;
18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19046be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_Surface *DC_SetVideoMode(_THIS, SDL_Surface *current,
19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner				int width, int height, int bpp, Uint32 flags)
19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int disp_mode,pixel_mode,pitch;
19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	Uint32 Rmask, Gmask, Bmask;
19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (width==320 && height==240) disp_mode=DM_320x240;
19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	else if (width==640 && height==480) disp_mode=DM_640x480;
19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	else if (width==800 && height==600) disp_mode=DM_800x608;
19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	else {
20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_SetError("Couldn't find requested mode in list");
20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(NULL);
20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	switch(bpp) {
20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case 15: pixel_mode = PM_RGB555; pitch = width*2;
20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* 5-5-5 */
20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Rmask = 0x00007c00;
20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Gmask = 0x000003e0;
20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Bmask = 0x0000001f;
21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case 16: pixel_mode = PM_RGB565; pitch = width*2;
21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		/* 5-6-5 */
21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Rmask = 0x0000f800;
21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Gmask = 0x000007e0;
21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Bmask = 0x0000001f;
21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case 24: bpp = 32;
21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case 32: pixel_mode = PM_RGB888; pitch = width*4;
21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Rmask = 0x00ff0000;
22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Gmask = 0x0000ff00;
22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		Bmask = 0x000000ff;
22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if (!(flags & SDL_OPENGL))
22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	default:
22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		SDL_SetError("Couldn't find requested mode in list");
22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(NULL);
22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//  if ( bpp != current->format->BitsPerPixel ) {
23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if ( ! SDL_ReallocFormat(current, bpp, Rmask, Gmask, Bmask, 0) ) {
23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return(NULL);
23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//  }
23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* Set up the new mode framebuffer */
23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->flags = (SDL_FULLSCREEN|SDL_HWSURFACE);
23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->w = width;
24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->h = height;
24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->pitch = pitch;
24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (pvr_inited) {
24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		pvr_inited = 0;
24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		pvr_shutdown();
24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	vid_set_mode(disp_mode,pixel_mode);
25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	current->pixels = vram_s;
25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (flags & SDL_OPENGL) {
25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		this->gl_config.driver_loaded = 1;
25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		current->flags = SDL_FULLSCREEN | SDL_OPENGL;
25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		current->pixels = NULL;
25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		pvr_inited = 1;
26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		pvr_init(&params);
26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		glKosInit();
26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		glKosBeginFrame();
26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	} else
26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (flags | SDL_DOUBLEBUF) {
26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		current->flags |= SDL_DOUBLEBUF;
26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		current->pixels = (void*)((int)current->pixels | 0x400000);
26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* We're done */
27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(current);
27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* We don't actually allow hardware surfaces other than the main one */
27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_AllocHWSurface(_THIS, SDL_Surface *surface)
27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(-1);
27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_FreeHWSurface(_THIS, SDL_Surface *surface)
28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return;
28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* We need to wait for vertical retrace on page flipped displays */
28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_LockHWSurface(_THIS, SDL_Surface *surface)
28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_UnlockHWSurface(_THIS, SDL_Surface *surface)
29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return;
29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_FlipHWSurface(_THIS, SDL_Surface *surface)
29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (surface->flags & SDL_DOUBLEBUF) {
29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		vid_set_start((int)surface->pixels & 0xffffff);
29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		surface->pixels = (void*)((int)surface->pixels ^ 0x400000);
30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(0);
30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* do nothing. */
30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	/* do nothing of note. */
31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return(1);
31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Note:  If we are terminated, this could be called in the middle of
31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner   another SDL video routine -- notably UpdateRects.
31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/
31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_VideoQuit(_THIS)
31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (pvr_inited) {
32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		pvr_inited = 0;
32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		pvr_shutdown();
32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if SDL_VIDEO_OPENGL
32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid dmyfunc(void) {}
33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnertypedef void (*funcptr)();
33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerconst static struct {
33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	char *name;
33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	funcptr addr;
33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} glfuncs[] = {
33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define	DEF(func)	{#func,&func}
33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glBegin),
33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glBindTexture),
34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glBlendFunc),
34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glColor4f),
34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//	DEF(glCopyImageID),
34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glDisable),
34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glEnable),
34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glEnd),
34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glFlush),
34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glGenTextures),
34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glGetString),
34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glLoadIdentity),
35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glMatrixMode),
35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glOrtho),
35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glPixelStorei),
35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//	DEF(glPopAttrib),
35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//	DEF(glPopClientAttrib),
35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{"glPopAttrib",&dmyfunc},
35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{"glPopClientAttrib",&dmyfunc},
35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glPopMatrix),
35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//	DEF(glPushAttrib),
35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner//	DEF(glPushClientAttrib),
36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{"glPushAttrib",&dmyfunc},
36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	{"glPushClientAttrib",&dmyfunc},
36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glPushMatrix),
36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glTexCoord2f),
36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glTexEnvf),
36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glTexImage2D),
36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glTexParameteri),
36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glTexSubImage2D),
36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glVertex2i),
36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	DEF(glViewport),
37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#undef	DEF
37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner};
37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void *DC_GL_GetProcAddress(_THIS, const char *proc)
37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	void *ret;
37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int i;
37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	ret = glKosGetProcAddress(proc);
37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	if (ret) return ret;
38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	for(i=0;i<sizeof(glfuncs)/sizeof(glfuncs[0]);i++) {
38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		if (SDL_strcmp(proc,glfuncs[i].name)==0) return glfuncs[i].addr;
38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return NULL;
38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_GL_LoadLibrary(_THIS, const char *path)
38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	this->gl_config.driver_loaded = 1;
39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return 0;
39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic int DC_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)
39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	GLenum mesa_attrib;
39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	int val;
39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	switch(attrib) {
40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_RED_SIZE:
40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 5;
40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_GREEN_SIZE:
40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 6;
40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_BLUE_SIZE:
40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 5;
40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_ALPHA_SIZE:
41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 0;
41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_DOUBLEBUFFER:
41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 1;
41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_DEPTH_SIZE:
41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 16; /* or 32? */
41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_STENCIL_SIZE:
42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 0;
42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_ACCUM_RED_SIZE:
42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 0;
42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_ACCUM_GREEN_SIZE:
42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 0;
42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_ACCUM_BLUE_SIZE:
42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 0;
42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	case SDL_GL_ACCUM_ALPHA_SIZE:
43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		val = 0;
43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		break;
43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	default :
43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner		return -1;
43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	}
43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	*value = val;
43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	return 0;
43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner
44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void DC_GL_SwapBuffers(_THIS)
44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{
44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	glKosFinishFrame();
44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner	glKosBeginFrame();
44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}
44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif
446