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:
parent
8445c48bad
commit
2146d19203
|
@ -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
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue