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(¶ms); 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