diff --git a/desmume/src/OGLRender.cpp b/desmume/src/OGLRender.cpp index 498c38edd..f2e64e574 100644 --- a/desmume/src/OGLRender.cpp +++ b/desmume/src/OGLRender.cpp @@ -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 }; diff --git a/desmume/src/render3D.cpp b/desmume/src/render3D.cpp index 8a721c38c..692592785 100644 --- a/desmume/src/render3D.cpp +++ b/desmume/src/render3D.cpp @@ -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(); } diff --git a/desmume/src/render3D.h b/desmume/src/render3D.h index af829427a..c8b58f7b9 100644 --- a/desmume/src/render3D.h +++ b/desmume/src/render3D.h @@ -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