Skip to content

Commit b6db0d7

Browse files
committed
Fix GL backend crash on arm64 linux
1 parent 61ddab1 commit b6db0d7

9 files changed

Lines changed: 3413 additions & 62 deletions

File tree

pathfinder/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ if (PATHFINDER_BACKEND_VULKAN)
88
endif ()
99

1010
if (PATHFINDER_BACKEND_OPENGL)
11-
file(GLOB PF_SOURCE_FILES ${PF_SOURCE_FILES} gpu/gl/*.cpp ../third_party/glad/src/gl.c)
11+
file(GLOB PF_SOURCE_FILES ${PF_SOURCE_FILES} gpu/gl/*.cpp)
12+
if (CMAKE_SYSTEM_PROCESSOR MATCHES "arm|aarch64")
13+
file(GLOB PF_SOURCE_FILES ${PF_SOURCE_FILES} ../third_party/glad/src/gles2.c)
14+
else ()
15+
file(GLOB PF_SOURCE_FILES ${PF_SOURCE_FILES} ../third_party/glad/src/gl.c)
16+
endif ()
1217
endif ()
1318

1419
# Compile as static library.

pathfinder/config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
// #define PATHFINDER_MINIMUM_SHADER_VERSION_SUPPORT
3434

3535
// WebGL only supports ES3.0 shaders.
36-
#if defined(PATHFINDER_EMSCRIPTEN) || defined(PATHFINDER_ANDROID)
36+
#if defined(PATHFINDER_EMSCRIPTEN) || defined(PATHFINDER_ANDROID) || (defined(__linux__) && defined(__ARM_ARCH))
3737
#define PATHFINDER_MINIMUM_SHADER_VERSION_SUPPORT
3838
#endif
3939

pathfinder/gpu/gl/buffer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "buffer.h"
22

33
#include <cassert>
4+
#include <cstring>
45

56
#include "../../common/logger.h"
67
#include "debug_marker.h"
@@ -82,7 +83,7 @@ void BufferGl::download_via_mapping(size_t data_size, size_t offset, void *data)
8283

8384
#ifdef PATHFINDER_ENABLE_D3D11
8485
glBindBuffer(GL_SHADER_STORAGE_BUFFER, gl_id_);
85-
#ifdef __ANDROID__
86+
#if defined(__ANDROID__) || (defined(__linux__) && defined(__ARM_ARCH))
8687
void *ptr = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, offset, data_size, GL_MAP_READ_BIT);
8788
if (ptr) {
8889
memcpy(data, ptr, data_size);

pathfinder/gpu/gl/window_builder.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,17 @@ WindowBuilderGl::WindowBuilderGl(const Vec2I &logical_size) {
7777
glfwMakeContextCurrent(glfw_window);
7878

7979
#ifndef __EMSCRIPTEN__
80+
#if defined(__linux__) && defined(__ARM_ARCH)
81+
// GLAD: load all OpenGL ES function pointers.
82+
if (!gladLoadGLES2(glfwGetProcAddress)) {
83+
throw std::runtime_error("Failed to initialize GLAD!");
84+
}
85+
#else
8086
// GLAD: load all OpenGL function pointers.
8187
if (!gladLoadGL(glfwGetProcAddress)) {
8288
throw std::runtime_error("Failed to initialize GLAD!");
8389
}
90+
#endif
8491

8592
if (GLAD_GL_EXT_debug_label) {
8693
Logger::info("Debug markers enabled.");

pathfinder/gpu/render_api.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,14 @@
2525
#else // Native
2626

2727
#ifdef PATHFINDER_USE_OPENGL
28+
#if defined(__linux__) && defined(__ARM_ARCH)
29+
// Include OpenGL ES header via GLAD.
30+
#include <glad/gles2.h>
31+
#else
2832
// Include OpenGL header via GLAD.
2933
#include <glad/gl.h>
30-
#define GLFW_INCLUDE_NONE
34+
#endif
35+
#define GLFW_INCLUDE_NONE
3136
#endif
3237

3338
#ifdef PATHFINDER_USE_VULKAN

third_party/glad/include/glad/gl.h

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
/**
2-
* Loader generated by glad 2.0.4 on Wed Nov 8 07:03:08 2023
2+
* Loader generated by glad 2.0.8 on Thu Jan 15 02:50:24 2026
33
*
44
* SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0
55
*
66
* Generator: C/C++
77
* Specification: gl
8-
* Extensions: 1
8+
* Extensions: 2
99
*
1010
* APIs:
1111
* - gl:compatibility=4.6
@@ -19,10 +19,10 @@
1919
* - ON_DEMAND = False
2020
*
2121
* Commandline:
22-
* --api='gl:compatibility=4.6' --extensions='GL_EXT_debug_label' c
22+
* --api='gl:compatibility=4.6' --extensions='GL_EXT_debug_label,GL_EXT_debug_marker' c
2323
*
2424
* Online:
25-
* http://glad.sh/#api=gl%3Acompatibility%3D4.6&extensions=GL_EXT_debug_label&generator=c&options=
25+
* http://glad.sh/#api=gl%3Acompatibility%3D4.6&extensions=GL_EXT_debug_label%2CGL_EXT_debug_marker&generator=c&options=
2626
*
2727
*/
2828

@@ -163,7 +163,7 @@ extern "C" {
163163
#define GLAD_VERSION_MAJOR(version) (version / 10000)
164164
#define GLAD_VERSION_MINOR(version) (version % 10000)
165165

166-
#define GLAD_GENERATOR_VERSION "2.0.4"
166+
#define GLAD_GENERATOR_VERSION "2.0.8"
167167

168168
typedef void (*GLADapiproc)(void);
169169

@@ -2096,6 +2096,8 @@ GLAD_API_CALL int GLAD_GL_VERSION_4_5;
20962096
GLAD_API_CALL int GLAD_GL_VERSION_4_6;
20972097
#define GL_EXT_debug_label 1
20982098
GLAD_API_CALL int GLAD_GL_EXT_debug_label;
2099+
#define GL_EXT_debug_marker 1
2100+
GLAD_API_CALL int GLAD_GL_EXT_debug_marker;
20992101

21002102

21012103
typedef void (GLAD_API_PTR *PFNGLACCUMPROC)(GLenum op, GLfloat value);
@@ -2536,6 +2538,7 @@ typedef void (GLAD_API_PTR *PFNGLINDEXSVPROC)(const GLshort * c);
25362538
typedef void (GLAD_API_PTR *PFNGLINDEXUBPROC)(GLubyte c);
25372539
typedef void (GLAD_API_PTR *PFNGLINDEXUBVPROC)(const GLubyte * c);
25382540
typedef void (GLAD_API_PTR *PFNGLINITNAMESPROC)(void);
2541+
typedef void (GLAD_API_PTR *PFNGLINSERTEVENTMARKEREXTPROC)(GLsizei length, const GLchar * marker);
25392542
typedef void (GLAD_API_PTR *PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void * pointer);
25402543
typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer);
25412544
typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length);
@@ -2704,6 +2707,7 @@ typedef void (GLAD_API_PTR *PFNGLPOLYGONSTIPPLEPROC)(const GLubyte * mask);
27042707
typedef void (GLAD_API_PTR *PFNGLPOPATTRIBPROC)(void);
27052708
typedef void (GLAD_API_PTR *PFNGLPOPCLIENTATTRIBPROC)(void);
27062709
typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void);
2710+
typedef void (GLAD_API_PTR *PFNGLPOPGROUPMARKEREXTPROC)(void);
27072711
typedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void);
27082712
typedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void);
27092713
typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index);
@@ -2764,6 +2768,7 @@ typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode);
27642768
typedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield mask);
27652769
typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask);
27662770
typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message);
2771+
typedef void (GLAD_API_PTR *PFNGLPUSHGROUPMARKEREXTPROC)(GLsizei length, const GLchar * marker);
27672772
typedef void (GLAD_API_PTR *PFNGLPUSHMATRIXPROC)(void);
27682773
typedef void (GLAD_API_PTR *PFNGLPUSHNAMEPROC)(GLuint name);
27692774
typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target);
@@ -4025,6 +4030,8 @@ GLAD_API_CALL PFNGLINDEXUBVPROC glad_glIndexubv;
40254030
#define glIndexubv glad_glIndexubv
40264031
GLAD_API_CALL PFNGLINITNAMESPROC glad_glInitNames;
40274032
#define glInitNames glad_glInitNames
4033+
GLAD_API_CALL PFNGLINSERTEVENTMARKEREXTPROC glad_glInsertEventMarkerEXT;
4034+
#define glInsertEventMarkerEXT glad_glInsertEventMarkerEXT
40284035
GLAD_API_CALL PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays;
40294036
#define glInterleavedArrays glad_glInterleavedArrays
40304037
GLAD_API_CALL PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData;
@@ -4361,6 +4368,8 @@ GLAD_API_CALL PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib;
43614368
#define glPopClientAttrib glad_glPopClientAttrib
43624369
GLAD_API_CALL PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup;
43634370
#define glPopDebugGroup glad_glPopDebugGroup
4371+
GLAD_API_CALL PFNGLPOPGROUPMARKEREXTPROC glad_glPopGroupMarkerEXT;
4372+
#define glPopGroupMarkerEXT glad_glPopGroupMarkerEXT
43644373
GLAD_API_CALL PFNGLPOPMATRIXPROC glad_glPopMatrix;
43654374
#define glPopMatrix glad_glPopMatrix
43664375
GLAD_API_CALL PFNGLPOPNAMEPROC glad_glPopName;
@@ -4481,6 +4490,8 @@ GLAD_API_CALL PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib;
44814490
#define glPushClientAttrib glad_glPushClientAttrib
44824491
GLAD_API_CALL PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup;
44834492
#define glPushDebugGroup glad_glPushDebugGroup
4493+
GLAD_API_CALL PFNGLPUSHGROUPMARKEREXTPROC glad_glPushGroupMarkerEXT;
4494+
#define glPushGroupMarkerEXT glad_glPushGroupMarkerEXT
44844495
GLAD_API_CALL PFNGLPUSHMATRIXPROC glad_glPushMatrix;
44854496
#define glPushMatrix glad_glPushMatrix
44864497
GLAD_API_CALL PFNGLPUSHNAMEPROC glad_glPushName;

0 commit comments

Comments
 (0)