Skip to content

Commit 383d85e

Browse files
committed
multiple fix
1 parent 4ee5a18 commit 383d85e

12 files changed

Lines changed: 69 additions & 913 deletions

src/main/cpp/egl/egl.cpp

Lines changed: 0 additions & 900 deletions
Large diffs are not rendered by default.

src/main/cpp/gl/buffer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ void glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage
560560
void* glMapBuffer(GLenum target, GLenum access) {
561561
LOG()
562562
LOG_D("glMapBuffer, target = %s, access = %s", glEnumToString(target), glEnumToString(access))
563-
if(g_gles_caps.GL_OES_mapbuffer) {
563+
if(g_gles_caps.GL_OES_mapbuffer && GLES.glMapBufferOES) {
564564
return GLES.glMapBufferOES(target, access);
565565
}
566566
if (get_binding_query(target) == 0) {
@@ -640,7 +640,7 @@ void* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitf
640640
GLboolean glUnmapBuffer(GLenum target) {
641641
LOG()
642642
LOG_D("%s(%s)", __func__, glEnumToString(target));
643-
if(g_gles_caps.GL_OES_mapbuffer)
643+
if(g_gles_caps.GL_OES_mapbuffer && GLES.glMapBufferOES)
644644
return GLES.glUnmapBuffer(target);
645645

646646
GLint buffer;

src/main/cpp/gl/getter.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,12 @@ std::string getBeforeThirdSpace(const std::string& str) {
147147
}
148148

149149
std::string getGpuName() {
150-
std::string gpuName = std::string((char *)GLES.glGetString(GL_RENDERER));
150+
char* name = (char *)GLES.glGetString(GL_RENDERER);
151+
if (!name) {
152+
LOG_E("getGpuName: Failed to get GLES.glGetString(GL_RENDERER)")
153+
return "<unknown>";
154+
}
155+
std::string gpuName = std::string(name);
151156

152157
if (gpuName.empty()) {
153158
return "<unknown>";
@@ -200,14 +205,28 @@ void set_es_version() {
200205
}
201206

202207
std::string getGLESName() {
203-
return getBeforeThirdSpace(std::string((char *)GLES.glGetString(GL_VERSION)));
208+
char* str = (char *)GLES.glGetString(GL_VERSION);
209+
if (!str) {
210+
LOG_E("getGLESName: Failed to get GLES.glGetString(GL_VERSION)")
211+
return "<unknown>";
212+
}
213+
return getBeforeThirdSpace(std::string(str));
204214
}
205215

216+
static bool gles_initialized = false;
206217
static std::string rendererString;
207218
static std::string vendorString;
208219
static std::string versionString;
220+
void init_target_gles();
209221
const GLubyte * glGetString( GLenum name ) {
210222
LOG()
223+
if (!gles_initialized) {
224+
load_libs();
225+
init_target_egl();
226+
init_target_gles();
227+
gles_initialized=true;
228+
}
229+
LOG_D("glGetString, %d", name)
211230
switch (name) {
212231
case GL_VENDOR: {
213232
if(vendorString.empty()) {

src/main/cpp/gl/glsl/glsl_for_es.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#include "cache.h"
1717
#include "../../version.h"
1818

19-
#define DEBUG 0
19+
#define DEBUG 0
2020

2121
const char* atomicCounterEmulatedWatermark = "// Non-opaque atomic uniform converted to SSBO";
2222

@@ -802,7 +802,8 @@ std::vector<unsigned int> glsl_to_spirv(GLenum shader_type, int glsl_version, co
802802
using namespace glslang;
803803
shader.setEnvInput(EShSourceGlsl, shader_language, EShClientVulkan, glsl_version);
804804
shader.setEnvClient(EShClientOpenGL, EShTargetOpenGL_450);
805-
shader.setEnvTarget(EShTargetSpv, EShTargetSpv_1_6);
805+
//shader.setEnvTarget(EShTargetSpv, EShTargetSpv_1_6);
806+
shader.setEnvTarget(EShTargetSpv, EShTargetSpv_1_5);
806807
shader.setAutoMapLocations(true);
807808
shader.setAutoMapBindings(true);
808809

src/main/cpp/gl/log.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
#define FORCE_SYNC_WITH_LOG_FILE 0
1010

11-
#define GLOBAL_DEBUG_FORCE_OFF 1
11+
#define GLOBAL_DEBUG_FORCE_OFF 0
1212

1313
#define GLOBAL_DEBUG 0
1414

src/main/cpp/gl/shader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,4 +136,4 @@ GLuint glCreateShader(GLenum shaderType) {
136136
shader_map_is_sampler_buffer_emulated[shader] = false;
137137
CHECK_GL_ERROR
138138
return shader;
139-
}
139+
}

src/main/cpp/gles/loader.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ static const char *lib_ext[] = {
3434
#ifndef NO_GBM
3535
"so.19",
3636
#endif
37+
"",
3738
"so",
3839
"so.1",
3940
"so.2",
@@ -43,6 +44,7 @@ static const char *lib_ext[] = {
4344
};
4445

4546
static const char *gles3_lib[] = {
47+
"libGLESv2.so.2",
4648
"libGLESv3_CM",
4749
"libGLESv3",
4850
nullptr
@@ -61,6 +63,7 @@ const char *EGL_ANGLE = "libEGL_angle.so";
6163

6264
void *open_lib(const char **names, const char *override) {
6365
void *lib = nullptr;
66+
LOG_D("LIBGL: loading %s (override: %s)", names[0], override ? override : "(null)")
6467

6568
char path_name[PATH_MAX + 1];
6669
int flags = RTLD_LOCAL | RTLD_NOW;
@@ -78,20 +81,42 @@ void *open_lib(const char **names, const char *override) {
7881
for (int e = 0; lib_ext[e]; e++) {
7982
snprintf(path_name, PATH_MAX, "%s%s.%s", path_prefix[p], names[i], lib_ext[e]);
8083
if ((lib = dlopen(path_name, flags))) {
84+
LOG_D("LIBGL:loaded: %s\n", path_name)
8185
return lib;
8286
}
8387
}
8488
}
8589
}
90+
if (lib == nullptr) {
91+
LOG_D("LIBGL:failed to load")
92+
} else {
93+
LOG_D("LIBGL:loaded")
94+
}
8695
return lib;
8796
}
8897

8998
void load_libs() {
9099
#ifndef __APPLE__
91100
const char *gles_override = global_settings.angle == AngleMode::Enabled ? GLES_ANGLE : nullptr;
92101
const char *egl_override = global_settings.angle == AngleMode::Enabled ? EGL_ANGLE : nullptr;
102+
#ifndef __ANDROID__
93103
gles = open_lib(gles3_lib, gles_override);
94104
egl = open_lib(egl_lib, egl_override);
105+
#else
106+
void* gles_lib = dlopen("libGLESv2.so", RTLD_LAZY | RTLD_GLOBAL);
107+
if (!gles_lib) {
108+
gles_lib = dlopen("libGLESv2.so.2", RTLD_LAZY | RTLD_GLOBAL);
109+
}
110+
111+
if (!gles_lib) {
112+
fprintf(stderr, "GLES load failed: %s\n", dlerror());
113+
}
114+
gles = gles_lib;
115+
egl = dlopen("libEGL.so", RTLD_LAZY);
116+
if (!egl) {
117+
LOG_E("LIBGL: failed to load libEGL.so")
118+
}
119+
#endif
95120
#else
96121
gles = (void*)(~(uintptr_t)0);
97122
egl = (void*)(~(uintptr_t)0);

src/main/cpp/gles/loader.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ void load_libs();
2424
#define INIT_GLES_FUNC(name) \
2525
{ \
2626
LOG_D("INIT_GLES_FUNC(%s)", #name); \
27-
GLES.name = (name##_PTR)proc_address(gles, #name); \
27+
GLES.name = (name##_PTR)proc_address(gles, #name); \
2828
if (GLES.name == NULL)\
29-
LOG_W("Error: GLES function " #name " is NULL\n"); \
29+
LOG_W("Error: GLES function " #name " is NULL\n"); \
3030
}
3131
#else
3232
#define INIT_GLES_FUNC(name) \
3333
{ \
34-
GLES.name = (name##_PTR)egl_eglGetProcAddress(#name); \
34+
GLES.name = (name##_PTR)proc_address(gles, #name); \
3535
}
3636
#endif
3737

src/main/cpp/glx/lookup.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,28 @@ std::string handle_multidraw_func_name(std::string name) {
4747
return namestr;
4848
}
4949

50+
51+
void* get_self_handle() {
52+
static void* handle = NULL;
53+
if (!handle) {
54+
Dl_info info;
55+
dladdr((void*)&get_self_handle, &info);
56+
handle = dlopen(info.dli_fname, RTLD_LAZY | RTLD_NOLOAD);
57+
}
58+
return handle;
59+
}
60+
5061
__GLXextFuncPtr glXGetProcAddress(const GLubyte * name) {
5162
LOG()
5263
std::string real_func_name = handle_multidraw_func_name(std::string((const char*)name));
5364
#ifdef __APPLE__
5465
return dlsym((void*)(~(uintptr_t)0), real_func_name.c_str());
5566
#else
5667

68+
void* self = get_self_handle();
5769
void* proc = nullptr;
5870

59-
proc = dlsym(RTLD_DEFAULT, real_func_name.c_str());
71+
proc = dlsym(self, real_func_name.c_str());
6072

6173
if (!proc) {
6274
LOG_W("Failed to get OpenGL function: %s", real_func_name.c_str())

src/main/cpp/libraries/linux_amd64/libspirv-cross-c-shared.so

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)