diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml index ae7efb2ebe..099fdef9b5 100644 --- a/.github/workflows/presubmit.yml +++ b/.github/workflows/presubmit.yml @@ -92,19 +92,22 @@ jobs: test-renderdiff: name: test-renderdiff - runs-on: ubuntu-22.04-4core - + runs-on: macos-14-xlarge steps: - uses: actions/checkout@v4.1.6 - - uses: ./.github/actions/ubuntu-apt-add-src + - name: Set up Homebrew + id: set-up-homebrew + uses: Homebrew/actions/setup-homebrew@master + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Install python prereqs + run: pip install mako setuptools pyyaml - name: Run script run: | - echo "Disabled renderdiff due to Mesa -> Currently planned outage: 2025-03-16 -> 2025-03-22" -# source ./build/linux/ci-common.sh && bash test/renderdiff/test.sh - - uses: actions/upload-artifact@v4 - with: - name: presubmit-renderdiff-result - path: ./out/renderdiff_tests + echo "$(brew --version)" + bash test/renderdiff/test.sh validate-wgsl-pipeline: name: validate-wgsl-pipeline @@ -115,4 +118,4 @@ jobs: - name: Run build script run: source ./build/linux/ci-common.sh && ./build.sh -W debug test_filamat - name: Run test - run: ./out/cmake-debug/libs/filamat/test_filamat --gtest_filter=MaterialCompiler.Wgsl* \ No newline at end of file + run: ./out/cmake-debug/libs/filamat/test_filamat --gtest_filter=MaterialCompiler.Wgsl* diff --git a/CMakeLists.txt b/CMakeLists.txt index f00a15c1ec..c81f49fe70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -139,14 +139,14 @@ else() set(LINUX FALSE) endif() -if (LINUX) - if (NOT FILAMENT_OSMESA_PATH STREQUAL "") - if (NOT EXISTS ${FILAMENT_OSMESA_PATH}/) - message(FATAL_ERROR "Cannot find specified OSMesa build directory: ${FILAMENT_OSMESA_PATH}") - endif() - set(FILAMENT_SUPPORTS_OSMESA TRUE) +if (NOT FILAMENT_OSMESA_PATH STREQUAL "") + if (NOT EXISTS ${FILAMENT_OSMESA_PATH}/) + message(FATAL_ERROR "Cannot find specified OSMesa build directory: ${FILAMENT_OSMESA_PATH}") endif() + set(FILAMENT_SUPPORTS_OSMESA TRUE) +endif() +if (LINUX) if (FILAMENT_SUPPORTS_WAYLAND) add_definitions(-DFILAMENT_SUPPORTS_WAYLAND) set(FILAMENT_SUPPORTS_X11 FALSE) @@ -184,6 +184,12 @@ if (NOT ANDROID AND NOT WEBGL AND NOT IOS AND NOT FILAMENT_LINUX_IS_MOBILE) set(IS_HOST_PLATFORM TRUE) endif() +if (APPLE) + if (FILAMENT_SUPPORTS_OSMESA) + add_definitions(-DFILAMENT_SUPPORTS_OSMESA) + endif() +endif() + if (WIN32) # Link statically against c/c++ lib to avoid missing redistriburable such as # "VCRUNTIME140.dll not found. Try reinstalling the app.", but give users diff --git a/filament/backend/CMakeLists.txt b/filament/backend/CMakeLists.txt index 6f66f1f457..d7e3030f58 100644 --- a/filament/backend/CMakeLists.txt +++ b/filament/backend/CMakeLists.txt @@ -108,8 +108,12 @@ if (FILAMENT_SUPPORTS_OPENGL AND NOT FILAMENT_USE_EXTERNAL_GLES3) list(APPEND SRCS src/opengl/platforms/PlatformCocoaTouchGL.mm) list(APPEND SRCS src/opengl/platforms/CocoaTouchExternalImage.mm) elseif (APPLE) - list(APPEND SRCS src/opengl/platforms/PlatformCocoaGL.mm) - list(APPEND SRCS src/opengl/platforms/CocoaExternalImage.mm) + if (FILAMENT_SUPPORTS_OSMESA) + list(APPEND SRCS src/opengl/platforms/PlatformOSMesa.cpp) + else() + list(APPEND SRCS src/opengl/platforms/PlatformCocoaGL.mm) + list(APPEND SRCS src/opengl/platforms/CocoaExternalImage.mm) + endif() elseif (WEBGL) list(APPEND SRCS src/opengl/platforms/PlatformWebGL.cpp) elseif (LINUX) @@ -416,9 +420,12 @@ set(LINUX_LINKER_OPTIMIZATION_FLAGS -Wl,--exclude-libs,bluegl ) -if (LINUX AND FILAMENT_SUPPORTS_OSMESA) - set(OSMESA_COMPILE_FLAGS - -I${FILAMENT_OSMESA_PATH}/include/GL) +if (FILAMENT_SUPPORTS_OSMESA) + if (LINUX) + set(OSMESA_COMPILE_FLAGS -I${FILAMENT_OSMESA_PATH}/include/GL) + elseif (APPLE) + set(OSMESA_COMPILE_FLAGS -I${FILAMENT_OSMESA_PATH}/include) + endif() endif() if (MSVC) diff --git a/filament/backend/include/backend/platforms/PlatformOSMesa.h b/filament/backend/include/backend/platforms/PlatformOSMesa.h index a1a72fc6f7..5f6658f94d 100644 --- a/filament/backend/include/backend/platforms/PlatformOSMesa.h +++ b/filament/backend/include/backend/platforms/PlatformOSMesa.h @@ -21,7 +21,12 @@ #include "bluegl/BlueGL.h" +#if defined(__linux__) #include +#elif defined(__APPLE__) +#undef GLAPI +#include +#endif #include #include diff --git a/filament/backend/src/PlatformFactory.cpp b/filament/backend/src/PlatformFactory.cpp index bf1ec35176..5dffb14d37 100644 --- a/filament/backend/src/PlatformFactory.cpp +++ b/filament/backend/src/PlatformFactory.cpp @@ -30,7 +30,11 @@ #endif #elif defined(__APPLE__) #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) - #include + #if defined(FILAMENT_SUPPORTS_OSMESA) + #include + #else + #include + #endif #endif #elif defined(__linux__) #if defined(FILAMENT_SUPPORTS_X11) @@ -132,7 +136,11 @@ Platform* PlatformFactory::create(Backend* backend) noexcept { #elif defined(FILAMENT_IOS) return new PlatformCocoaTouchGL(); #elif defined(__APPLE__) - return new PlatformCocoaGL(); + #if defined(FILAMENT_SUPPORTS_OSMESA) + return new PlatformOSMesa(); + #else + return new PlatformCocoaGL(); + #endif #elif defined(__linux__) #if defined(FILAMENT_SUPPORTS_X11) return new PlatformGLX(); diff --git a/filament/backend/src/opengl/platforms/PlatformOSMesa.cpp b/filament/backend/src/opengl/platforms/PlatformOSMesa.cpp index 831e30cc62..3e152b709f 100644 --- a/filament/backend/src/opengl/platforms/PlatformOSMesa.cpp +++ b/filament/backend/src/opengl/platforms/PlatformOSMesa.cpp @@ -22,9 +22,11 @@ #include #include +#if defined(__linux__) // This is to ensure that linking during compilation will not fail even if // OSMesaGetProcAddress is not linked. __attribute__((weak)) OSMESAproc OSMesaGetProcAddress(char const*); +#endif namespace filament::backend { @@ -48,20 +50,27 @@ struct OSMesaSwapchain { struct OSMesaAPI { private: - using CreateContextFunc = OSMesaContext (*)(GLenum format, OSMesaContext); + using CreateContextAttribsFunc = OSMesaContext (*)(const int *, OSMesaContext); using DestroyContextFunc = GLboolean (*)(OSMesaContext); using MakeCurrentFunc = GLboolean (*)(OSMesaContext ctx, void* buffer, GLenum type, GLsizei width, GLsizei height); using GetProcAddressFunc = OSMESAproc (*)(const char* funcName); public: - CreateContextFunc fOSMesaCreateContext; + CreateContextAttribsFunc fOSMesaCreateContextAttribs; DestroyContextFunc fOSMesaDestroyContext; MakeCurrentFunc fOSMesaMakeCurrent; GetProcAddressFunc fOSMesaGetProcAddress; OSMesaAPI() { - constexpr char const* libraryNames[] = {"libOSMesa.so", "libosmesa.so"}; + static constexpr char const* libraryNames[] = { +#if defined(__linux__) + "libOSMesa.so", + "libosmesa.so", +#elif defined(__APPLE__) + "libOSMesa.dylib", +#endif + }; for (char const* libName: libraryNames) { mLib = dlopen(libName, RTLD_GLOBAL | RTLD_NOW); if (mLib) { @@ -71,22 +80,24 @@ public: if (mLib) { // Loading from a libosmesa.os fOSMesaGetProcAddress = (GetProcAddressFunc) dlsym(mLib, "OSMesaGetProcAddress"); - } else { + } +#if defined(__linux__) + else { // Filament is built into a .so fOSMesaGetProcAddress = (GetProcAddressFunc) dlsym(RTLD_LOCAL, "OSMesaGetProcAddress"); } - if (!fOSMesaGetProcAddress) { // Statically linking osmesa fOSMesaGetProcAddress = OSMesaGetProcAddress; } +#endif // __linux__ FILAMENT_CHECK_PRECONDITION(fOSMesaGetProcAddress) << "Unable to link against libOSMesa to create a software GL context"; - fOSMesaCreateContext = (CreateContextFunc) fOSMesaGetProcAddress("OSMesaCreateContext"); - fOSMesaDestroyContext = - (DestroyContextFunc) fOSMesaGetProcAddress("OSMesaDestroyContext"); + fOSMesaCreateContextAttribs = + (CreateContextAttribsFunc) fOSMesaGetProcAddress("OSMesaCreateContextAttribs"); + fOSMesaDestroyContext = (DestroyContextFunc) fOSMesaGetProcAddress("OSMesaDestroyContext"); fOSMesaMakeCurrent = (MakeCurrentFunc) fOSMesaGetProcAddress("OSMesaMakeCurrent"); } @@ -103,12 +114,22 @@ private: Driver* PlatformOSMesa::createDriver(void* const sharedGLContext, const DriverConfig& driverConfig) noexcept { + OSMesaAPI* api = new OSMesaAPI(); mOsMesaApi = api; + static constexpr int attribs[] = { + OSMESA_FORMAT, GL_RGBA, + OSMESA_DEPTH_BITS, 24, + OSMESA_STENCIL_BITS, 8, + OSMESA_ACCUM_BITS, 0, + OSMESA_PROFILE, OSMESA_CORE_PROFILE, + 0, + }; + FILAMENT_CHECK_PRECONDITION(sharedGLContext == nullptr) << "shared GL context is not supported with PlatformOSMesa"; - mContext = api->fOSMesaCreateContext(GL_RGBA, NULL); + mContext = api->fOSMesaCreateContextAttribs(attribs, NULL); // We need to do a no-op makecurrent here so that the context will be in a correct state before // any GL calls. diff --git a/libs/bluegl/CMakeLists.txt b/libs/bluegl/CMakeLists.txt index fa495ec80c..b43a204b96 100644 --- a/libs/bluegl/CMakeLists.txt +++ b/libs/bluegl/CMakeLists.txt @@ -31,13 +31,17 @@ if (WIN32) set(SRCS ${SRCS} src/BlueGLCoreWindowsImpl.S) endif() elseif (APPLE AND NOT IOS) - set(SRCS ${SRCS} src/BlueGLDarwin.cpp) + if (FILAMENT_SUPPORTS_OSMESA) + set(SRCS ${SRCS} src/BlueGLOSMesa.cpp) + else() + set(SRCS ${SRCS} src/BlueGLDarwin.cpp) + endif() set(SRCS ${SRCS} src/BlueGLCoreDarwinUniversalImpl.S) elseif(LINUX) - if(FILAMENT_SUPPORTS_EGL_ON_LINUX) + if (FILAMENT_SUPPORTS_EGL_ON_LINUX) set(SRCS ${SRCS} src/BlueGLLinuxEGL.cpp) - elseif(FILAMENT_SUPPORTS_OSMESA) - set(SRCS ${SRCS} src/BlueGLLinuxOSMesa.cpp) + elseif (FILAMENT_SUPPORTS_OSMESA) + set(SRCS ${SRCS} src/BlueGLOSMesa.cpp) else() set(SRCS ${SRCS} src/BlueGLLinux.cpp) endif() @@ -53,7 +57,11 @@ include_directories(${PUBLIC_HDR_DIR}) add_library(${TARGET} STATIC ${PUBLIC_HDRS} ${SRCS}) if(FILAMENT_SUPPORTS_OSMESA) - target_compile_options(${TARGET} PRIVATE -I${FILAMENT_OSMESA_PATH}/include/GL) + if (APPLE) + target_compile_options(${TARGET} PRIVATE -I${FILAMENT_OSMESA_PATH}/include) + else() + target_compile_options(${TARGET} PRIVATE -I${FILAMENT_OSMESA_PATH}/include/GL) + endif() endif() # specify where the public headers of this library are diff --git a/libs/bluegl/src/BlueGLLinuxOSMesa.cpp b/libs/bluegl/src/BlueGLOSMesa.cpp similarity index 78% rename from libs/bluegl/src/BlueGLLinuxOSMesa.cpp rename to libs/bluegl/src/BlueGLOSMesa.cpp index 7b2e4624d4..88ab35ad3a 100644 --- a/libs/bluegl/src/BlueGLLinuxOSMesa.cpp +++ b/libs/bluegl/src/BlueGLOSMesa.cpp @@ -17,42 +17,64 @@ #include #include +#if defined(__linux__) + #include +// This is to ensure that linking during compilation will not fail even if +// OSMesaGetProcAddress is not linked. +__attribute__((weak)) OSMESAproc OSMesaGetProcAddress(char const*); + +#elif defined(__APPLE__) + +#include + +#endif // __linux__ + +#if defined(__linux__) +#endif + namespace bluegl { namespace { using ProcAddressFunc = void*(*)(char const* funcName); } -// This is to ensure that linking during compilation will not fail even if -// OSMesaGetProcAddress is not linked. -__attribute__((weak)) OSMESAproc OSMesaGetProcAddress(char const*); - struct Driver { ProcAddressFunc OSMesaGetProcAddress; void* library; } g_driver = {nullptr, nullptr}; bool initBinder() { - constexpr char const* libraryNames[] = {"libOSMesa.so", "libosmesa.so"}; + static constexpr char const* libraryNames[] = { +#if defined(__linux__) + "libOSMesa.so", + "libosmesa.so", +#elif defined(__APPLE__) + "libOSMesa.dylib", +#endif + }; for (char const* name: libraryNames) { g_driver.library = dlopen(name, RTLD_GLOBAL | RTLD_NOW); if (g_driver.library) { break; } } - if (!g_driver.library) { - // The library has been linked explicitly during compile. - g_driver.OSMesaGetProcAddress = (ProcAddressFunc) dlsym(RTLD_LOCAL, "OSMesaGetProcAddress"); - } else { + if (g_driver.library) { + // Linking against a libosmesa.so. g_driver.OSMesaGetProcAddress = (ProcAddressFunc) dlsym(g_driver.library, "OSMesaGetProcAddress"); } - +#if defined(__linux__) + else { + // If Filament was built as a dynamic library. + g_driver.OSMesaGetProcAddress = (ProcAddressFunc) dlsym(RTLD_LOCAL, "OSMesaGetProcAddress"); + } if (!g_driver.OSMesaGetProcAddress) { + // If statically linking OSMesa. g_driver.OSMesaGetProcAddress = (ProcAddressFunc) OSMesaGetProcAddress; } +#endif return g_driver.OSMesaGetProcAddress; } diff --git a/test/renderdiff/src/run.py b/test/renderdiff/src/run.py index 9b63ebd4b3..15c5663eba 100644 --- a/test/renderdiff/src/run.py +++ b/test/renderdiff/src/run.py @@ -46,7 +46,12 @@ def render_test(gltf_viewer, test_config, output_dir, for backend in test_config.backends: env = None if backend == 'opengl' and opengl_lib and os.path.isdir(opengl_lib): - env = {'LD_LIBRARY_PATH': opengl_lib} + env = { + 'LD_LIBRARY_PATH': opengl_lib, + + # for macOS + 'DYLD_LIBRARY_PATH': opengl_lib, + } for model in test.models: model_path = test_config.models[model] diff --git a/test/renderdiff/test.sh b/test/renderdiff/test.sh index 7321a468ae..ea8c6399ac 100755 --- a/test/renderdiff/test.sh +++ b/test/renderdiff/test.sh @@ -18,11 +18,19 @@ OUTPUT_DIR="$(pwd)/out/renderdiff_tests" RENDERDIFF_TEST_DIR="$(pwd)/test/renderdiff" TEST_UTILS_DIR="$(pwd)/test/utils" MESA_DIR="$(pwd)/mesa/out/" -MESA_LIB_DIR="${MESA_DIR}/lib/x86_64-linux-gnu" + +os_name=$(uname -s) +if [[ "$os_name" == "Linux" ]]; then + MESA_LIB_DIR="${MESA_DIR}lib/x86_64-linux-gnu" +elif [[ "$os_name" == "Darwin" ]]; then + MESA_LIB_DIR="${MESA_DIR}lib" +else + echo "Unsupported platform for renderdiff tests" + exit 1 +fi function prepare_mesa() { if [ ! -d ${MESA_LIB_DIR} ]; then - rm -rf mesa bash ${TEST_UTILS_DIR}/get_mesa.sh fi } diff --git a/test/utils/get_mesa.sh b/test/utils/get_mesa.sh index 6ecb325d22..e1fc0ca4e7 100755 --- a/test/utils/get_mesa.sh +++ b/test/utils/get_mesa.sh @@ -17,55 +17,97 @@ set -xe # GITHUB_CLANG_VERSION is set in build/linux/ci-common.sh +os_name=$(uname -s) +LLVM_VERSION=16 +MESA_DIR=$(pwd)/mesa -if [[ "$GITHUB_WORKFLOW" ]]; then - # We only want to do this if it is a CI machine. - sudo apt-get -y remove llvm-* +if [[ "$os_name" == "Linux" ]]; then + if [[ "$GITHUB_WORKFLOW" ]]; then + # We only want to do this if it is a CI machine. + sudo apt-get -y remove llvm-* - # We do a manual install of dependencies instead of `apt-get -y build-dep mesa` - # because this allows us to compile an older mesa, and also because build-deps - # is constantly being updated and sometimes not compatible with the current - # linux platform. - # Note that we assume this platform is compatible with ubuntu-22.04 x86_64 - sudo apt-get -y install \ - autoconf automake autopoint autotools-dev bindgen bison build-essential bzip2 cpp cpp-11 debhelper debugedit dh-autoreconf dh-strip-nondeterminism diffstat directx-headers-dev dpkg-dev dwz flex g++ g++-11 gcc gcc-11 gcc-11-base:amd64 gettext glslang-tools icu-devtools intltool-debian lib32gcc-s1 lib32stdc++6 libarchive-zip-perl libasan6:amd64 libatomic1:amd64 libc-dev-bin libc6-dbg:amd64 libc6-dev:amd64 libc6-i386 libcc1-0:amd64 libclang-${GITHUB_CLANG_VERSION}-dev libclang-common-${GITHUB_CLANG_VERSION}-dev libclang-cpp${GITHUB_CLANG_VERSION} libclang-cpp${GITHUB_CLANG_VERSION}-dev libclang1-14 libclang1-${GITHUB_CLANG_VERSION} libclc-${GITHUB_CLANG_VERSION} libclc-${GITHUB_CLANG_VERSION}-dev libcrypt-dev:amd64 libdebhelper-perl libdpkg-perl libdrm-amdgpu1:amd64 libdrm-dev:amd64 libdrm-intel1:amd64 libdrm-nouveau2:amd64 libdrm-radeon1:amd64 libelf-dev:amd64 libexpat1-dev:amd64 libffi-dev:amd64 libfile-stripnondeterminism-perl libgc1:amd64 libgcc-11-dev:amd64 libgl1:amd64 libgl1-mesa-dri:amd64 libglapi-mesa:amd64 libglvnd-core-dev:amd64 libglvnd0:amd64 libglx-mesa0:amd64 libglx0:amd64 libgomp1:amd64 libicu-dev:amd64 libisl23:amd64 libitm1:amd64 libllvm14:amd64 libllvm${GITHUB_CLANG_VERSION}:amd64 libllvmspirvlib-${GITHUB_CLANG_VERSION}-dev:amd64 libllvmspirvlib${GITHUB_CLANG_VERSION}:amd64 liblsan0:amd64 libmpc3:amd64 libncurses-dev:amd64 libnsl-dev:amd64 libobjc-11-dev:amd64 libobjc4:amd64 libpciaccess-dev:amd64 libpciaccess0:amd64 libpfm4:amd64 libpthread-stubs0-dev:amd64 libquadmath0:amd64 libsensors-config libsensors-dev:amd64 libsensors5:amd64 libset-scalar-perl libstd-rust-1.75:amd64 libstd-rust-dev:amd64 libstdc++-11-dev:amd64 libsub-override-perl libtinfo-dev:amd64 libtirpc-dev:amd64 libtool libtsan0:amd64 libubsan1:amd64 libva-dev:amd64 libva-drm2:amd64 libva-glx2:amd64 libva-wayland2:amd64 libva-x11-2:amd64 libva2:amd64 libvdpau-dev:amd64 libvdpau1:amd64 libvulkan-dev:amd64 libvulkan1:amd64 libwayland-bin libwayland-client0:amd64 libwayland-cursor0:amd64 libwayland-dev:amd64 libwayland-egl-backend-dev:amd64 libwayland-egl1:amd64 libwayland-server0:amd64 libx11-dev:amd64 libx11-xcb-dev:amd64 libx11-xcb1:amd64 libxau-dev:amd64 libxcb-dri2-0:amd64 libxcb-dri2-0-dev:amd64 libxcb-dri3-0:amd64 libxcb-dri3-dev:amd64 libxcb-glx0:amd64 libxcb-glx0-dev:amd64 libxcb-present-dev:amd64 libxcb-present0:amd64 libxcb-randr0:amd64 libxcb-randr0-dev:amd64 libxcb-render0:amd64 libxcb-render0-dev:amd64 libxcb-shape0:amd64 libxcb-shape0-dev:amd64 libxcb-shm0:amd64 libxcb-shm0-dev:amd64 libxcb-sync-dev:amd64 libxcb-sync1:amd64 libxcb-xfixes0:amd64 libxcb-xfixes0-dev:amd64 libxcb1-dev:amd64 libxdmcp-dev:amd64 libxext-dev:amd64 libxfixes-dev:amd64 libxfixes3:amd64 libxml2-dev:amd64 libxrandr-dev:amd64 libxrandr2:amd64 libxrender-dev:amd64 libxrender1:amd64 libxshmfence-dev:amd64 libxshmfence1:amd64 libxxf86vm-dev:amd64 libxxf86vm1:amd64 libz3-4:amd64 libz3-dev:amd64 libzstd-dev:amd64 linux-libc-dev:amd64 llvm-${GITHUB_CLANG_VERSION} llvm-${GITHUB_CLANG_VERSION}-dev llvm-${GITHUB_CLANG_VERSION}-linker-tools llvm-${GITHUB_CLANG_VERSION}-runtime llvm-${GITHUB_CLANG_VERSION}-tools llvm-spirv-${GITHUB_CLANG_VERSION} lto-disabled-list m4 make meson ninja-build pkg-config po-debconf python3-mako python3-ply python3-pygments quilt rpcsvc-proto rustc spirv-tools valgrind wayland-protocols x11proto-dev xorg-sgml-doctools xtrans-dev zlib1g-dev:amd64 \ - clang-$GITHUB_CLANG_VERSION libc++-$GITHUB_CLANG_VERSION-dev libc++abi-$GITHUB_CLANG_VERSION-dev + # We do a manual install of dependencies instead of `apt-get -y build-dep mesa` + # because this allows us to compile an older mesa, and also because build-deps + # is constantly being updated and sometimes not compatible with the current + # linux platform. + # Note that we assume this platform is compatible with ubuntu-22.04 x86_64 + sudo apt-get -y install \ + autoconf automake autopoint autotools-dev bindgen bison build-essential bzip2 cpp cpp-11 debhelper debugedit dh-autoreconf dh-strip-nondeterminism diffstat directx-headers-dev dpkg-dev dwz flex g++ g++-11 gcc gcc-11 gcc-11-base:amd64 gettext glslang-tools icu-devtools intltool-debian lib32gcc-s1 lib32stdc++6 libarchive-zip-perl libasan6:amd64 libatomic1:amd64 libc-dev-bin libc6-dbg:amd64 libc6-dev:amd64 libc6-i386 libcc1-0:amd64 libclang-${GITHUB_CLANG_VERSION}-dev libclang-common-${GITHUB_CLANG_VERSION}-dev libclang-cpp${GITHUB_CLANG_VERSION} libclang-cpp${GITHUB_CLANG_VERSION}-dev libclang1-14 libclang1-${GITHUB_CLANG_VERSION} libclc-${GITHUB_CLANG_VERSION} libclc-${GITHUB_CLANG_VERSION}-dev libcrypt-dev:amd64 libdebhelper-perl libdpkg-perl libdrm-amdgpu1:amd64 libdrm-dev:amd64 libdrm-intel1:amd64 libdrm-nouveau2:amd64 libdrm-radeon1:amd64 libelf-dev:amd64 libexpat1-dev:amd64 libffi-dev:amd64 libfile-stripnondeterminism-perl libgc1:amd64 libgcc-11-dev:amd64 libgl1:amd64 libgl1-mesa-dri:amd64 libglapi-mesa:amd64 libglvnd-core-dev:amd64 libglvnd0:amd64 libglx-mesa0:amd64 libglx0:amd64 libgomp1:amd64 libicu-dev:amd64 libisl23:amd64 libitm1:amd64 libllvm14:amd64 libllvm${GITHUB_CLANG_VERSION}:amd64 libllvmspirvlib-${GITHUB_CLANG_VERSION}-dev:amd64 libllvmspirvlib${GITHUB_CLANG_VERSION}:amd64 liblsan0:amd64 libmpc3:amd64 libncurses-dev:amd64 libnsl-dev:amd64 libobjc-11-dev:amd64 libobjc4:amd64 libpciaccess-dev:amd64 libpciaccess0f:amd64 libpfm4:amd64 libpthread-stubs0-dev:amd64 libquadmath0:amd64 libsensors-config libsensors-dev:amd64 libsensors5:amd64 libset-scalar-perl libstd-rust-1.75:amd64 libstd-rust-dev:amd64 libstdc++-11-dev:amd64 libsub-override-perl libtinfo-dev:amd64 libtirpc-dev:amd64 libtool libtsan0:amd64 libubsan1:amd64 libva-dev:amd64 libva-drm2:amd64 libva-glx2:amd64 libva-wayland2:amd64 libva-x11-2:amd64 libva2:amd64 libvdpau-dev:amd64 libvdpau1:amd64 libvulkan-dev:amd64 libvulkan1:amd64 libwayland-bin libwayland-client0:amd64 libwayland-cursor0:amd64 libwayland-dev:amd64 libwayland-egl-backend-dev:amd64 libwayland-egl1:amd64 libwayland-server0:amd64 libx11-dev:amd64 libx11-xcb-dev:amd64 libx11-xcb1:amd64 libxau-dev:amd64 libxcb-dri2-0:amd64 libxcb-dri2-0-dev:amd64 libxcb-dri3-0:amd64 libxcb-dri3-dev:amd64 libxcb-glx0:amd64 libxcb-glx0-dev:amd64 libxcb-present-dev:amd64 libxcb-present0:amd64 libxcb-randr0:amd64 libxcb-randr0-dev:amd64 libxcb-render0:amd64 libxcb-render0-dev:amd64 libxcb-shape0:amd64 libxcb-shape0-dev:amd64 libxcb-shm0:amd64 libxcb-shm0-dev:amd64 libxcb-sync-dev:amd64 libxcb-sync1:amd64 libxcb-xfixes0:amd64 libxcb-xfixes0-dev:amd64 libxcb1-dev:amd64 libxdmcp-dev:amd64 libxext-dev:amd64 libxfixes-dev:amd64 libxfixes3:amd64 libxml2-dev:amd64 libxrandr-dev:amd64 libxrandr2:amd64 libxrender-dev:amd64 libxrender1:amd64 libxshmfence-dev:amd64 libxshmfence1:amd64 libxxf86vm-dev:amd64 libxxf86vm1:amd64 libz3-4:amd64 libz3-dev:amd64 libzstd-dev:amd64 linux-libc-dev:amd64 llvm-${LLVM_VERSION} llvm-${LLVM_VERSION}-dev llvm-${LLVM_VERSION}-linker-tools llvm-${LLVM_VERSION}-runtime llvm-${LLVM_VERSION}-tools llvm-spirv-${LLVM_VERSION} lto-disabled-list m4 make meson ninja-build pkg-config po-debconf python3-mako python3-ply python3-pygments quilt rpcsvc-proto rustc spirv-tools valgrind wayland-protocols x11proto-dev xorg-sgml-doctools xtrans-dev zlib1g-dev:amd64 \ + clang-$GITHUB_CLANG_VERSION libc++-$GITHUB_CLANG_VERSION-dev libc++abi-$GITHUB_CLANG_VERSION-dev - sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang-${GITHUB_CLANG_VERSION} 100 - sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-${GITHUB_CLANG_VERSION} 100 + sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang-${GITHUB_CLANG_VERSION} 100 + sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-${GITHUB_CLANG_VERSION} 100 + else + set +e + apt-get -y build-dep mesa + sudo apt -y remove llvm-18 llvm-18-* llvm-19 llvm-19-* + set -e + CURRENT_CLANG_VERSION=$(clang --version | head -n 1 | awk '{ print $4 }' | awk 'BEGIN { FS="\\." } { print $1 }') + GITHUB_CLANG_VERSION=${GITHUB_CLANG_VERSION:-${CURRENT_CLANG_VERSION}} + sudo apt-get -y install clang-${GITHUB_CLANG_VERSION} \ + libc++-${GITHUB_CLANG_VERSION}-dev \ + libc++abi-${GITHUB_CLANG_VERSION}-dev \ + llvm-${LLVM_VERSION} \ + llvm-${LLVM_VERSION}-{dev,tools,runtime} + fi # [[ "$GITHUB_WORKFLOW" ]] +elif [[ "$os_name" == "Darwin" ]]; then + brew install autoconf automake libx11 libxext libxrandr llvm@${LLVM_VERSION} ninja meson pkg-config libxshmfence + + NEEDED_PYTHON_DEPS=("mako" "setuptools") + for cmd in "${NEEDED_PYTHON_DEPS[@]}"; do + if ! pip3 show "${cmd}" >/dev/null 2>&1; then + sudo pip3 install ${cmd} + fi + done +fi # [[ "$os_name" == x ]] + +LOCAL_LDFLAGS=${LDFLAGS} +LOCAL_CPPFLAGS=${CPPFLAGS} +LOCAL_PATH=${PATH} +LOCAL_CXX=$(which clang++) +LOCAL_CC=$(which clang) + +CHECKOUT_MESA=false +if [ -d "${MESA_DIR}" ]; then + cd ${MESA_DIR} + if ! git fsck --connectivity-only > /dev/null 2>&1; then + echo "git fsck failed for mesa; try redownloading" + CHECKOUT_MESA=true; + fi + cd ..; else - set +e - sudo apt-get -y build-dep mesa - sudo apt -y remove llvm-18 llvm-18-* llvm-19 llvm-19-* - set -e - - CURRENT_CLANG_VERSION=$(clang --version | head -n 1 | awk '{ print $4 }' | awk 'BEGIN { FS="\\." } { print $1 }') - GITHUB_CLANG_VERSION=${GITHUB_CLANG_VERSION:-${CURRENT_CLANG_VERSION}} - - sudo apt-get -y install clang-${GITHUB_CLANG_VERSION} \ - libc++-${GITHUB_CLANG_VERSION}-dev \ - libc++abi-${GITHUB_CLANG_VERSION}-dev \ - llvm-${GITHUB_CLANG_VERSION} \ - llvm-${GITHUB_CLANG_VERSION}-{dev,tools,runtime} + CHECKOUT_MESA=true fi +if [ "$CHECKOUT_MESA" = "true" ]; then + rm -rf ${MESA_DIR} -export CXX=`which clang++` && export CC=`which clang` - -git clone https://gitlab.freedesktop.org/mesa/mesa.git + #git clone https://gitlab.freedesktop.org/mesa/mesa.git + git clone git://anongit.freedesktop.org/mesa/mesa + mv mesa ${MESA_DIR} + # Due to gitlab mesa outage. +fi pushd . +cd ${MESA_DIR} -cd mesa - -git checkout mesa-23.2.1 +# Need >= 24 to have llvmpipe for swrast. llvmpipe is needed for GL >= 4.1. +git checkout mesa-24.2.1 mkdir -p out +if [[ "$os_name" == "Darwin" ]]; then + LOCAL_LDFLAGS="-L/opt/homebrew/opt/llvm@${LLVM_VERSION}/lib" + LOCAL_CPPFLAGS="-I/opt/homebrew/opt/llvm@${LLVM_VERSION}/include -I/opt/homebrew/include" + LOCAL_PATH=${PATH}:/opt/homebrew/opt/llvm@${LLVM_VERSION}/bin +fi + # -Dosmesa=true => builds OSMesa, which is an offscreen GL context # -Dgallium-drivers=swrast => builds GL software rasterizer # -Dvulkan-drivers=swrast => builds VK software rasterizer -meson setup builddir/ -Dprefix="$(pwd)/out" -Dosmesa=true -Dglx=xlib -Dgallium-drivers=swrast -Dvulkan-drivers=swrast -meson install -C builddir/ +# -Dgallium-drivers=llvmpipe is needed for GL >= 4.1 (see src/gallium/auxiliary/target-helpers/inline_sw_helper.h) +# We are unable to enable vulkan swrast for macOS because of this failure "Vulkan drivers require dri3 for X11 support" +CXX=${LOCAL_CXX} CC=${LOCAL_CC} PATH=${LOCAL_PATH} LDFLAGS=${LOCAL_LDFLAGS} CPPFLAGS=${LOCAL_CPPFLAGS} meson setup --wipe builddir/ -Dprefix="$(pwd)/out" -Dglx=xlib -Dosmesa=true -Dgallium-drivers=llvmpipe,swrast -Dvulkan-drivers=swrast +CXX=${LOCAL_CXX} CC=${LOCAL_CC} PATH=${LOCAL_PATH} LDFLAGS=${LOCAL_LDFLAGS} CPPFLAGS=${LOCAL_CPPFLAGS} meson install -C builddir/ popd