Implement fallback GL funcs so we don't call NULL func pointers.
This commit is contained in:
parent
a347b829d1
commit
cb9b7c1506
|
@ -248,12 +248,48 @@ static inline void opt_glCopyTexImage2D( GLenum target,
|
|||
|
||||
|
||||
#ifdef _WIN32
|
||||
/*
|
||||
* Some post-1.1 OpenGL functions can fail to be loaded through GL extensions
|
||||
* when running primitive OpenGL contexts on Microsoft Windows, specifically.
|
||||
*
|
||||
* As of the Project64 Glide64 version, Glitch64 now assigns these GL
|
||||
* functions to dummy functions to prevent access violations, while also
|
||||
* displaying error information showing the missing OpenGL support.
|
||||
*/
|
||||
|
||||
void DisplayError(const char * message)
|
||||
{
|
||||
MessageBoxA(NULL, message, NULL, MB_ICONERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
|
||||
PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT;
|
||||
PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
|
||||
PFNGLFOGCOORDFPROC glFogCoordfEXT;
|
||||
void dummy_glActiveTexture(GLenum/*texture*/)
|
||||
{ /* GLX render opcode 197 */
|
||||
DisplayError("glActiveTexture");
|
||||
}
|
||||
void dummy_glMultiTexCoord2f(GLenum/*target*/, GLfloat/*s*/, GLfloat/*t*/)
|
||||
{ /* GLX render opcode 203 */
|
||||
DisplayError("glMultiTexCoord2f");
|
||||
}
|
||||
void dummy_glFogCoordf(GLfloat/*coord*/)
|
||||
{ /* GLX render opcode 4124 */
|
||||
DisplayError("glFogCoordf");
|
||||
}
|
||||
void dummy_glBlendFuncSeparate(GLenum, GLenum, GLenum, GLenum)
|
||||
{ /* GLX render opcode 4134 */
|
||||
DisplayError("glBlendFuncSeparate");
|
||||
}
|
||||
|
||||
PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB;
|
||||
const char * dummy_wglGetExtensionsString(HDC)
|
||||
{
|
||||
DisplayError("wglGetExtensionsString");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
|
||||
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
|
||||
|
@ -265,6 +301,47 @@ PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = NULL;
|
|||
PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT = NULL;
|
||||
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
|
||||
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
|
||||
void dummy_glGenRenderbuffers(GLsizei/*n*/, GLuint* /*renderbuffers*/)
|
||||
{ /* GLX vendor opcode 1423 */
|
||||
DisplayError("glGenRenderbuffers");
|
||||
}
|
||||
void dummy_glGenFramebuffers(GLsizei/*n*/, GLuint* /*framebuffers*/)
|
||||
{ /* GLX vendor opcode 1426 */
|
||||
DisplayError("glGenFramebuffers");
|
||||
}
|
||||
GLenum dummy_glCheckFramebufferStatus(GLenum/*target*/)
|
||||
{ /* GLX vendor opcode 1427 */
|
||||
DisplayError("glCheckFramebufferStatus");
|
||||
return 0x00008CDD; /* GL_FRAMEBUFFER_UNSUPPORTED */
|
||||
}
|
||||
void dummy_glBindRenderbuffer(GLenum/*target*/, GLuint/*renderbuffer*/)
|
||||
{ /* GLX render opcode 4316 */
|
||||
DisplayError("glBindRenderbuffer");
|
||||
}
|
||||
void dummy_glDeleteRenderbuffers(GLsizei/*n*/, const GLuint* /*renderbuffers*/)
|
||||
{ /* GLX render opcode 4317 */
|
||||
DisplayError("glDeleteRenderbuffers");
|
||||
}
|
||||
void dummy_glRenderbufferStorage(GLenum, GLenum, GLsizei, GLsizei)
|
||||
{ /* GLX render opcode 4318 */
|
||||
DisplayError("glRenderbufferStorage");
|
||||
}
|
||||
void dummy_glBindFramebuffer(GLenum/*target*/, GLuint/*framebuffer*/)
|
||||
{ /* GLX render opcode 4319 */
|
||||
DisplayError("glBindFramebuffer");
|
||||
}
|
||||
void dummy_glDeleteFramebuffers(GLsizei/*n*/, const GLuint* /*framebuffers*/)
|
||||
{ /* GLX render opcode 4320 */
|
||||
DisplayError("glDeleteFramebuffers");
|
||||
}
|
||||
void dummy_glFramebufferTexture2D(GLenum, GLenum, GLenum, GLuint, GLint)
|
||||
{ /* GLX render opcode 4322 */
|
||||
DisplayError("glFramebufferTexture2D");
|
||||
}
|
||||
void dummy_glFramebufferRenderbuffer(GLenum, GLenum, GLenum, GLuint)
|
||||
{ /* GLX render opcode 4324 */
|
||||
DisplayError("glFramebufferRenderbuffer");
|
||||
}
|
||||
|
||||
PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
|
||||
PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
|
||||
|
@ -282,6 +359,73 @@ PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
|
|||
PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
|
||||
PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
|
||||
PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
|
||||
void dummy_glSecondaryColor3f(GLfloat/*red*/, GLfloat/*green*/, GLfloat/*blue*/)
|
||||
{ /* GLX render opcode 4129 */
|
||||
DisplayError("glSecondaryColor3f");
|
||||
}
|
||||
GLuint dummy_glCreateShader(GLenum/*type*/)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glCreateShader");
|
||||
return ((GLuint)(NULL));
|
||||
}
|
||||
void dummy_glShaderSource(GLuint, GLsizei, const GLchar **, GLint *)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glShaderSource");
|
||||
}
|
||||
void dummy_glCompileShader(GLuint/*shader*/)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glCompileShader");
|
||||
}
|
||||
GLuint dummy_glCreateProgram(void)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glCreateProgram");
|
||||
return ((GLuint)(NULL));
|
||||
}
|
||||
void dummy_glAttachObject(GLhandleARB, GLhandleARB)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glAttachObject");
|
||||
}
|
||||
void dummy_glLinkProgram(GLuint/*program*/)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glLinkProgram");
|
||||
}
|
||||
void dummy_glUseProgram(GLuint/*program*/)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glUseProgram");
|
||||
}
|
||||
GLint dummy_glGetUniformLocation(GLuint/*program*/, GLchar* /*name*/)
|
||||
{ /* GLX single opcode ? */
|
||||
DisplayError("glGetUniformLocation");
|
||||
return -1;
|
||||
}
|
||||
void dummy_glUniform1i(GLint/*location*/, GLint/*v0*/)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glUniform1i");
|
||||
}
|
||||
void dummy_glUniform4i(GLint/*location*/, GLint, GLint, GLint, GLint)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glUniform4i");
|
||||
}
|
||||
void dummy_glUniform1f(GLint/*location*/, GLfloat/*v0*/)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glUniform1f");
|
||||
}
|
||||
void dummy_glUniform4f(GLint/*location*/, GLfloat, GLfloat, GLfloat, GLfloat)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glUniform4f");
|
||||
}
|
||||
void dummy_glDeleteObject(GLhandleARB/*obj*/)
|
||||
{ /* GLX render opcode ? */
|
||||
DisplayError("glDeleteObject");
|
||||
}
|
||||
void dummy_glGetInfoLog(GLhandleARB, GLsizei, GLsizei *, GLcharARB *)
|
||||
{ /* GLX single opcode ? */
|
||||
DisplayError("glGetInfoLog");
|
||||
}
|
||||
void dummy_glGetObjectParameteriv(GLhandleARB, GLenum, GLint *)
|
||||
{ /* GLX single opcode ? */
|
||||
DisplayError("glGetObjectParameteriv");
|
||||
}
|
||||
|
||||
// FXT1,DXT1,DXT5 support - Hiroshi Morii <koolsmoky(at)users.sourceforge.net>
|
||||
// NOTE: Glide64 + GlideHQ use the following formats
|
||||
|
@ -290,6 +434,10 @@ PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
|
|||
// GL_COMPRESSED_RGB_FXT1_3DFX
|
||||
// GL_COMPRESSED_RGBA_FXT1_3DFX
|
||||
PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2DARB;
|
||||
void dummy_glCompressedTexImage2D(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *)
|
||||
{ /* GLX render opcode 215 */
|
||||
DisplayError("glCompressedTexImage2D");
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
|
||||
|
@ -980,6 +1128,11 @@ grSstWinOpen(
|
|||
#ifdef _WIN32
|
||||
glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress("glActiveTextureARB");
|
||||
glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)wglGetProcAddress("glMultiTexCoord2fARB");
|
||||
|
||||
if (glActiveTextureARB == NULL)
|
||||
glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)dummy_glActiveTexture;
|
||||
if (glMultiTexCoord2fARB == NULL)
|
||||
glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)dummy_glMultiTexCoord2f;
|
||||
#endif // _WIN32
|
||||
|
||||
nbTextureUnits = 0;
|
||||
|
@ -1016,6 +1169,8 @@ grSstWinOpen(
|
|||
|
||||
#ifdef _WIN32
|
||||
glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)wglGetProcAddress("glBlendFuncSeparateEXT");
|
||||
if (glBlendFuncSeparateEXT == NULL)
|
||||
glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)dummy_glBlendFuncSeparate;
|
||||
#endif // _WIN32
|
||||
|
||||
if (isExtensionSupported("GL_EXT_fog_coord") == 0)
|
||||
|
@ -1025,10 +1180,14 @@ grSstWinOpen(
|
|||
|
||||
#ifdef _WIN32
|
||||
glFogCoordfEXT = (PFNGLFOGCOORDFPROC)wglGetProcAddress("glFogCoordfEXT");
|
||||
if (glFogCoordfEXT == NULL)
|
||||
glFogCoordfEXT = (PFNGLFOGCOORDFPROC)dummy_glFogCoordf;
|
||||
#endif // _WIN32
|
||||
|
||||
#ifdef _WIN32
|
||||
wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
|
||||
if (wglGetExtensionsStringARB == NULL)
|
||||
wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)dummy_wglGetExtensionsString;
|
||||
#endif // _WIN32
|
||||
|
||||
#ifdef _WIN32
|
||||
|
@ -1038,11 +1197,33 @@ grSstWinOpen(
|
|||
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)wglGetProcAddress("glCheckFramebufferStatusEXT");
|
||||
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)wglGetProcAddress("glDeleteFramebuffersEXT");
|
||||
|
||||
if (glBindFramebufferEXT == NULL)
|
||||
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)dummy_glBindFramebuffer;
|
||||
if (glFramebufferTexture2DEXT == NULL)
|
||||
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)dummy_glFramebufferTexture2D;
|
||||
if (glGenFramebuffersEXT == NULL)
|
||||
glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)dummy_glGenFramebuffers;
|
||||
if (glCheckFramebufferStatusEXT == NULL)
|
||||
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)dummy_glCheckFramebufferStatus;
|
||||
if (glDeleteFramebuffersEXT == NULL)
|
||||
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)dummy_glDeleteFramebuffers;
|
||||
|
||||
glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)wglGetProcAddress("glBindRenderbufferEXT");
|
||||
glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)wglGetProcAddress("glDeleteRenderbuffersEXT");
|
||||
glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)wglGetProcAddress("glGenRenderbuffersEXT");
|
||||
glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)wglGetProcAddress("glRenderbufferStorageEXT");
|
||||
glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)wglGetProcAddress("glFramebufferRenderbufferEXT");
|
||||
|
||||
if (glBindRenderbufferEXT == NULL)
|
||||
glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)dummy_glBindRenderbuffer;
|
||||
if (glDeleteRenderbuffersEXT == NULL)
|
||||
glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)dummy_glDeleteRenderbuffers;
|
||||
if (glGenRenderbuffersEXT == NULL)
|
||||
glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)dummy_glGenRenderbuffers;
|
||||
if (glRenderbufferStorageEXT == NULL)
|
||||
glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)dummy_glRenderbufferStorage;
|
||||
if (glFramebufferRenderbufferEXT == NULL)
|
||||
glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)dummy_glFramebufferRenderbuffer;
|
||||
#endif // _WIN32
|
||||
|
||||
use_fbo = config.fbo && glFramebufferRenderbufferEXT;
|
||||
|
@ -1083,6 +1264,42 @@ grSstWinOpen(
|
|||
|
||||
#ifdef _WIN32
|
||||
glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)wglGetProcAddress("glCompressedTexImage2DARB");
|
||||
|
||||
if (glCreateShaderObjectARB == NULL)
|
||||
glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)dummy_glCreateShader;
|
||||
if (glShaderSourceARB == NULL)
|
||||
glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)dummy_glShaderSource;
|
||||
if (glCompileShaderARB == NULL)
|
||||
glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)dummy_glCompileShader;
|
||||
if (glCreateProgramObjectARB == NULL)
|
||||
glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)dummy_glCreateProgram;
|
||||
if (glAttachObjectARB == NULL)
|
||||
glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)dummy_glAttachObject;
|
||||
if (glLinkProgramARB == NULL)
|
||||
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)dummy_glLinkProgram;
|
||||
if (glUseProgramObjectARB == NULL)
|
||||
glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)dummy_glUseProgram;
|
||||
if (glGetUniformLocationARB == NULL)
|
||||
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)dummy_glGetUniformLocation;
|
||||
if (glUniform1iARB == NULL)
|
||||
glUniform1iARB = (PFNGLUNIFORM1IARBPROC)dummy_glUniform1i;
|
||||
if (glUniform4iARB == NULL)
|
||||
glUniform4iARB = (PFNGLUNIFORM4IARBPROC)dummy_glUniform4i;
|
||||
if (glUniform4fARB == NULL)
|
||||
glUniform4fARB = (PFNGLUNIFORM4FARBPROC)dummy_glUniform4f;
|
||||
if (glUniform1fARB == NULL)
|
||||
glUniform1fARB = (PFNGLUNIFORM1FARBPROC)dummy_glUniform1f;
|
||||
if (glDeleteObjectARB == NULL)
|
||||
glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)dummy_glDeleteObject;
|
||||
if (glGetInfoLogARB == NULL)
|
||||
glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)dummy_glGetInfoLog;
|
||||
if (glGetObjectParameterivARB == NULL)
|
||||
glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)dummy_glGetObjectParameteriv;
|
||||
|
||||
if (glSecondaryColor3f == NULL)
|
||||
glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)dummy_glSecondaryColor3f;
|
||||
if (glCompressedTexImage2DARB == NULL)
|
||||
glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)dummy_glCompressedTexImage2D;
|
||||
#endif
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue