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
This commit is contained in:
WaluigiWare64
2021-01-26 13:19:32 +00:00
committed by GitHub
parent 54b1a752d4
commit ab222ab135
9 changed files with 24 additions and 147 deletions

View File

@ -23,7 +23,7 @@ jobs:
run: | run: |
rm -rf /usr/local/bin/2to3 # Temporary workaround suggested here - https://github.com/actions/virtual-environments/issues/2322#issuecomment-749211076 rm -rf /usr/local/bin/2to3 # Temporary workaround suggested here - https://github.com/actions/virtual-environments/issues/2322#issuecomment-749211076
brew update brew update
brew install sdl2 qt@5 libslirp libarchive brew install sdl2 qt@5 libslirp libarchive libepoxy
- name: Create build environment - name: Create build environment
run: mkdir ${{runner.workspace}}/build run: mkdir ${{runner.workspace}}/build
- name: Configure - name: Configure

View File

@ -36,7 +36,7 @@ jobs:
sudo mv /etc/apt/sources.list{.new,} sudo mv /etc/apt/sources.list{.new,}
sudo apt update sudo apt update
sudo apt install aptitude 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 - name: Create build environment
run: mkdir ${{runner.workspace}}/build run: mkdir ${{runner.workspace}}/build
- name: Configure - name: Configure

View File

@ -19,7 +19,7 @@ jobs:
run: | run: |
sudo rm -f /etc/apt/sources.list.d/dotnetdev.list /etc/apt/sources.list.d/microsoft-prod.list sudo rm -f /etc/apt/sources.list.d/dotnetdev.list /etc/apt/sources.list.d/microsoft-prod.list
sudo apt update 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 - name: Create build environment
run: mkdir ${{runner.workspace}}/build run: mkdir ${{runner.workspace}}/build
- name: Configure - name: Configure

View File

@ -24,7 +24,7 @@ jobs:
choco install msys2 choco install msys2
C:\tools\msys64\usr\bin\bash.exe -lc "pacman -Syuq --noconfirm" C:\tools\msys64\usr\bin\bash.exe -lc "pacman -Syuq --noconfirm"
- name: Install dependencies - 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 - name: Create build environment
run: | run: |
New-Item -ItemType directory -Path ${{runner.workspace}}\melonDS\build New-Item -ItemType directory -Path ${{runner.workspace}}\melonDS\build

View File

@ -38,7 +38,7 @@ As for the rest, the interface should be pretty straightforward. If you have a q
* Install dependencies: * Install dependencies:
```sh ```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: * 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 3. Update the packages using `pacman -Syu` and reopen the terminal if it asks you to
#### Dynamic builds (with DLLs) #### 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 5. Run the following commands
```bash ```bash
git clone https://github.com/Arisotura/melonDS.git 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. If everything went well, melonDS and the libraries it needs should now be in the `dist` folder.
#### Static builds (without DLLs, standalone executable) #### 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 5. Run the following commands
```bash ```bash
git clone https://github.com/Arisotura/melonDS.git 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: ### macOS:
1. Install the [Homebrew Package Manager](https://brew.sh) 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: 3. Compile:
```zsh ```zsh
git clone https://github.com/Arisotura/melonDS.git 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 melonDS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.

View File

@ -106,14 +106,16 @@ if (APPLE)
endif() endif()
if (ENABLE_OGLRENDERER) 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) if (WIN32)
target_link_libraries(core ole32 comctl32 ws2_32 opengl32) target_link_libraries(core ole32 comctl32 ws2_32 ${EPOXY_LIBRARIES})
elseif (APPLE) elseif (APPLE)
target_link_libraries(core ${OPENGL_gl_LIBRARY}) target_link_libraries(core ${EPOXY_LIBRARIES})
else() else()
target_include_directories(core PRIVATE ${OPENGL_INCLUDE_DIR} ${OPENGL_EGL_INCLUDE_DIRS}) target_link_libraries(core rt ${EPOXY_LIBRARIES})
target_link_libraries(core rt OpenGL::GL ${OPENGL_egl_LIBRARY})
endif() endif()
else() else()
if (WIN32) if (WIN32)

View File

@ -22,16 +22,6 @@
namespace OpenGL 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) bool BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name)
{ {
int len; int len;

View File

@ -22,131 +22,15 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
// TODO: different includes for each platform #include <epoxy/gl.h>
#ifdef __APPLE__
#include <OpenGL/gl3.h>
#include <OpenGL/gl3ext.h>
#else
#include <GL/gl.h>
#include <GL/glext.h>
#endif
#include "Platform.h" #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 namespace OpenGL
{ {
DO_PROCLIST(DECLPROC_EXT);
bool Init();
bool BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name); bool BuildShaderProgram(const char* vs, const char* fs, GLuint* ids, const char* name);
bool LinkShaderProgram(GLuint* ids); bool LinkShaderProgram(GLuint* ids);
void DeleteShaderProgram(GLuint* ids); void DeleteShaderProgram(GLuint* ids);

View File

@ -44,6 +44,10 @@
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#ifdef OGLRENDERER_ENABLED
#include "OpenGLSupport.h"
#endif
#include "main.h" #include "main.h"
#include "Input.h" #include "Input.h"
#include "CheatsDialog.h" #include "CheatsDialog.h"
@ -62,9 +66,6 @@
#include "NDS.h" #include "NDS.h"
#include "GBACart.h" #include "GBACart.h"
#ifdef OGLRENDERER_ENABLED
#include "OpenGLSupport.h"
#endif
#include "GPU.h" #include "GPU.h"
#include "SPU.h" #include "SPU.h"
#include "Wifi.h" #include "Wifi.h"
@ -357,7 +358,7 @@ void EmuThread::run()
if (hasOGL) if (hasOGL)
{ {
oglContext->makeCurrent(oglSurface); oglContext->makeCurrent(oglSurface);
videoRenderer = OpenGL::Init() ? Config::_3DRenderer : 0; videoRenderer = Config::_3DRenderer;
} }
else else
#endif #endif
@ -423,7 +424,7 @@ void EmuThread::run()
if (hasOGL) if (hasOGL)
{ {
oglContext->makeCurrent(oglSurface); oglContext->makeCurrent(oglSurface);
videoRenderer = OpenGL::Init() ? Config::_3DRenderer : 0; videoRenderer = Config::_3DRenderer;
} }
else else
#endif #endif