Added NDS_3D_ChangeCore for hot swapping between 3D cores, because I plan to write a software renderer someday.

The OpenGL shaders are now properly released on close.
Added "OGL" before the names of the OpenGL core funcs for clarity.
This commit is contained in:
luigi__ 2008-12-28 17:00:42 +00:00
parent 8445c48bad
commit 2146d19203
3 changed files with 51 additions and 16 deletions

View File

@ -124,11 +124,13 @@ OGLEXT(X_PFNGLGETSHADERSOURCEPROC,glShaderSource)
OGLEXT(PFNGLCOMPILESHADERPROC,glCompileShader)
OGLEXT(PFNGLCREATEPROGRAMPROC,glCreateProgram)
OGLEXT(PFNGLATTACHSHADERPROC,glAttachShader)
OGLEXT(PFNGLDETACHSHADERPROC,glDetachShader)
OGLEXT(PFNGLLINKPROGRAMPROC,glLinkProgram)
OGLEXT(PFNGLUSEPROGRAMPROC,glUseProgram)
OGLEXT(PFNGLGETSHADERIVPROC,glGetShaderiv)
OGLEXT(PFNGLGETSHADERINFOLOGPROC,glGetShaderInfoLog)
OGLEXT(PFNGLDELETESHADERPROC,glDeleteShader)
OGLEXT(PFNGLDELETEPROGRAMPROC,glDeleteProgram)
OGLEXT(PFNGLGETPROGRAMIVPROC,glGetProgramiv)
OGLEXT(PFNGLGETPROGRAMINFOLOGPROC,glGetProgramInfoLog)
OGLEXT(PFNGLVALIDATEPROGRAMPROC,glValidateProgram)
@ -353,7 +355,7 @@ static void createShaders()
//=================================================
static void Reset()
static void OGLReset()
{
int i;
@ -370,7 +372,7 @@ static void Reset()
memset(GPU_screen3D,0,sizeof(GPU_screen3D));
}
static char Init(void)
static char OGLInit(void)
{
GLuint loc;
@ -406,11 +408,13 @@ static char Init(void)
INITOGLEXT(PFNGLCOMPILESHADERPROC,glCompileShader)
INITOGLEXT(PFNGLCREATEPROGRAMPROC,glCreateProgram)
INITOGLEXT(PFNGLATTACHSHADERPROC,glAttachShader)
INITOGLEXT(PFNGLDETACHSHADERPROC,glDetachShader)
INITOGLEXT(PFNGLLINKPROGRAMPROC,glLinkProgram)
INITOGLEXT(PFNGLUSEPROGRAMPROC,glUseProgram)
INITOGLEXT(PFNGLGETSHADERIVPROC,glGetShaderiv)
INITOGLEXT(PFNGLGETSHADERINFOLOGPROC,glGetShaderInfoLog)
INITOGLEXT(PFNGLDELETESHADERPROC,glDeleteShader)
INITOGLEXT(PFNGLDELETEPROGRAMPROC,glDeleteProgram)
INITOGLEXT(PFNGLGETPROGRAMIVPROC,glGetProgramiv)
INITOGLEXT(PFNGLGETPROGRAMINFOLOGPROC,glGetProgramInfoLog)
INITOGLEXT(PFNGLVALIDATEPROGRAMPROC,glValidateProgram)
@ -465,8 +469,21 @@ static char Init(void)
return 1;
}
static void Close()
static void OGLClose()
{
if(hasShaders)
{
glUseProgram(0);
glDetachShader(shaderProgram, vertexShaderID);
glDetachShader(shaderProgram, fragmentShaderID);
glDeleteProgram(shaderProgram);
glDeleteShader(vertexShaderID);
glDeleteShader(fragmentShaderID);
hasShaders = false;
}
}
//zero 9/7/08 - changed *adr= to adr= while changing from c++. was that a bug?
@ -1062,7 +1079,7 @@ static void Control()
}
}
static void Render()
static void OGLRender()
{
if(!BEGINGL()) return;
@ -1152,7 +1169,7 @@ static void Render()
ENDGL();
}
static void VramReconfigureSignal()
static void OGLVramReconfigureSignal()
{
//well, this is a very blunt instrument.
//lets just flag all the textures as invalid.
@ -1199,7 +1216,7 @@ static void GL_ReadFramebuffer()
//}
}
static void GetLineCaptured(int line, u16* dst)
static void OGLGetLineCaptured(int line, u16* dst)
{
if(needRefreshFramebuffer) {
needRefreshFramebuffer = false;
@ -1230,7 +1247,7 @@ static void GetLineCaptured(int line, u16* dst)
}
static void GetLine(int line, int start, int end_inclusive, u16* dst)
static void OGLGetLine(int line, int start, int end_inclusive, u16* dst)
{
assert(line<192 && line>=0);
@ -1302,14 +1319,15 @@ static void GetLine(int line, int start, int end_inclusive, u16* dst)
GPU3DInterface gpu3Dgl = {
Init,
Reset,
Close,
Render,
VramReconfigureSignal,
GetLine,
GetLineCaptured
GPU3DInterface gpu3Dgl = {
"OpenGL",
OGLInit,
OGLReset,
OGLClose,
OGLRender,
OGLVramReconfigureSignal,
OGLGetLine,
OGLGetLineCaptured
};

View File

@ -20,12 +20,15 @@
#include "render3D.h"
int cur3DCore = GPU3D_NULL;
static void NDS_nullFunc1 (void){}
static char NDS_nullFunc2 (void){ return 1; }
static void NDS_nullFunc3 (int,unsigned short*) {}
static void NDS_nullFunc4 (int,int,int,unsigned short*) {}
GPU3DInterface gpu3DNull = {
"None",
NDS_nullFunc2, //NDS_3D_Init
NDS_nullFunc1, //NDS_3D_Reset
NDS_nullFunc1, //NDS_3D_Close
@ -39,5 +42,13 @@ GPU3DInterface *gpu3D = &gpu3DNull;
void NDS_3D_SetDriver (int core3DIndex)
{
gpu3D = core3DList[core3DIndex];
cur3DCore = core3DIndex;
gpu3D = core3DList[cur3DCore];
}
void NDS_3D_ChangeCore(int newCore)
{
gpu3D->NDS_3D_Close();
NDS_3D_SetDriver(newCore);
gpu3D->NDS_3D_Init();
}

View File

@ -26,6 +26,9 @@
typedef struct Render3DInterface
{
// The name of the plugin, this name will appear in the plugins list
char * name;
//called once when the plugin starts up
char (CALL_CONVENTION* NDS_3D_Init) (void);
@ -50,6 +53,8 @@ typedef struct Render3DInterface
} GPU3DInterface;
extern int cur3DCore;
// gpu 3D core list, per port
extern GPU3DInterface *core3DList[];
@ -61,5 +66,6 @@ extern GPU3DInterface gpu3DNull;
extern GPU3DInterface *gpu3D;
void NDS_3D_SetDriver (int core3DIndex);
void NDS_3D_ChangeCore(int newCore);
#endif