diff --git a/OpenRCT2.xcodeproj/project.pbxproj b/OpenRCT2.xcodeproj/project.pbxproj index a35b3c3b2a..0b3bd1ff97 100644 --- a/OpenRCT2.xcodeproj/project.pbxproj +++ b/OpenRCT2.xcodeproj/project.pbxproj @@ -853,6 +853,7 @@ D41B741C1C210A7A0080A7B9 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; D41B74721C2125E50080A7B9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = distribution/macos/Assets.xcassets; sourceTree = SOURCE_ROOT; }; D43407E11D0E14CE00C2B3D4 /* shaders */ = {isa = PBXFileReference; lastKnownFileType = folder; name = shaders; path = data/shaders; sourceTree = SOURCE_ROOT; }; + D43BAB921F8C2B2B00A9E362 /* OpenGLAPIProc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenGLAPIProc.h; sourceTree = ""; }; D45A38B31CF3006400659A24 /* libcrypto.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libcrypto.dylib; sourceTree = ""; }; D45A38B41CF3006400659A24 /* libfreetype.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libfreetype.dylib; sourceTree = ""; }; D45A38B51CF3006400659A24 /* libjansson.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libjansson.dylib; sourceTree = ""; }; @@ -2667,6 +2668,7 @@ F76C859A1EC4E82600FA49E2 /* GLSLTypes.h */, F76C859B1EC4E82600FA49E2 /* OpenGLAPI.cpp */, F76C859C1EC4E82600FA49E2 /* OpenGLAPI.h */, + D43BAB921F8C2B2B00A9E362 /* OpenGLAPIProc.h */, F76C859D1EC4E82600FA49E2 /* OpenGLDrawingEngine.cpp */, F76C859E1EC4E82600FA49E2 /* OpenGLFramebuffer.cpp */, F76C859F1EC4E82600FA49E2 /* OpenGLFramebuffer.h */, diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp index 37c738c6b0..efd973c993 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp @@ -16,105 +16,30 @@ #ifndef DISABLE_OPENGL -#define NO_EXTERN_GLAPI #include "OpenGLAPI.h" #if OPENGL_NO_LINK +#define OPENGL_PROC(TYPE, PROC) TYPE PROC = nullptr; +#include "OpenGLAPIProc.h" +#undef OPENGL_PROC + #include #include -template -static inline bool SetProc(T * func, const char * name) -{ - T address = (T)SDL_GL_GetProcAddress(name); - if (address == nullptr) - { - return false; - } - - *func = address; - return true; -} - -#define SetupOpenGLFunction(func) \ - { \ - if (!SetProc(&func, "" #func "")) \ - { \ - return "" #func ""; \ - } \ - } - static const char * TryLoadAllProcAddresses() { - // 1.1 functions - SetupOpenGLFunction(glActiveTexture); - SetupOpenGLFunction(glBegin); - SetupOpenGLFunction(glBindTexture); - SetupOpenGLFunction(glBlendFunc); - SetupOpenGLFunction(glClear); - SetupOpenGLFunction(glClearColor); - SetupOpenGLFunction(glCullFace); - SetupOpenGLFunction(glDeleteTextures); - SetupOpenGLFunction(glDisable); - SetupOpenGLFunction(glDrawArrays); - SetupOpenGLFunction(glEnable); - SetupOpenGLFunction(glEnd); - SetupOpenGLFunction(glGenTextures); - SetupOpenGLFunction(glGetError); - SetupOpenGLFunction(glPixelStorei); - SetupOpenGLFunction(glReadPixels); - SetupOpenGLFunction(glTexImage2D); - SetupOpenGLFunction(glTexParameteri); - SetupOpenGLFunction(glViewport); - SetupOpenGLFunction(glTexSubImage3D); - SetupOpenGLFunction(glTexImage3D); - SetupOpenGLFunction(glGetIntegerv); - SetupOpenGLFunction(glGetTexImage); - - // 2.0+ functions - SetupOpenGLFunction(glAttachShader); - SetupOpenGLFunction(glBindBuffer); - SetupOpenGLFunction(glBindFragDataLocation); - SetupOpenGLFunction(glBindFramebuffer); - SetupOpenGLFunction(glBindVertexArray); - SetupOpenGLFunction(glBufferData); - SetupOpenGLFunction(glCompileShader); - SetupOpenGLFunction(glCreateProgram); - SetupOpenGLFunction(glCreateShader); - SetupOpenGLFunction(glDeleteBuffers); - SetupOpenGLFunction(glDeleteFramebuffers); - SetupOpenGLFunction(glDeleteProgram); - SetupOpenGLFunction(glDeleteShader); - SetupOpenGLFunction(glDeleteVertexArrays); - SetupOpenGLFunction(glDetachShader); - SetupOpenGLFunction(glEnableVertexAttribArray); - SetupOpenGLFunction(glFramebufferTexture2D); - SetupOpenGLFunction(glGetAttribLocation); - SetupOpenGLFunction(glGenBuffers); - SetupOpenGLFunction(glGenFramebuffers); - SetupOpenGLFunction(glGetProgramInfoLog); - SetupOpenGLFunction(glGetProgramiv); - SetupOpenGLFunction(glGetShaderInfoLog); - SetupOpenGLFunction(glGetShaderiv); - SetupOpenGLFunction(glGetUniformLocation); - SetupOpenGLFunction(glGenVertexArrays); - SetupOpenGLFunction(glLinkProgram); - SetupOpenGLFunction(glShaderSource); - SetupOpenGLFunction(glUniform1i); - SetupOpenGLFunction(glUniform1iv); - SetupOpenGLFunction(glUniform2i); - SetupOpenGLFunction(glUniform2f); - SetupOpenGLFunction(glUniform4f); - SetupOpenGLFunction(glUniform4i); - SetupOpenGLFunction(glUniform4fv); - SetupOpenGLFunction(glUseProgram); - SetupOpenGLFunction(glVertexAttribIPointer); - SetupOpenGLFunction(glVertexAttribPointer); - SetupOpenGLFunction(glDrawArraysInstanced); - SetupOpenGLFunction(glVertexAttribDivisor); - SetupOpenGLFunction(glBlendFuncSeparate); +#define OPENGL_PROC(TYPE, PROC) \ + { \ + PROC = (TYPE)SDL_GL_GetProcAddress(#PROC); \ + if (PROC == nullptr) \ + { \ + return #PROC; \ + } \ + } +#include "OpenGLAPIProc.h" +#undef OPENGL_PROC return nullptr; } diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h index 246f67d844..a328abd5d9 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h @@ -100,83 +100,9 @@ typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC )(GLenum target, GLint level, G typedef void (APIENTRYP PFNGLGETINTERGERVPROC )(GLenum pname, GLint * data); typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid * img); -#ifdef NO_EXTERN_GLAPI - // Defines the function pointers - #define GLAPI_DECL - #define GLAPI_SET = nullptr -#else - // Defines the functions as "extern" - #define GLAPI_DECL extern - #define GLAPI_SET -#endif - -// 1.1 function pointers -GLAPI_DECL PFNGLACTIVETEXTUREPROC glActiveTexture GLAPI_SET; -GLAPI_DECL PFNGLBEGINPROC glBegin GLAPI_SET; -GLAPI_DECL PFNGLBINDTEXTUREPROC glBindTexture GLAPI_SET; -GLAPI_DECL PFNGLBLENDFUNCPROC glBlendFunc GLAPI_SET; -GLAPI_DECL PFNGLCLEARPROC glClear GLAPI_SET; -GLAPI_DECL PFNGLCLEARCOLORPROC glClearColor GLAPI_SET; -GLAPI_DECL PFNGLCULLFACEPROC glCullFace GLAPI_SET; -GLAPI_DECL PFNGLDELETETEXTURESPROC glDeleteTextures GLAPI_SET; -GLAPI_DECL PFNGLDISABLEPROC glDisable GLAPI_SET; -GLAPI_DECL PFNGLDRAWARRAYSPROC glDrawArrays GLAPI_SET; -GLAPI_DECL PFNGLENABLEPROC glEnable GLAPI_SET; -GLAPI_DECL PFNGLENDPROC glEnd GLAPI_SET; -GLAPI_DECL PFNGLGENTEXTURESPROC glGenTextures GLAPI_SET; -GLAPI_DECL PFNGLGETERRORPROC glGetError GLAPI_SET; -GLAPI_DECL PFNGLPIXELSTOREIPROC glPixelStorei GLAPI_SET; -GLAPI_DECL PFNGLREADPIXELSPROC glReadPixels GLAPI_SET; -GLAPI_DECL PFNGLTEXIMAGE2DPROC glTexImage2D GLAPI_SET; -GLAPI_DECL PFNGLTEXPARAMETERIPROC glTexParameteri GLAPI_SET; -GLAPI_DECL PFNGLVIEWPORTPROC glViewport GLAPI_SET; -GLAPI_DECL PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D GLAPI_SET; -GLAPI_DECL PFNGLTEXIMAGE3DPROC glTexImage3D GLAPI_SET; -GLAPI_DECL PFNGLGETINTERGERVPROC glGetIntegerv GLAPI_SET; -GLAPI_DECL PFNGLGETTEXIMAGEPROC glGetTexImage GLAPI_SET; - -// 2.0+ function pointers -GLAPI_DECL PFNGLATTACHSHADERPROC glAttachShader GLAPI_SET; -GLAPI_DECL PFNGLBINDBUFFERPROC glBindBuffer GLAPI_SET; -GLAPI_DECL PFNGLBINDFRAGDATALOCATIONPROC glBindFragDataLocation GLAPI_SET; -GLAPI_DECL PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer GLAPI_SET; -GLAPI_DECL PFNGLBINDVERTEXARRAYPROC glBindVertexArray GLAPI_SET; -GLAPI_DECL PFNGLBUFFERDATAPROC glBufferData GLAPI_SET; -GLAPI_DECL PFNGLCOMPILESHADERPROC glCompileShader GLAPI_SET; -GLAPI_DECL PFNGLCREATEPROGRAMPROC glCreateProgram GLAPI_SET; -GLAPI_DECL PFNGLCREATESHADERPROC glCreateShader GLAPI_SET; -GLAPI_DECL PFNGLDELETEBUFFERSPROC glDeleteBuffers GLAPI_SET; -GLAPI_DECL PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers GLAPI_SET; -GLAPI_DECL PFNGLDELETEPROGRAMPROC glDeleteProgram GLAPI_SET; -GLAPI_DECL PFNGLDELETESHADERPROC glDeleteShader GLAPI_SET; -GLAPI_DECL PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays GLAPI_SET; -GLAPI_DECL PFNGLDETACHSHADERPROC glDetachShader GLAPI_SET; -GLAPI_DECL PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray GLAPI_SET; -GLAPI_DECL PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D GLAPI_SET; -GLAPI_DECL PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation GLAPI_SET; -GLAPI_DECL PFNGLGENBUFFERSPROC glGenBuffers GLAPI_SET; -GLAPI_DECL PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers GLAPI_SET; -GLAPI_DECL PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog GLAPI_SET; -GLAPI_DECL PFNGLGETPROGRAMIVPROC glGetProgramiv GLAPI_SET; -GLAPI_DECL PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog GLAPI_SET; -GLAPI_DECL PFNGLGETSHADERIVPROC glGetShaderiv GLAPI_SET; -GLAPI_DECL PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation GLAPI_SET; -GLAPI_DECL PFNGLGENVERTEXARRAYSPROC glGenVertexArrays GLAPI_SET; -GLAPI_DECL PFNGLLINKPROGRAMPROC glLinkProgram GLAPI_SET; -GLAPI_DECL PFNGLSHADERSOURCEPROC glShaderSource GLAPI_SET; -GLAPI_DECL PFNGLUNIFORM1IPROC glUniform1i GLAPI_SET; -GLAPI_DECL PFNGLUNIFORM1IVPROC glUniform1iv GLAPI_SET; -GLAPI_DECL PFNGLUNIFORM2IPROC glUniform2i GLAPI_SET; -GLAPI_DECL PFNGLUNIFORM2FPROC glUniform2f GLAPI_SET; -GLAPI_DECL PFNGLUNIFORM4FPROC glUniform4f GLAPI_SET; -GLAPI_DECL PFNGLUNIFORM4IPROC glUniform4i GLAPI_SET; -GLAPI_DECL PFNGLUNIFORM4FVPROC glUniform4fv GLAPI_SET; -GLAPI_DECL PFNGLUSEPROGRAMPROC glUseProgram GLAPI_SET; -GLAPI_DECL PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer GLAPI_SET; -GLAPI_DECL PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer GLAPI_SET; -GLAPI_DECL PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced GLAPI_SET; -GLAPI_DECL PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor GLAPI_SET; -GLAPI_DECL PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate GLAPI_SET; +#define OPENGL_PROC(TYPE, PROC) extern TYPE PROC; +#include "OpenGLAPIProc.h" +#undef OPENGL_PROC #endif /* OPENGL_NO_LINK */ diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h new file mode 100644 index 0000000000..6eb9b85508 --- /dev/null +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h @@ -0,0 +1,87 @@ +#pragma region Copyright (c) 2014-2017 OpenRCT2 Developers +/***************************************************************************** + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * OpenRCT2 is the work of many authors, a full list can be found in contributors.md + * For more information, visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * A full copy of the GNU General Public License can be found in licence.txt + *****************************************************************************/ +#pragma endregion + +#ifndef OPENGL_PROC +#error "Do not include OpenGLAPIProc.h directly. Include OpenGLAPI.h instead." +#endif + +// 1.1 function pointers +OPENGL_PROC(PFNGLACTIVETEXTUREPROC, glActiveTexture) +OPENGL_PROC(PFNGLBEGINPROC, glBegin) +OPENGL_PROC(PFNGLBINDTEXTUREPROC, glBindTexture) +OPENGL_PROC(PFNGLBLENDFUNCPROC, glBlendFunc) +OPENGL_PROC(PFNGLCLEARPROC, glClear) +OPENGL_PROC(PFNGLCLEARCOLORPROC, glClearColor) +OPENGL_PROC(PFNGLCULLFACEPROC, glCullFace) +OPENGL_PROC(PFNGLDELETETEXTURESPROC, glDeleteTextures) +OPENGL_PROC(PFNGLDISABLEPROC, glDisable) +OPENGL_PROC(PFNGLDRAWARRAYSPROC, glDrawArrays) +OPENGL_PROC(PFNGLENABLEPROC, glEnable) +OPENGL_PROC(PFNGLENDPROC, glEnd) +OPENGL_PROC(PFNGLGENTEXTURESPROC, glGenTextures) +OPENGL_PROC(PFNGLGETERRORPROC, glGetError) +OPENGL_PROC(PFNGLPIXELSTOREIPROC, glPixelStorei) +OPENGL_PROC(PFNGLREADPIXELSPROC, glReadPixels) +OPENGL_PROC(PFNGLTEXIMAGE2DPROC, glTexImage2D) +OPENGL_PROC(PFNGLTEXPARAMETERIPROC, glTexParameteri) +OPENGL_PROC(PFNGLVIEWPORTPROC, glViewport) +OPENGL_PROC(PFNGLTEXSUBIMAGE3DPROC, glTexSubImage3D) +OPENGL_PROC(PFNGLTEXIMAGE3DPROC, glTexImage3D) +OPENGL_PROC(PFNGLGETINTERGERVPROC, glGetIntegerv) +OPENGL_PROC(PFNGLGETTEXIMAGEPROC, glGetTexImage) + +// 2.0+ function pointers +OPENGL_PROC(PFNGLATTACHSHADERPROC, glAttachShader) +OPENGL_PROC(PFNGLBINDBUFFERPROC, glBindBuffer) +OPENGL_PROC(PFNGLBINDFRAGDATALOCATIONPROC, glBindFragDataLocation) +OPENGL_PROC(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer) +OPENGL_PROC(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray) +OPENGL_PROC(PFNGLBUFFERDATAPROC, glBufferData) +OPENGL_PROC(PFNGLCOMPILESHADERPROC, glCompileShader) +OPENGL_PROC(PFNGLCREATEPROGRAMPROC, glCreateProgram) +OPENGL_PROC(PFNGLCREATESHADERPROC, glCreateShader) +OPENGL_PROC(PFNGLDELETEBUFFERSPROC, glDeleteBuffers) +OPENGL_PROC(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers) +OPENGL_PROC(PFNGLDELETEPROGRAMPROC, glDeleteProgram) +OPENGL_PROC(PFNGLDELETESHADERPROC, glDeleteShader) +OPENGL_PROC(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays) +OPENGL_PROC(PFNGLDETACHSHADERPROC, glDetachShader) +OPENGL_PROC(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray) +OPENGL_PROC(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D) +OPENGL_PROC(PFNGLGETATTRIBLOCATIONPROC, glGetAttribLocation) +OPENGL_PROC(PFNGLGENBUFFERSPROC, glGenBuffers) +OPENGL_PROC(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers) +OPENGL_PROC(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog) +OPENGL_PROC(PFNGLGETPROGRAMIVPROC, glGetProgramiv) +OPENGL_PROC(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog) +OPENGL_PROC(PFNGLGETSHADERIVPROC, glGetShaderiv) +OPENGL_PROC(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation) +OPENGL_PROC(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays) +OPENGL_PROC(PFNGLLINKPROGRAMPROC, glLinkProgram) +OPENGL_PROC(PFNGLSHADERSOURCEPROC, glShaderSource) +OPENGL_PROC(PFNGLUNIFORM1IPROC, glUniform1i) +OPENGL_PROC(PFNGLUNIFORM1IVPROC, glUniform1iv) +OPENGL_PROC(PFNGLUNIFORM2IPROC, glUniform2i) +OPENGL_PROC(PFNGLUNIFORM2FPROC, glUniform2f) +OPENGL_PROC(PFNGLUNIFORM4FPROC, glUniform4f) +OPENGL_PROC(PFNGLUNIFORM4IPROC, glUniform4i) +OPENGL_PROC(PFNGLUNIFORM4FVPROC, glUniform4fv) +OPENGL_PROC(PFNGLUSEPROGRAMPROC, glUseProgram) +OPENGL_PROC(PFNGLVERTEXATTRIBIPOINTERPROC, glVertexAttribIPointer) +OPENGL_PROC(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer) +OPENGL_PROC(PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced) +OPENGL_PROC(PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttribDivisor) +OPENGL_PROC(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate)