-Added more code for graphics core system. Still unfinished, but at least the framework is now in place.

This commit is contained in:
cyberwarriorx 2007-01-22 03:36:42 +00:00
parent 287037abd5
commit 9edc42e8b4
3 changed files with 102 additions and 9 deletions

View File

@ -2,8 +2,8 @@
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright (C) 2006 Theo Berkau
Copyright (C) 2007 shash
Copyright (C) 2006-2007 Theo Berkau
Copyright (C) 2007 shash
This file is part of DeSmuME
@ -84,6 +84,14 @@ void (*modeRender[8][4])(GPU * gpu, u8 num, u16 l, u8 * DST)=
{lineText, lineText, lineText, lineText}, //7
};
static GraphicsInterface_struct *GFXCore=NULL;
// This should eventually be moved to the port specific code
GraphicsInterface_struct *GFXCoreList[] = {
&GFXDummy,
NULL
};
GPU * GPU_Init(u8 l)
{
GPU * g;
@ -127,7 +135,7 @@ void GPU_Reset(GPU *g, u8 l)
void GPU_DeInit(GPU * gpu)
{
free(gpu);
free(gpu);
}
void GPU_resortBGs(GPU *gpu)
@ -1475,9 +1483,11 @@ void sprite2D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab)
}
}
void Screen_Init(void) {
MainScreen.gpu = GPU_Init(0);
SubScreen.gpu = GPU_Init(1);
int Screen_Init(int coreid) {
MainScreen.gpu = GPU_Init(0);
SubScreen.gpu = GPU_Init(1);
return GPU_ChangeGraphicsCore(coreid);
}
void Screen_Reset(void) {
@ -1488,4 +1498,80 @@ void Screen_Reset(void) {
void Screen_DeInit(void) {
GPU_DeInit(MainScreen.gpu);
GPU_DeInit(SubScreen.gpu);
if (GFXCore)
GFXCore->DeInit();
}
// This is for future graphics core switching. This is by no means set in stone
int GPU_ChangeGraphicsCore(int coreid)
{
int i;
// Make sure the old core is freed
if (GFXCore)
GFXCore->DeInit();
// So which core do we want?
if (coreid == GFXCORE_DEFAULT)
coreid = 0; // Assume we want the first one
// Go through core list and find the id
for (i = 0; GFXCoreList[i] != NULL; i++)
{
if (GFXCoreList[i]->id == coreid)
{
// Set to current core
GFXCore = GFXCoreList[i];
break;
}
}
if (GFXCore == NULL)
{
GFXCore = &GFXDummy;
return -1;
}
if (GFXCore->Init() == -1)
{
// Since it failed, instead of it being fatal, we'll just use the dummy
// core instead
GFXCore = &GFXDummy;
}
return 0;
}
int GFXDummyInit();
void GFXDummyDeInit();
void GFXDummyResize(int width, int height, BOOL fullscreen);
void GFXDummyOnScreenText(char *string, ...);
GraphicsInterface_struct GFXDummy = {
GFXCORE_DUMMY,
"Dummy Graphics Interface",
0,
GFXDummyInit,
GFXDummyDeInit,
GFXDummyResize,
GFXDummyOnScreenText
};
int GFXDummyInit()
{
return 0;
}
void GFXDummyDeInit()
{
}
void GFXDummyResize(int width, int height, BOOL fullscreen)
{
}
void GFXDummyOnScreenText(char *string, ...)
{
}

View File

@ -3,7 +3,7 @@
yopyop156.ifrance.com
Copyright (C) 2006-2007 Theo Berkau
Copyright (C) 2007 shash
Copyright (C) 2007 shash
This file is part of DeSmuME
@ -422,7 +422,7 @@ typedef struct {
extern Screen MainScreen;
extern Screen SubScreen;
void Screen_Init(void);
int Screen_Init(int coreid);
void Screen_Reset(void);
void Screen_DeInit(void);
@ -663,6 +663,8 @@ static INLINE void GPU_ligne(Screen * screen, u16 l)
#define GFXCORE_DEFAULT -1
#define GFXCORE_DUMMY 0
#define GFXCORE_FULLSCREEN (1 << 0)
typedef struct
{
int id; // ID number for core(see above defines)
@ -674,6 +676,8 @@ typedef struct
void (*OnScreenText)(char *string, ...); // For handling save state messages, etc.
} GraphicsInterface_struct;
extern GraphicsInterface_struct GFXDummy;
void GPU_setVideoProp(GPU *, u32 p);
void GPU_setBGProp(GPU *, u16 num, u16 p);
void GPU_scrollX(GPU *, u8 num, u16 v);
@ -714,6 +718,8 @@ void GPU_remove(GPU *, u8 num);
void GPU_addBack(GPU *, u8 num);
void GPU_toggleOBJ(GPU *, u8 disp);
int GPU_ChangeGraphicsCore(int coreid);
#ifdef __cplusplus
}
#endif

View File

@ -36,7 +36,8 @@ int NDS_Init(void) {
nds.VCount = 0;
nds.lignerendu = FALSE;
Screen_Init();
if (Screen_Init(GFXCORE_DUMMY) != 0)
return -1;
armcpu_new(&NDS_ARM7,1);
armcpu_new(&NDS_ARM9,0);