Compare commits
1 Commits
bjd/comman
...
pf/osmesa-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94cdc79ce3 |
21
.github/workflows/presubmit.yml
vendored
21
.github/workflows/presubmit.yml
vendored
@@ -92,19 +92,22 @@ jobs:
|
|||||||
|
|
||||||
test-renderdiff:
|
test-renderdiff:
|
||||||
name: test-renderdiff
|
name: test-renderdiff
|
||||||
runs-on: ubuntu-22.04-4core
|
runs-on: macos-14-xlarge
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.1.6
|
- 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
|
- name: Run script
|
||||||
run: |
|
run: |
|
||||||
echo "Disabled renderdiff due to Mesa -> Currently planned outage: 2025-03-16 -> 2025-03-22"
|
echo "$(brew --version)"
|
||||||
# source ./build/linux/ci-common.sh && bash test/renderdiff/test.sh
|
bash test/renderdiff/test.sh
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: presubmit-renderdiff-result
|
|
||||||
path: ./out/renderdiff_tests
|
|
||||||
|
|
||||||
validate-wgsl-pipeline:
|
validate-wgsl-pipeline:
|
||||||
name: validate-wgsl-pipeline
|
name: validate-wgsl-pipeline
|
||||||
|
|||||||
@@ -139,14 +139,14 @@ else()
|
|||||||
set(LINUX FALSE)
|
set(LINUX FALSE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (LINUX)
|
if (NOT FILAMENT_OSMESA_PATH STREQUAL "")
|
||||||
if (NOT FILAMENT_OSMESA_PATH STREQUAL "")
|
if (NOT EXISTS ${FILAMENT_OSMESA_PATH}/)
|
||||||
if (NOT EXISTS ${FILAMENT_OSMESA_PATH}/)
|
message(FATAL_ERROR "Cannot find specified OSMesa build directory: ${FILAMENT_OSMESA_PATH}")
|
||||||
message(FATAL_ERROR "Cannot find specified OSMesa build directory: ${FILAMENT_OSMESA_PATH}")
|
|
||||||
endif()
|
|
||||||
set(FILAMENT_SUPPORTS_OSMESA TRUE)
|
|
||||||
endif()
|
endif()
|
||||||
|
set(FILAMENT_SUPPORTS_OSMESA TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (LINUX)
|
||||||
if (FILAMENT_SUPPORTS_WAYLAND)
|
if (FILAMENT_SUPPORTS_WAYLAND)
|
||||||
add_definitions(-DFILAMENT_SUPPORTS_WAYLAND)
|
add_definitions(-DFILAMENT_SUPPORTS_WAYLAND)
|
||||||
set(FILAMENT_SUPPORTS_X11 FALSE)
|
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)
|
set(IS_HOST_PLATFORM TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
if (FILAMENT_SUPPORTS_OSMESA)
|
||||||
|
add_definitions(-DFILAMENT_SUPPORTS_OSMESA)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
# Link statically against c/c++ lib to avoid missing redistriburable such as
|
# Link statically against c/c++ lib to avoid missing redistriburable such as
|
||||||
# "VCRUNTIME140.dll not found. Try reinstalling the app.", but give users
|
# "VCRUNTIME140.dll not found. Try reinstalling the app.", but give users
|
||||||
|
|||||||
@@ -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/PlatformCocoaTouchGL.mm)
|
||||||
list(APPEND SRCS src/opengl/platforms/CocoaTouchExternalImage.mm)
|
list(APPEND SRCS src/opengl/platforms/CocoaTouchExternalImage.mm)
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
list(APPEND SRCS src/opengl/platforms/PlatformCocoaGL.mm)
|
if (FILAMENT_SUPPORTS_OSMESA)
|
||||||
list(APPEND SRCS src/opengl/platforms/CocoaExternalImage.mm)
|
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)
|
elseif (WEBGL)
|
||||||
list(APPEND SRCS src/opengl/platforms/PlatformWebGL.cpp)
|
list(APPEND SRCS src/opengl/platforms/PlatformWebGL.cpp)
|
||||||
elseif (LINUX)
|
elseif (LINUX)
|
||||||
@@ -416,9 +420,12 @@ set(LINUX_LINKER_OPTIMIZATION_FLAGS
|
|||||||
-Wl,--exclude-libs,bluegl
|
-Wl,--exclude-libs,bluegl
|
||||||
)
|
)
|
||||||
|
|
||||||
if (LINUX AND FILAMENT_SUPPORTS_OSMESA)
|
if (FILAMENT_SUPPORTS_OSMESA)
|
||||||
set(OSMESA_COMPILE_FLAGS
|
if (LINUX)
|
||||||
-I${FILAMENT_OSMESA_PATH}/include/GL)
|
set(OSMESA_COMPILE_FLAGS -I${FILAMENT_OSMESA_PATH}/include/GL)
|
||||||
|
elseif (APPLE)
|
||||||
|
set(OSMESA_COMPILE_FLAGS -I${FILAMENT_OSMESA_PATH}/include)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
|
|||||||
@@ -21,7 +21,12 @@
|
|||||||
|
|
||||||
#include "bluegl/BlueGL.h"
|
#include "bluegl/BlueGL.h"
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
#include <osmesa.h>
|
#include <osmesa.h>
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#undef GLAPI
|
||||||
|
#include <GL/osmesa.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <backend/platforms/OpenGLPlatform.h>
|
#include <backend/platforms/OpenGLPlatform.h>
|
||||||
#include <backend/DriverEnums.h>
|
#include <backend/DriverEnums.h>
|
||||||
|
|||||||
@@ -30,7 +30,11 @@
|
|||||||
#endif
|
#endif
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
#if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3)
|
#if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3)
|
||||||
#include <backend/platforms/PlatformCocoaGL.h>
|
#if defined(FILAMENT_SUPPORTS_OSMESA)
|
||||||
|
#include <backend/platforms/PlatformOSMesa.h>
|
||||||
|
#else
|
||||||
|
#include <backend/platforms/PlatformCocoaGL.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
#if defined(FILAMENT_SUPPORTS_X11)
|
#if defined(FILAMENT_SUPPORTS_X11)
|
||||||
@@ -132,7 +136,11 @@ Platform* PlatformFactory::create(Backend* backend) noexcept {
|
|||||||
#elif defined(FILAMENT_IOS)
|
#elif defined(FILAMENT_IOS)
|
||||||
return new PlatformCocoaTouchGL();
|
return new PlatformCocoaTouchGL();
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
return new PlatformCocoaGL();
|
#if defined(FILAMENT_SUPPORTS_OSMESA)
|
||||||
|
return new PlatformOSMesa();
|
||||||
|
#else
|
||||||
|
return new PlatformCocoaGL();
|
||||||
|
#endif
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
#if defined(FILAMENT_SUPPORTS_X11)
|
#if defined(FILAMENT_SUPPORTS_X11)
|
||||||
return new PlatformGLX();
|
return new PlatformGLX();
|
||||||
|
|||||||
@@ -22,9 +22,11 @@
|
|||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
// This is to ensure that linking during compilation will not fail even if
|
// This is to ensure that linking during compilation will not fail even if
|
||||||
// OSMesaGetProcAddress is not linked.
|
// OSMesaGetProcAddress is not linked.
|
||||||
__attribute__((weak)) OSMESAproc OSMesaGetProcAddress(char const*);
|
__attribute__((weak)) OSMESAproc OSMesaGetProcAddress(char const*);
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace filament::backend {
|
namespace filament::backend {
|
||||||
|
|
||||||
@@ -48,20 +50,27 @@ struct OSMesaSwapchain {
|
|||||||
|
|
||||||
struct OSMesaAPI {
|
struct OSMesaAPI {
|
||||||
private:
|
private:
|
||||||
using CreateContextFunc = OSMesaContext (*)(GLenum format, OSMesaContext);
|
using CreateContextAttribsFunc = OSMesaContext (*)(const int *, OSMesaContext);
|
||||||
using DestroyContextFunc = GLboolean (*)(OSMesaContext);
|
using DestroyContextFunc = GLboolean (*)(OSMesaContext);
|
||||||
using MakeCurrentFunc = GLboolean (*)(OSMesaContext ctx, void* buffer, GLenum type,
|
using MakeCurrentFunc = GLboolean (*)(OSMesaContext ctx, void* buffer, GLenum type,
|
||||||
GLsizei width, GLsizei height);
|
GLsizei width, GLsizei height);
|
||||||
using GetProcAddressFunc = OSMESAproc (*)(const char* funcName);
|
using GetProcAddressFunc = OSMESAproc (*)(const char* funcName);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CreateContextFunc fOSMesaCreateContext;
|
CreateContextAttribsFunc fOSMesaCreateContextAttribs;
|
||||||
DestroyContextFunc fOSMesaDestroyContext;
|
DestroyContextFunc fOSMesaDestroyContext;
|
||||||
MakeCurrentFunc fOSMesaMakeCurrent;
|
MakeCurrentFunc fOSMesaMakeCurrent;
|
||||||
GetProcAddressFunc fOSMesaGetProcAddress;
|
GetProcAddressFunc fOSMesaGetProcAddress;
|
||||||
|
|
||||||
OSMesaAPI() {
|
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) {
|
for (char const* libName: libraryNames) {
|
||||||
mLib = dlopen(libName, RTLD_GLOBAL | RTLD_NOW);
|
mLib = dlopen(libName, RTLD_GLOBAL | RTLD_NOW);
|
||||||
if (mLib) {
|
if (mLib) {
|
||||||
@@ -71,22 +80,24 @@ public:
|
|||||||
if (mLib) {
|
if (mLib) {
|
||||||
// Loading from a libosmesa.os
|
// Loading from a libosmesa.os
|
||||||
fOSMesaGetProcAddress = (GetProcAddressFunc) dlsym(mLib, "OSMesaGetProcAddress");
|
fOSMesaGetProcAddress = (GetProcAddressFunc) dlsym(mLib, "OSMesaGetProcAddress");
|
||||||
} else {
|
}
|
||||||
|
#if defined(__linux__)
|
||||||
|
else {
|
||||||
// Filament is built into a .so
|
// Filament is built into a .so
|
||||||
fOSMesaGetProcAddress = (GetProcAddressFunc) dlsym(RTLD_LOCAL, "OSMesaGetProcAddress");
|
fOSMesaGetProcAddress = (GetProcAddressFunc) dlsym(RTLD_LOCAL, "OSMesaGetProcAddress");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fOSMesaGetProcAddress) {
|
if (!fOSMesaGetProcAddress) {
|
||||||
// Statically linking osmesa
|
// Statically linking osmesa
|
||||||
fOSMesaGetProcAddress = OSMesaGetProcAddress;
|
fOSMesaGetProcAddress = OSMesaGetProcAddress;
|
||||||
}
|
}
|
||||||
|
#endif // __linux__
|
||||||
|
|
||||||
FILAMENT_CHECK_PRECONDITION(fOSMesaGetProcAddress)
|
FILAMENT_CHECK_PRECONDITION(fOSMesaGetProcAddress)
|
||||||
<< "Unable to link against libOSMesa to create a software GL context";
|
<< "Unable to link against libOSMesa to create a software GL context";
|
||||||
|
|
||||||
fOSMesaCreateContext = (CreateContextFunc) fOSMesaGetProcAddress("OSMesaCreateContext");
|
fOSMesaCreateContextAttribs =
|
||||||
fOSMesaDestroyContext =
|
(CreateContextAttribsFunc) fOSMesaGetProcAddress("OSMesaCreateContextAttribs");
|
||||||
(DestroyContextFunc) fOSMesaGetProcAddress("OSMesaDestroyContext");
|
fOSMesaDestroyContext = (DestroyContextFunc) fOSMesaGetProcAddress("OSMesaDestroyContext");
|
||||||
fOSMesaMakeCurrent = (MakeCurrentFunc) fOSMesaGetProcAddress("OSMesaMakeCurrent");
|
fOSMesaMakeCurrent = (MakeCurrentFunc) fOSMesaGetProcAddress("OSMesaMakeCurrent");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,12 +114,22 @@ private:
|
|||||||
|
|
||||||
Driver* PlatformOSMesa::createDriver(void* const sharedGLContext,
|
Driver* PlatformOSMesa::createDriver(void* const sharedGLContext,
|
||||||
const DriverConfig& driverConfig) noexcept {
|
const DriverConfig& driverConfig) noexcept {
|
||||||
|
|
||||||
OSMesaAPI* api = new OSMesaAPI();
|
OSMesaAPI* api = new OSMesaAPI();
|
||||||
mOsMesaApi = api;
|
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)
|
FILAMENT_CHECK_PRECONDITION(sharedGLContext == nullptr)
|
||||||
<< "shared GL context is not supported with PlatformOSMesa";
|
<< "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
|
// We need to do a no-op makecurrent here so that the context will be in a correct state before
|
||||||
// any GL calls.
|
// any GL calls.
|
||||||
|
|||||||
@@ -31,13 +31,17 @@ if (WIN32)
|
|||||||
set(SRCS ${SRCS} src/BlueGLCoreWindowsImpl.S)
|
set(SRCS ${SRCS} src/BlueGLCoreWindowsImpl.S)
|
||||||
endif()
|
endif()
|
||||||
elseif (APPLE AND NOT IOS)
|
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)
|
set(SRCS ${SRCS} src/BlueGLCoreDarwinUniversalImpl.S)
|
||||||
elseif(LINUX)
|
elseif(LINUX)
|
||||||
if(FILAMENT_SUPPORTS_EGL_ON_LINUX)
|
if (FILAMENT_SUPPORTS_EGL_ON_LINUX)
|
||||||
set(SRCS ${SRCS} src/BlueGLLinuxEGL.cpp)
|
set(SRCS ${SRCS} src/BlueGLLinuxEGL.cpp)
|
||||||
elseif(FILAMENT_SUPPORTS_OSMESA)
|
elseif (FILAMENT_SUPPORTS_OSMESA)
|
||||||
set(SRCS ${SRCS} src/BlueGLLinuxOSMesa.cpp)
|
set(SRCS ${SRCS} src/BlueGLOSMesa.cpp)
|
||||||
else()
|
else()
|
||||||
set(SRCS ${SRCS} src/BlueGLLinux.cpp)
|
set(SRCS ${SRCS} src/BlueGLLinux.cpp)
|
||||||
endif()
|
endif()
|
||||||
@@ -53,7 +57,11 @@ include_directories(${PUBLIC_HDR_DIR})
|
|||||||
add_library(${TARGET} STATIC ${PUBLIC_HDRS} ${SRCS})
|
add_library(${TARGET} STATIC ${PUBLIC_HDRS} ${SRCS})
|
||||||
|
|
||||||
if(FILAMENT_SUPPORTS_OSMESA)
|
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()
|
endif()
|
||||||
|
|
||||||
# specify where the public headers of this library are
|
# specify where the public headers of this library are
|
||||||
|
|||||||
@@ -17,42 +17,64 @@
|
|||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
|
|
||||||
#include <osmesa.h>
|
#include <osmesa.h>
|
||||||
|
|
||||||
|
// 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 <GL/osmesa.h>
|
||||||
|
|
||||||
|
#endif // __linux__
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace bluegl {
|
namespace bluegl {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
using ProcAddressFunc = void*(*)(char const* funcName);
|
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 {
|
struct Driver {
|
||||||
ProcAddressFunc OSMesaGetProcAddress;
|
ProcAddressFunc OSMesaGetProcAddress;
|
||||||
void* library;
|
void* library;
|
||||||
} g_driver = {nullptr, nullptr};
|
} g_driver = {nullptr, nullptr};
|
||||||
|
|
||||||
bool initBinder() {
|
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) {
|
for (char const* name: libraryNames) {
|
||||||
g_driver.library = dlopen(name, RTLD_GLOBAL | RTLD_NOW);
|
g_driver.library = dlopen(name, RTLD_GLOBAL | RTLD_NOW);
|
||||||
if (g_driver.library) {
|
if (g_driver.library) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!g_driver.library) {
|
if (g_driver.library) {
|
||||||
// The library has been linked explicitly during compile.
|
// Linking against a libosmesa.so.
|
||||||
g_driver.OSMesaGetProcAddress = (ProcAddressFunc) dlsym(RTLD_LOCAL, "OSMesaGetProcAddress");
|
|
||||||
} else {
|
|
||||||
g_driver.OSMesaGetProcAddress =
|
g_driver.OSMesaGetProcAddress =
|
||||||
(ProcAddressFunc) dlsym(g_driver.library, "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 (!g_driver.OSMesaGetProcAddress) {
|
||||||
|
// If statically linking OSMesa.
|
||||||
g_driver.OSMesaGetProcAddress = (ProcAddressFunc) OSMesaGetProcAddress;
|
g_driver.OSMesaGetProcAddress = (ProcAddressFunc) OSMesaGetProcAddress;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return g_driver.OSMesaGetProcAddress;
|
return g_driver.OSMesaGetProcAddress;
|
||||||
}
|
}
|
||||||
@@ -46,7 +46,12 @@ def render_test(gltf_viewer, test_config, output_dir,
|
|||||||
for backend in test_config.backends:
|
for backend in test_config.backends:
|
||||||
env = None
|
env = None
|
||||||
if backend == 'opengl' and opengl_lib and os.path.isdir(opengl_lib):
|
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:
|
for model in test.models:
|
||||||
model_path = test_config.models[model]
|
model_path = test_config.models[model]
|
||||||
|
|||||||
@@ -18,11 +18,19 @@ OUTPUT_DIR="$(pwd)/out/renderdiff_tests"
|
|||||||
RENDERDIFF_TEST_DIR="$(pwd)/test/renderdiff"
|
RENDERDIFF_TEST_DIR="$(pwd)/test/renderdiff"
|
||||||
TEST_UTILS_DIR="$(pwd)/test/utils"
|
TEST_UTILS_DIR="$(pwd)/test/utils"
|
||||||
MESA_DIR="$(pwd)/mesa/out/"
|
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() {
|
function prepare_mesa() {
|
||||||
if [ ! -d ${MESA_LIB_DIR} ]; then
|
if [ ! -d ${MESA_LIB_DIR} ]; then
|
||||||
rm -rf mesa
|
|
||||||
bash ${TEST_UTILS_DIR}/get_mesa.sh
|
bash ${TEST_UTILS_DIR}/get_mesa.sh
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,55 +17,97 @@
|
|||||||
set -xe
|
set -xe
|
||||||
|
|
||||||
# GITHUB_CLANG_VERSION is set in build/linux/ci-common.sh
|
# 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
|
if [[ "$os_name" == "Linux" ]]; then
|
||||||
# We only want to do this if it is a CI machine.
|
if [[ "$GITHUB_WORKFLOW" ]]; then
|
||||||
sudo apt-get -y remove llvm-*
|
# 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`
|
# 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
|
# 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
|
# is constantly being updated and sometimes not compatible with the current
|
||||||
# linux platform.
|
# linux platform.
|
||||||
# Note that we assume this platform is compatible with ubuntu-22.04 x86_64
|
# Note that we assume this platform is compatible with ubuntu-22.04 x86_64
|
||||||
sudo apt-get -y install \
|
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 \
|
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
|
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/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/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
|
else
|
||||||
set +e
|
CHECKOUT_MESA=true
|
||||||
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}
|
|
||||||
fi
|
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 git://anongit.freedesktop.org/mesa/mesa
|
||||||
git clone https://gitlab.freedesktop.org/mesa/mesa.git
|
mv mesa ${MESA_DIR}
|
||||||
|
# Due to gitlab mesa outage.
|
||||||
|
fi
|
||||||
|
|
||||||
pushd .
|
pushd .
|
||||||
|
cd ${MESA_DIR}
|
||||||
|
|
||||||
cd mesa
|
# Need >= 24 to have llvmpipe for swrast. llvmpipe is needed for GL >= 4.1.
|
||||||
|
git checkout mesa-24.2.1
|
||||||
git checkout mesa-23.2.1
|
|
||||||
|
|
||||||
mkdir -p out
|
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
|
# -Dosmesa=true => builds OSMesa, which is an offscreen GL context
|
||||||
# -Dgallium-drivers=swrast => builds GL software rasterizer
|
# -Dgallium-drivers=swrast => builds GL software rasterizer
|
||||||
# -Dvulkan-drivers=swrast => builds VK 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
|
# -Dgallium-drivers=llvmpipe is needed for GL >= 4.1 (see src/gallium/auxiliary/target-helpers/inline_sw_helper.h)
|
||||||
meson install -C builddir/
|
# 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
|
popd
|
||||||
|
|||||||
Reference in New Issue
Block a user