Skip to content

Commit 7a60ae8

Browse files
committed
[Feat] (FSR1): Implement FSR1.
1 parent efa20aa commit 7a60ae8

22 files changed

Lines changed: 6569 additions & 852 deletions

README.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,14 @@ Please see [LICENSE](https://github.com/MobileGL-Dev/MobileGlues/blob/main/LICEN
4444

4545
# Third party components
4646

47-
**SPIRV-Cross** by **KhronosGroup**: [github](https://github.com/KhronosGroup/SPIRV-Cross)
47+
**SPIRV-Cross** by **KhronosGroup** - [Apache License 2.0](https://github.com/KhronosGroup/SPIRV-Cross/blob/master/LICENSE): [github](https://github.com/KhronosGroup/SPIRV-Cross)
4848

49-
**glslang** by **KhronosGroup**: [github](https://github.com/KhronosGroup/glslang)
49+
**glslang** by **KhronosGroup** - [Various Licenses](https://github.com/KhronosGroup/glslang/blob/main/LICENSE.txt): [github](https://github.com/KhronosGroup/glslang)
5050

51-
**GlslOptimizerV2** by **aiekick**: [github](https://github.com/aiekick/GlslOptimizerV2)
51+
**GlslOptimizerV2** by **aiekick** - [Apache License 2.0](https://github.com/aiekick/GlslOptimizerV2/blob/master/LICENSE): [github](https://github.com/aiekick/GlslOptimizerV2)
5252

53-
**cJSON** by **DaveGamble**: [github](https://github.com/DaveGamble/cJSON)
53+
**cJSON** by **DaveGamble** - [MIT License](https://github.com/DaveGamble/cJSON/blob/master/LICENSE): [github](https://github.com/DaveGamble/cJSON)
54+
55+
**OpenGL Mathematics (*GLM*)** by **G-Truc Creation** - [The Happy Bunny License](https://github.com/g-truc/glm/blob/master/copying.txt): [github](https://github.com/g-truc/glm)
56+
57+
**FidelityFX-FSR** by **AMD** - [MIT License](https://github.com/GPUOpen-Effects/FidelityFX-FSR/blob/master/license.txt): [github](https://github.com/GPUOpen-Effects/FidelityFX-FSR)

src/main/cpp/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,11 @@ add_library(${CMAKE_PROJECT_NAME} SHARED
4747
gl/ExtWrappers/MultiBindWrapper.cpp
4848
gl/glsl/glsl_for_es.cpp
4949
gl/glsl/cache.cpp
50+
gl/FSR1/FSR1.cpp
5051

5152
gl/vertexattrib.cpp
5253
glx/lookup.cpp
53-
egl/egl.c
54+
egl/egl.cpp
5455
egl/loader.cpp
5556
gles/loader.cpp
5657
config/cJSON.c
@@ -111,7 +112,6 @@ else()
111112
${CMAKE_SOURCE_DIR}/libraries/${ANDROID_ABI}/libSPVRemapper.a
112113
android
113114
log
114-
EGL
115115
)
116116
endif()
117117

src/main/cpp/config/gpu_utils.cpp

Lines changed: 106 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,65 +11,128 @@
1111
#include <EGL/egl.h>
1212
#include <cstring>
1313
#include <optional>
14-
15-
static const char *gles3_lib[] = {
16-
"libGLESv3_CM",
17-
"libGLESv3",
18-
nullptr
14+
typedef const char* cstr;
15+
static const cstr gles3_lib[] = {
16+
"libGLESv3_CM",
17+
"libGLESv3",
18+
nullptr
19+
};
20+
static const cstr egl_libs[] = {
21+
"libEGL",
22+
nullptr
1923
};
20-
static const char *vk_lib[] = {
21-
"libvulkan",
22-
nullptr
24+
static const cstr vk_lib[] = {
25+
"libvulkan",
26+
nullptr
2327
};
2428

29+
namespace egl_func {
30+
PFNEGLGETDISPLAYPROC eglGetDisplay = nullptr;
31+
PFNEGLINITIALIZEPROC eglInitialize = nullptr;
32+
PFNEGLCHOOSECONFIGPROC eglChooseConfig = nullptr;
33+
PFNEGLCREATECONTEXTPROC eglCreateContext = nullptr;
34+
PFNEGLMAKECURRENTPROC eglMakeCurrent = nullptr;
35+
PFNEGLDESTROYCONTEXTPROC eglDestroyContext = nullptr;
36+
PFNEGLTERMINATEPROC eglTerminate = nullptr;
37+
}
2538

26-
std::string getGPUInfo() {
27-
EGLDisplay eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
28-
if (eglDisplay == EGL_NO_DISPLAY || eglInitialize(eglDisplay, nullptr, nullptr) != EGL_TRUE)
29-
return "";
30-
31-
EGLint egl_attributes[] = {
32-
EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8,
33-
EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 24, EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
34-
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE
35-
};
39+
template <typename T>
40+
static void* open_lib(const T names[], const char* override) {
41+
void* handle = nullptr;
42+
int flags = RTLD_LOCAL | RTLD_NOW;
43+
if (override) {
44+
handle = dlopen(override, flags);
45+
if (handle) return handle;
46+
}
47+
for (int i = 0; names[i]; ++i) {
48+
handle = dlopen(names[i], flags);
49+
if (handle) break;
50+
}
51+
return handle;
52+
}
3653

37-
EGLint num_configs = 0;
38-
if (eglChooseConfig(eglDisplay, egl_attributes, nullptr, 0, &num_configs) != EGL_TRUE || num_configs == 0) {
39-
eglTerminate(eglDisplay);
40-
return "";
54+
static bool loadEGLFunctions(void* lib) {
55+
if (!lib) return false;
56+
egl_func::eglGetDisplay = (PFNEGLGETDISPLAYPROC)dlsym(lib, "eglGetDisplay");
57+
egl_func::eglInitialize = (PFNEGLINITIALIZEPROC)dlsym(lib, "eglInitialize");
58+
egl_func::eglChooseConfig = (PFNEGLCHOOSECONFIGPROC)dlsym(lib, "eglChooseConfig");
59+
egl_func::eglCreateContext = (PFNEGLCREATECONTEXTPROC)dlsym(lib, "eglCreateContext");
60+
egl_func::eglMakeCurrent = (PFNEGLMAKECURRENTPROC)dlsym(lib, "eglMakeCurrent");
61+
egl_func::eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC)dlsym(lib, "eglDestroyContext");
62+
egl_func::eglTerminate = (PFNEGLTERMINATEPROC)dlsym(lib, "eglTerminate");
63+
64+
return egl_func::eglGetDisplay && egl_func::eglInitialize && egl_func::eglChooseConfig &&
65+
egl_func::eglCreateContext && egl_func::eglMakeCurrent &&
66+
egl_func::eglDestroyContext && egl_func::eglTerminate;
67+
}
68+
69+
std::string getGPUInfo() {
70+
void* egllib = open_lib(egl_libs, nullptr);
71+
if (!loadEGLFunctions(egllib)) {
72+
if (egllib) dlclose(egllib);
73+
return std::string();
4174
}
4275

43-
EGLConfig eglConfig;
44-
eglChooseConfig(eglDisplay, egl_attributes, &eglConfig, 1, &num_configs);
76+
EGLDisplay display = egl_func::eglGetDisplay(EGL_DEFAULT_DISPLAY);
77+
if (display == EGL_NO_DISPLAY) {
78+
egl_func::eglTerminate(display);
79+
dlclose(egllib);
80+
return std::string();
81+
}
82+
if (egl_func::eglInitialize(display, nullptr, nullptr) != EGL_TRUE) {
83+
egl_func::eglTerminate(display);
84+
dlclose(egllib);
85+
return std::string();
86+
}
4587

46-
const EGLint egl_context_attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE };
47-
EGLContext context = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, egl_context_attributes);
48-
if (context == EGL_NO_CONTEXT) {
49-
eglTerminate(eglDisplay);
50-
return "";
88+
const EGLint attribs[] = {
89+
EGL_BLUE_SIZE, 8,
90+
EGL_GREEN_SIZE, 8,
91+
EGL_RED_SIZE, 8,
92+
EGL_ALPHA_SIZE, 8,
93+
EGL_DEPTH_SIZE, 24,
94+
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
95+
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
96+
EGL_NONE
97+
};
98+
EGLint numConfigs = 0;
99+
if (egl_func::eglChooseConfig(display, attribs, nullptr, 0, &numConfigs) != EGL_TRUE || numConfigs == 0) {
100+
egl_func::eglTerminate(display);
101+
dlclose(egllib);
102+
return std::string();
103+
}
104+
EGLConfig config;
105+
egl_func::eglChooseConfig(display, attribs, &config, 1, &numConfigs);
106+
107+
const EGLint ctxAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE };
108+
EGLContext ctx = egl_func::eglCreateContext(display, config, EGL_NO_CONTEXT, ctxAttribs);
109+
if (ctx == EGL_NO_CONTEXT) {
110+
egl_func::eglTerminate(display);
111+
dlclose(egllib);
112+
return std::string();
51113
}
52114

53-
if (eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context) != EGL_TRUE) {
54-
eglDestroyContext(eglDisplay, context);
55-
eglTerminate(eglDisplay);
56-
return "";
115+
if (egl_func::eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, ctx) != EGL_TRUE) {
116+
egl_func::eglDestroyContext(display, ctx);
117+
egl_func::eglTerminate(display);
118+
dlclose(egllib);
119+
return std::string();
57120
}
58121

122+
void* glesLib = open_lib(gles3_lib, nullptr);
59123
std::string renderer;
60-
void* lib = open_lib(gles3_lib, nullptr);
61-
if (lib) {
62-
GLES.glGetString = (const GLubyte * (*)( GLenum ))dlsym(lib, "glGetString");
63-
if (GLES.glGetString) {
64-
renderer = (const char*)GLES.glGetString(GL_RENDERER);
124+
if (glesLib) {
125+
auto glGetString = (const GLubyte * (*)(GLenum))dlsym(glesLib, "glGetString");
126+
if (glGetString) {
127+
renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER));
65128
}
129+
dlclose(glesLib);
66130
}
67131

68-
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
69-
eglDestroyContext(eglDisplay, context);
70-
eglTerminate(eglDisplay);
71-
72-
dlclose(lib);
132+
egl_func::eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
133+
egl_func::eglDestroyContext(display, ctx);
134+
egl_func::eglTerminate(display);
135+
dlclose(egllib);
73136

74137
return renderer;
75138
}

src/main/cpp/config/settings.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ void init_settings() {
8888

8989
if (fclVersion == 0 && zlVersion == 0 && pgwVersion == 0 && !var) {
9090
LOG_V("Unsupported launcher detected, force using default config.")
91-
angleConfig = AngleConfig::DisableIfPossible;
91+
angleConfig = AngleConfig::DisableIfPossible;
9292
noErrorConfig = NoErrorConfig::Auto;
9393
enableExtGL43 = false;
9494
enableExtComputeShader = false;
@@ -145,8 +145,8 @@ void init_settings() {
145145
global_settings.buffer_coherent_as_flush = (global_settings.angle == AngleMode::Disabled);
146146

147147
if (global_settings.angle == AngleMode::Enabled) {
148-
setenv("LIBGL_GLES", "libGLESv2_angle.so", 1);
149-
setenv("LIBGL_EGL", "libEGL_angle.so", 1);
148+
//setenv("LIBGL_GLES", "libGLESv2_angle.so", 1);
149+
//setenv("LIBGL_EGL", "libEGL_angle.so", 1);
150150
}
151151

152152
switch (noErrorConfig) {

src/main/cpp/egl/egl.c

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)