From ab222ab135a76c559ef63768e8f90eca99973881 Mon Sep 17 00:00:00 2001 From: WaluigiWare64 <68647953+WaluigiWare64@users.noreply.github.com> Date: Tue, 26 Jan 2021 13:19:32 +0000 Subject: [PATCH] Use libepoxy to load in OpenGL functions (#960) * Use libepoxy to load in OpenGL functions Prevents having to load them in manually * Install libepoxy in the CI * Do not link OpenGL libraries, libepoxy opens them itself * Add libepoxy to build instructions --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-ubuntu-aarch64.yml | 2 +- .github/workflows/build-ubuntu.yml | 2 +- .github/workflows/build-windows.yml | 2 +- README.md | 10 +- src/CMakeLists.txt | 12 ++- src/OpenGLSupport.cpp | 10 -- src/OpenGLSupport.h | 120 +-------------------- src/frontend/qt_sdl/main.cpp | 11 +- 9 files changed, 24 insertions(+), 147 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 2174e7e1..e390722c 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -23,7 +23,7 @@ jobs: run: | rm -rf /usr/local/bin/2to3 # Temporary workaround suggested here - https://github.com/actions/virtual-environments/issues/2322#issuecomment-749211076 brew update - brew install sdl2 qt@5 libslirp libarchive + brew install sdl2 qt@5 libslirp libarchive libepoxy - name: Create build environment run: mkdir ${{runner.workspace}}/build - name: Configure diff --git a/.github/workflows/build-ubuntu-aarch64.yml b/.github/workflows/build-ubuntu-aarch64.yml index 6ea78ea8..9186263c 100644 --- a/.github/workflows/build-ubuntu-aarch64.yml +++ b/.github/workflows/build-ubuntu-aarch64.yml @@ -36,7 +36,7 @@ jobs: sudo mv /etc/apt/sources.list{.new,} sudo apt update sudo apt install aptitude - sudo aptitude install -y {gcc-10,g++-10,pkg-config}-aarch64-linux-gnu libsdl2-dev:arm64 qtbase5-dev:arm64 libslirp-dev:arm64 libarchive-dev:arm64 + sudo aptitude install -y {gcc-10,g++-10,pkg-config}-aarch64-linux-gnu libsdl2-dev:arm64 qtbase5-dev:arm64 libslirp-dev:arm64 libarchive-dev:arm64 libepoxy-dev:arm64 - name: Create build environment run: mkdir ${{runner.workspace}}/build - name: Configure diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index d2070d8b..1c674756 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -19,7 +19,7 @@ jobs: run: | sudo rm -f /etc/apt/sources.list.d/dotnetdev.list /etc/apt/sources.list.d/microsoft-prod.list sudo apt update - sudo apt install cmake libcurl4-gnutls-dev libpcap0.8-dev libsdl2-dev qt5-default libslirp0 libslirp-dev libarchive-dev --allow-downgrades + sudo apt install cmake libcurl4-gnutls-dev libpcap0.8-dev libsdl2-dev qt5-default libslirp0 libslirp-dev libarchive-dev libepoxy-dev --allow-downgrades - name: Create build environment run: mkdir ${{runner.workspace}}/build - name: Configure diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index ed302a82..bcac832d 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -24,7 +24,7 @@ jobs: choco install msys2 C:\tools\msys64\usr\bin\bash.exe -lc "pacman -Syuq --noconfirm" - name: Install dependencies - run: C:\tools\msys64\usr\bin\bash.exe -lc "pacman -Sq --noconfirm git make mingw-w64-x86_64-{cmake,mesa,SDL2,qt5-static,libslirp,libarchive,toolchain}" + run: C:\tools\msys64\usr\bin\bash.exe -lc "pacman -Sq --noconfirm git make mingw-w64-x86_64-{cmake,mesa,SDL2,qt5-static,libslirp,libarchive,libepoxy,toolchain}" - name: Create build environment run: | New-Item -ItemType directory -Path ${{runner.workspace}}\melonDS\build diff --git a/README.md b/README.md index ef9ab12a..4c7b2c43 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ As for the rest, the interface should be pretty straightforward. If you have a q * Install dependencies: ```sh -sudo apt-get install cmake libcurl4-gnutls-dev libpcap0.8-dev libsdl2-dev qtbase5-dev qtdeclarative5-dev libslirp-dev libarchive-dev +sudo apt-get install cmake libcurl4-gnutls-dev libpcap0.8-dev libsdl2-dev qtbase5-dev qtdeclarative5-dev libslirp-dev libarchive-dev libepoxy-dev ``` * Compile: @@ -57,7 +57,7 @@ make -j$(nproc --all) 3. Update the packages using `pacman -Syu` and reopen the terminal if it asks you to #### Dynamic builds (with DLLs) -4. Install dependencies: `pacman -S git make mingw-w64-x86_64-{cmake,mesa,SDL2,toolchain,qt5,libslirp,libarchive}` +4. Install dependencies: `pacman -S git make mingw-w64-x86_64-{cmake,mesa,SDL2,toolchain,qt5,libslirp,libarchive,libepoxy}` 5. Run the following commands ```bash git clone https://github.com/Arisotura/melonDS.git @@ -71,7 +71,7 @@ make -j$(nproc --all) If everything went well, melonDS and the libraries it needs should now be in the `dist` folder. #### Static builds (without DLLs, standalone executable) -4. Install dependencies: `pacman -S git make mingw-w64-x86_64-{cmake,mesa,SDL2,toolchain,qt5-static,libslirp,libarchive}` +4. Install dependencies: `pacman -S git make mingw-w64-x86_64-{cmake,mesa,SDL2,toolchain,qt5-static,libslirp,libarchive,libepoxy}` 5. Run the following commands ```bash git clone https://github.com/Arisotura/melonDS.git @@ -86,7 +86,7 @@ If everything went well, melonDS should now be in the `dist` folder. ### macOS: 1. Install the [Homebrew Package Manager](https://brew.sh) -2. Install dependencies: `brew install git pkg-config cmake sdl2 qt@5 libslirp libarchive` +2. Install dependencies: `brew install git pkg-config cmake sdl2 qt@5 libslirp libarchive libepoxy` 3. Compile: ```zsh git clone https://github.com/Arisotura/melonDS.git @@ -129,4 +129,4 @@ If everything went well, melonDS.app should now be in the `dist` folder. melonDS 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. \ No newline at end of file +(at your option) any later version. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ea350e82..3bcecbcd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -106,14 +106,16 @@ if (APPLE) endif() if (ENABLE_OGLRENDERER) - find_package(OpenGL REQUIRED) + find_package(PkgConfig REQUIRED) + pkg_check_modules(EPOXY REQUIRED epoxy) + + target_include_directories(core PRIVATE ${EPOXY_INCLUDE_DIRS}) if (WIN32) - target_link_libraries(core ole32 comctl32 ws2_32 opengl32) + target_link_libraries(core ole32 comctl32 ws2_32 ${EPOXY_LIBRARIES}) elseif (APPLE) - target_link_libraries(core ${OPENGL_gl_LIBRARY}) + target_link_libraries(core ${EPOXY_LIBRARIES}) else() - target_include_directories(core PRIVATE ${OPENGL_INCLUDE_DIR} ${OPENGL_EGL_INCLUDE_DIRS}) - target_link_libraries(core rt OpenGL::GL ${OPENGL_egl_LIBRARY}) + target_link_libraries(core rt ${EPOXY_LIBRARIES}) endif() else() if (WIN32) diff --git a/src/OpenGLSupport.cpp b/src/OpenGLSupport.cpp index 27b14803..01fa9d86 100644 --- a/src/OpenGLSupport.cpp +++ b/src/OpenGLSupport.cpp @@ -22,16 +22,6 @@ namespace OpenGL { -DO_PROCLIST(DECLPROC); - - -bool Init() -{ - DO_PROCLIST(LOADPROC); - - return true; -} - bool BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name) { int len; diff --git a/src/OpenGLSupport.h b/src/OpenGLSupport.h index 44c511f5..3533d60c 100644 --- a/src/OpenGLSupport.h +++ b/src/OpenGLSupport.h @@ -22,131 +22,15 @@ #include #include -// TODO: different includes for each platform -#ifdef __APPLE__ - #include - #include -#else - #include - #include -#endif +#include + #include "Platform.h" -// here, have some macro magic -// we at the melonDS company really love macro magic -// also, suggestion to the fine folks who write the OpenGL headers: -// pls make the type names follow the same capitalization as their -// matching function names, so this is more convenient to deal with - -#define DECLPROC(type, name) \ - PFN##type##PROC name ; - -#define DECLPROC_EXT(type, name) \ - extern PFN##type##PROC name ; - -#define LOADPROC(type, name) \ - name = (PFN##type##PROC)Platform::GL_GetProcAddress(#name); \ - if (!name) { printf("OpenGL: " #name " not found\n"); return false; } - - -// if you need more OpenGL functions, add them to the macronator here - - -#ifdef __WIN32__ - -#define DO_PROCLIST_1_3(func) \ - func(GLACTIVETEXTURE, glActiveTexture); \ - func(GLBLENDCOLOR, glBlendColor); \ - -#else - -#define DO_PROCLIST_1_3(func) - -#endif - -#ifdef __APPLE__ - -#define DO_PROCLIST(func) - -#else - -#define DO_PROCLIST(func) \ - DO_PROCLIST_1_3(func) \ - \ - func(GLGENFRAMEBUFFERS, glGenFramebuffers); \ - func(GLDELETEFRAMEBUFFERS, glDeleteFramebuffers); \ - func(GLBINDFRAMEBUFFER, glBindFramebuffer); \ - func(GLFRAMEBUFFERTEXTURE, glFramebufferTexture); \ - func(GLBLITFRAMEBUFFER, glBlitFramebuffer); \ - func(GLCHECKFRAMEBUFFERSTATUS, glCheckFramebufferStatus); \ - \ - func(GLGENBUFFERS, glGenBuffers); \ - func(GLDELETEBUFFERS, glDeleteBuffers); \ - func(GLBINDBUFFER, glBindBuffer); \ - func(GLMAPBUFFER, glMapBuffer); \ - func(GLMAPBUFFERRANGE, glMapBufferRange); \ - func(GLUNMAPBUFFER, glUnmapBuffer); \ - func(GLBUFFERDATA, glBufferData); \ - func(GLBUFFERSUBDATA, glBufferSubData); \ - func(GLBINDBUFFERBASE, glBindBufferBase); \ - \ - func(GLGENVERTEXARRAYS, glGenVertexArrays); \ - func(GLDELETEVERTEXARRAYS, glDeleteVertexArrays); \ - func(GLBINDVERTEXARRAY, glBindVertexArray); \ - func(GLENABLEVERTEXATTRIBARRAY, glEnableVertexAttribArray); \ - func(GLDISABLEVERTEXATTRIBARRAY, glDisableVertexAttribArray); \ - func(GLVERTEXATTRIBPOINTER, glVertexAttribPointer); \ - func(GLVERTEXATTRIBIPOINTER, glVertexAttribIPointer); \ - func(GLBINDATTRIBLOCATION, glBindAttribLocation); \ - func(GLBINDFRAGDATALOCATION, glBindFragDataLocation); \ - \ - func(GLCREATESHADER, glCreateShader); \ - func(GLSHADERSOURCE, glShaderSource); \ - func(GLCOMPILESHADER, glCompileShader); \ - func(GLCREATEPROGRAM, glCreateProgram); \ - func(GLATTACHSHADER, glAttachShader); \ - func(GLLINKPROGRAM, glLinkProgram); \ - func(GLUSEPROGRAM, glUseProgram); \ - func(GLGETSHADERIV, glGetShaderiv); \ - func(GLGETSHADERINFOLOG, glGetShaderInfoLog); \ - func(GLGETPROGRAMIV, glGetProgramiv); \ - func(GLGETPROGRAMINFOLOG, glGetProgramInfoLog); \ - func(GLDELETESHADER, glDeleteShader); \ - func(GLDELETEPROGRAM, glDeleteProgram); \ - \ - func(GLUNIFORM1I, glUniform1i); \ - func(GLUNIFORM1UI, glUniform1ui); \ - func(GLUNIFORM2I, glUniform2i); \ - func(GLUNIFORM4UI, glUniform4ui); \ - func(GLUNIFORMBLOCKBINDING, glUniformBlockBinding); \ - func(GLGETUNIFORMLOCATION, glGetUniformLocation); \ - func(GLGETUNIFORMBLOCKINDEX, glGetUniformBlockIndex); \ - \ - func(GLFENCESYNC, glFenceSync); \ - func(GLDELETESYNC, glDeleteSync); \ - func(GLWAITSYNC, glWaitSync); \ - func(GLCLIENTWAITSYNC, glClientWaitSync); \ - \ - func(GLDRAWBUFFERS, glDrawBuffers); \ - \ - func(GLBLENDFUNCSEPARATE, glBlendFuncSeparate); \ - func(GLBLENDEQUATIONSEPARATE, glBlendEquationSeparate); \ - \ - func(GLCOLORMASKI, glColorMaski); \ - \ - func(GLGETSTRINGI, glGetStringi); \ - -#endif - namespace OpenGL { -DO_PROCLIST(DECLPROC_EXT); - -bool Init(); - bool BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name); bool LinkShaderProgram(GLuint* ids); void DeleteShaderProgram(GLuint* ids); diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index be718ab9..527a5070 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -44,6 +44,10 @@ #include +#ifdef OGLRENDERER_ENABLED +#include "OpenGLSupport.h" +#endif + #include "main.h" #include "Input.h" #include "CheatsDialog.h" @@ -62,9 +66,6 @@ #include "NDS.h" #include "GBACart.h" -#ifdef OGLRENDERER_ENABLED -#include "OpenGLSupport.h" -#endif #include "GPU.h" #include "SPU.h" #include "Wifi.h" @@ -357,7 +358,7 @@ void EmuThread::run() if (hasOGL) { oglContext->makeCurrent(oglSurface); - videoRenderer = OpenGL::Init() ? Config::_3DRenderer : 0; + videoRenderer = Config::_3DRenderer; } else #endif @@ -423,7 +424,7 @@ void EmuThread::run() if (hasOGL) { oglContext->makeCurrent(oglSurface); - videoRenderer = OpenGL::Init() ? Config::_3DRenderer : 0; + videoRenderer = Config::_3DRenderer; } else #endif