Use actions/cache for vcpkg binary cache and fix Windows integration with Mesa3D (#3422)

This commit is contained in:
tdcosta100
2025-04-30 15:15:40 -03:00
committed by GitHub
parent 6491d98b63
commit ca4e02c123
17 changed files with 282 additions and 286 deletions

View File

@@ -1,65 +0,0 @@
# Standard FIND_PACKAGE module for OSMesa, sets the following variables:
# - OSMesa_FOUND
# - OSMesa_INCLUDE_DIRS (only if OSMesa_FOUND)
# - OSMesa_LIBRARIES (only if OSMesa_FOUND)
# Try to find the header
find_path(OSMesa_INCLUDE_DIR NAMES GL/osmesa.h)
get_filename_component(OSMesa_DIR ${OSMesa_INCLUDE_DIR}/../ ABSOLUTE)
# Try to find the library
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(_ARCH x64)
else()
set(_ARCH x86)
endif()
find_library(OSMesa_osmesa_LIBRARY NAMES osmesa PATHS ${OSMesa_DIR}/lib PATH_SUFFIXES ${_ARCH} NO_DEFAULT_PATH)
find_library(OSMesa_libGLESv2_LIBRARY NAMES libGLESv2 PATHS ${OSMesa_DIR}/lib PATH_SUFFIXES ${_ARCH} NO_DEFAULT_PATH)
find_file(OSMesa_osmesa_LIBRARY_DLL NAMES osmesa.dll PATHS ${OSMesa_DIR} PATH_SUFFIXES ${_ARCH} NO_DEFAULT_PATH)
find_file(OSMesa_libGLESv2_LIBRARY_DLL NAMES libGLESv2.dll PATHS ${OSMesa_DIR} PATH_SUFFIXES ${_ARCH} NO_DEFAULT_PATH)
unset(_ARCH)
# Handle the QUIETLY/REQUIRED arguments, set OSMesa_FOUND if all variables are
# found
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(OSMesa
REQUIRED_VARS
OSMesa_osmesa_LIBRARY
OSMesa_libGLESv2_LIBRARY
OSMesa_INCLUDE_DIR)
# Hide internal variables
mark_as_advanced(OSMesa_INCLUDE_DIR OSMesa_osmesa_LIBRARY OSMesa_libGLESv2_LIBRARY)
# Set standard variables
if(OSMesa_FOUND)
set(OSMesa_INCLUDE_DIRS "${OSMesa_INCLUDE_DIR}")
set(OSMesa_LIBRARIES
"${OSMesa_osmesa_LIBRARY}"
"${OSMesa_libGLESv2_LIBRARY}"
)
add_library(OSMesa::osmesa SHARED IMPORTED)
set_target_properties(
OSMesa::osmesa
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${OSMesa_INCLUDE_DIRS}
IMPORTED_IMPLIB ${OSMesa_osmesa_LIBRARY}
IMPORTED_LOCATION ${OSMesa_osmesa_LIBRARY_DLL}
)
add_library(OSMesa::libGLESv2 SHARED IMPORTED)
set_target_properties(
OSMesa::libGLESv2
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${OSMesa_INCLUDE_DIRS}
IMPORTED_IMPLIB ${OSMesa_libGLESv2_LIBRARY}
IMPORTED_LOCATION ${OSMesa_libGLESv2_LIBRARY_DLL}
)
endif()

View File

@@ -5,6 +5,8 @@ param(
Set-Location (Split-Path $MyInvocation.MyCommand.Path -Parent)
Copy-Item ('{0}\*' -f [System.IO.Path]::Combine($PWD.Path, 'vendor', 'vcpkg-custom-ports')) -Force -Recurse -Destination ('{0}\ports\' -f [System.IO.Path]::Combine($PWD.Path, 'vendor', 'vcpkg'))
$vcpkg_temp_dir = '***'
foreach($letter in [byte][char]'Z'..[byte][char]'A')
@@ -22,7 +24,6 @@ foreach($letter in [byte][char]'Z'..[byte][char]'A')
switch($Renderer)
{
'EGL' { $renderer_packages = @('egl', 'opengl-registry'); break }
'OSMesa' { $renderer_packages = @(); break }
'OpenGL' { $renderer_packages = @('opengl-registry'); break }
'Vulkan' { $renderer_packages = @(); break }
'All' { $renderer_packages = @('egl', 'opengl-registry'); break }
@@ -35,7 +36,6 @@ if(-not (Test-Path ('{0}\vcpkg.exe' -f $vcpkg_temp_dir)))
& ('{0}\vcpkg.exe' -f $vcpkg_temp_dir) $(
@(
'--debug',
'--disable-metrics',
('--overlay-triplets={0}' -f [System.IO.Path]::Combine($PWD.Path, 'vendor', 'vcpkg-custom-triplets')),
('--triplet={0}' -f $Triplet),
@@ -45,12 +45,3 @@ if(-not (Test-Path ('{0}\vcpkg.exe' -f $vcpkg_temp_dir)))
)
subst $vcpkg_temp_dir /D
if($Renderer -eq 'OSMesa' -and -not (Test-Path ([System.IO.Path]::Combine($PWD.Path, 'vendor', 'mesa3d'))))
{
New-Item -Name temp -Type Directory | Out-Null
Invoke-WebRequest https://www.7-zip.org/a/7zr.exe -OutFile ([System.IO.Path]::Combine($PWD.Path, 'temp', '7zr.exe'))
(Invoke-WebRequest https://api.github.com/repos/pal1000/mesa-dist-win/releases | ConvertFrom-Json)[0].assets | Where-Object name -match 'mesa3d-.+-(release|devel)-msvc\.7z' | foreach { Invoke-WebRequest $_.browser_download_url -OutFile ([System.IO.Path]::Combine($PWD.Path, 'temp', $_.name)) }
Get-ChildItem 'temp\*.7z' | foreach { .\temp\7zr.exe x -ovendor\mesa3d $_.FullName }
Remove-Item temp -Recurse
}

View File

@@ -40,14 +40,6 @@ To configure build with EGL support (ANGLE libraries will be build), use the fol
cmake . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DMLN_WITH_EGL=ON
```
To configure build with OSMesa (software rendering), use the following command:
```
cmake . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DMLN_WITH_OSMESA=ON
```
**WARNING:** as OSMesa doesn't have static libraries, it's necessary to copy `libglapi.dll`, `libGLESv2.dll` and `osmesa.dll` from `platform\windows\vendor\mesa3d\<arch>` to executable/dll directory you want to use, otherwise it won't run.
## Building
Finally, build the project with the following command:
@@ -69,10 +61,6 @@ The same can be done with alternative configure commands:
```cmd
cmake . -B build -DMLN_WITH_EGL=ON
```
or
```cmd
cmake . -B build -DMLN_WITH_OSMESA=ON
```
Once configure is done, open the file `build\Mapbox GL Native.sln`. Build the target `ALL_BUILD` to build all targets, or pick a specific target. Don't forget to pick a build configuration (`Release`, `RelWithDebInfo`, `MinSizeRel` or `Debug`), otherwise the project will be built with default configuration (`Debug`).

View File

@@ -1,56 +0,0 @@
#include <mbgl/util/logging.hpp>
#include <cassert>
#include <mbgl/gl/headless_backend.hpp>
#include <GL/osmesa.h>
namespace mbgl {
namespace gl {
// This class provides a singleton that contains information about the
// configuration used for instantiating new headless rendering contexts.
class OSMesaBackendImpl final : public HeadlessBackend::Impl {
public:
OSMesaBackendImpl()
: buffer(std::make_unique<uint8_t[]>(2048 * 2048 * 4)),
context(OSMesaCreateContextAttribs(std::initializer_list<int>({OSMESA_FORMAT,
OSMESA_RGBA,
OSMESA_DEPTH_BITS,
24,
OSMESA_STENCIL_BITS,
8,
OSMESA_PROFILE,
OSMESA_COMPAT_PROFILE,
OSMESA_CONTEXT_MAJOR_VERSION,
3,
OSMESA_CONTEXT_MINOR_VERSION,
0,
NULL})
.begin(),
nullptr)) {}
~OSMesaBackendImpl() final { OSMesaDestroyContext(context); }
gl::ProcAddress getExtensionFunctionPointer(const char* name) final {
return (ProcAddress)::OSMesaGetProcAddress(name);
}
void activateContext() final { OSMesaMakeCurrent(context, buffer.get(), GL_UNSIGNED_BYTE, 2048, 2048); }
void deactivateContext() final { OSMesaMakeCurrent(nullptr, nullptr, GL_UNSIGNED_BYTE, 0, 0); }
private:
std::unique_ptr<uint8_t[]> buffer;
OSMesaContext context;
};
void HeadlessBackend::createImpl() {
assert(!impl);
impl = std::make_unique<OSMesaBackendImpl>();
}
} // namespace gl
} // namespace mbgl

View File

@@ -0,0 +1,13 @@
diff --git a/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp b/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
index b83b8971a6..a2c24cdb31 100644
--- a/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
+++ b/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
@@ -128,7 +128,7 @@ egl::Error DisplayWGL::initializeImpl(egl::Display *display)
{
mDisplayAttributes = display->getAttributeMap();
- mOpenGLModule = LoadLibraryExA("opengl32.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
+ mOpenGLModule = LoadLibraryExA("opengl32.dll", NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32);
if (!mOpenGLModule)
{
return egl::EglNotInitialized() << "Failed to load OpenGL library.";

View File

@@ -0,0 +1,194 @@
if (VCPKG_TARGET_IS_LINUX)
message(WARNING "Building with a gcc version less than 6.1 is not supported.")
message(WARNING "${PORT} currently requires the following libraries from the system package manager:\n libx11-dev\n mesa-common-dev\n libxi-dev\n libxext-dev\n\nThese can be installed on Ubuntu systems via apt-get install libx11-dev mesa-common-dev libxi-dev libxext-dev.")
endif()
if (VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
set(ANGLE_CPU_BITNESS ANGLE_IS_32_BIT_CPU)
elseif (VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
set(ANGLE_CPU_BITNESS ANGLE_IS_64_BIT_CPU)
elseif (VCPKG_TARGET_ARCHITECTURE STREQUAL "arm")
set(ANGLE_CPU_BITNESS ANGLE_IS_32_BIT_CPU)
elseif (VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64")
set(ANGLE_CPU_BITNESS ANGLE_IS_64_BIT_CPU)
else()
message(FATAL_ERROR "Unsupported architecture: ${VCPKG_TARGET_ARCHITECTURE}")
endif()
set(ANGLE_USE_D3D11_COMPOSITOR_NATIVE_WINDOW "OFF")
if (VCPKG_TARGET_IS_WINDOWS OR VCPKG_TARGET_IS_UWP)
set(ANGLE_BUILDSYSTEM_PORT "Win")
if (NOT VCPKG_TARGET_IS_MINGW)
set(ANGLE_USE_D3D11_COMPOSITOR_NATIVE_WINDOW "ON")
endif()
elseif (VCPKG_TARGET_IS_OSX)
set(ANGLE_BUILDSYSTEM_PORT "Mac")
elseif (VCPKG_TARGET_IS_LINUX)
set(ANGLE_BUILDSYSTEM_PORT "Linux")
else()
# default other platforms to "Linux" config
set(ANGLE_BUILDSYSTEM_PORT "Linux")
endif()
# chromium/5414
set(ANGLE_COMMIT aa63ea230e0c507e7b4b164a30e502fb17168c17)
set(ANGLE_VERSION 5414)
set(ANGLE_SHA512 a3b55d4b484e1e9ece515d60af1d47a80a0576b198d9a2397e4e68b16efd83468dcdfadc98dae57ff17f01d02d74526f8b59fdf00661b70a45b6dd266e5ffe38)
set(ANGLE_THIRDPARTY_ZLIB_COMMIT 44d9b490c721abdb923d5c6c23ac211e45ffb1a5)
vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO google/angle
REF ${ANGLE_COMMIT}
SHA512 ${ANGLE_SHA512}
# On update check headers against opengl-registry
PATCHES
001-fix-uwp.patch
002-fix-builder-error.patch
003-fix-mingw.patch
004-fix-opengl32.dll-load.patch
)
# Generate angle_commit.h
set(ANGLE_COMMIT_HASH_SIZE 12)
string(SUBSTRING "${ANGLE_COMMIT}" 0 ${ANGLE_COMMIT_HASH_SIZE} ANGLE_COMMIT_HASH)
set(ANGLE_COMMIT_DATE "invalid-date")
set(ANGLE_REVISION "${ANGLE_VERSION}")
configure_file("${CMAKE_CURRENT_LIST_DIR}/angle_commit.h.in" "${SOURCE_PATH}/angle_commit.h" @ONLY)
configure_file("${CMAKE_CURRENT_LIST_DIR}/angle_commit.h.in" "${SOURCE_PATH}/src/common/angle_commit.h" @ONLY)
file(COPY "${CMAKE_CURRENT_LIST_DIR}/unofficial-angle-config.cmake" DESTINATION "${SOURCE_PATH}")
set(ANGLE_WEBKIT_BUILDSYSTEM_COMMIT "bb1da00b9ba878d228a5e9834a0767dbca2fee43")
# Download WebKit gni-to-cmake.py conversion script
vcpkg_download_distfile(GNI_TO_CMAKE_PY
URLS "https://github.com/WebKit/WebKit/raw/${ANGLE_WEBKIT_BUILDSYSTEM_COMMIT}/Source/ThirdParty/ANGLE/gni-to-cmake.py"
FILENAME "gni-to-cmake.py"
SHA512 9da35caf2db2e849d6cc85721ba0b77eee06b6f65a7c5314fb80483db4949b0b6e9bf4b2d4fc63613665629b24e9b052e03fb1451b09313d881297771a4f2736
)
# Generate CMake files from GN / GNI files
vcpkg_find_acquire_program(PYTHON3)
set(_root_gni_files_to_convert
"compiler.gni Compiler.cmake"
"libGLESv2.gni GLESv2.cmake"
)
set(_renderer_gn_files_to_convert
"libANGLE/renderer/d3d/BUILD.gn D3D.cmake"
"libANGLE/renderer/gl/BUILD.gn GL.cmake"
"libANGLE/renderer/metal/BUILD.gn Metal.cmake"
)
foreach(_root_gni_file IN LISTS _root_gni_files_to_convert)
separate_arguments(_file_values UNIX_COMMAND "${_root_gni_file}")
list(GET _file_values 0 _src_gn_file)
list(GET _file_values 1 _dst_file)
vcpkg_execute_required_process(
COMMAND "${PYTHON3}" "${GNI_TO_CMAKE_PY}" "src/${_src_gn_file}" "${_dst_file}"
WORKING_DIRECTORY "${SOURCE_PATH}"
LOGNAME "gni-to-cmake-${_dst_file}-${TARGET_TRIPLET}"
)
endforeach()
foreach(_renderer_gn_file IN LISTS _renderer_gn_files_to_convert)
separate_arguments(_file_values UNIX_COMMAND "${_renderer_gn_file}")
list(GET _file_values 0 _src_gn_file)
list(GET _file_values 1 _dst_file)
get_filename_component(_src_dir "${_src_gn_file}" DIRECTORY)
vcpkg_execute_required_process(
COMMAND "${PYTHON3}" "${GNI_TO_CMAKE_PY}" "src/${_src_gn_file}" "${_dst_file}" --prepend "src/${_src_dir}/"
WORKING_DIRECTORY "${SOURCE_PATH}"
LOGNAME "gni-to-cmake-${_dst_file}-${TARGET_TRIPLET}"
)
endforeach()
# Fetch additional CMake files from WebKit ANGLE buildsystem
vcpkg_download_distfile(WK_ANGLE_INCLUDE_CMAKELISTS
URLS "https://github.com/WebKit/WebKit/raw/${ANGLE_WEBKIT_BUILDSYSTEM_COMMIT}/Source/ThirdParty/ANGLE/include/CMakeLists.txt"
FILENAME "include_CMakeLists.txt"
SHA512 a7ddf3c6df7565e232f87ec651cc4fd84240b8866609e23e3e6e41d22532fd34c70e0f3b06120fd3d6d930ca29c1d0d470d4c8cb7003a66f8c1a840a42f32949
)
configure_file("${WK_ANGLE_INCLUDE_CMAKELISTS}" "${SOURCE_PATH}/include/CMakeLists.txt" COPYONLY)
vcpkg_download_distfile(WK_ANGLE_CMAKE_WEBKITCOMPILERFLAGS
URLS "https://github.com/WebKit/WebKit/raw/${ANGLE_WEBKIT_BUILDSYSTEM_COMMIT}/Source/cmake/WebKitCompilerFlags.cmake"
FILENAME "WebKitCompilerFlags.cmake"
SHA512 63f981694ae37d4c4ca4c34e2bf62b4d4602b6a1a660851304fa7a6ee834fc58fa6730eeb41ef4e075550f3c8b675823d4d00bdcd72ca869c6d5ab11196b33bb
)
file(COPY "${WK_ANGLE_CMAKE_WEBKITCOMPILERFLAGS}" DESTINATION "${SOURCE_PATH}/cmake")
vcpkg_download_distfile(WK_ANGLE_CMAKE_DETECTSSE2
URLS "https://github.com/WebKit/WebKit/raw/${ANGLE_WEBKIT_BUILDSYSTEM_COMMIT}/Source/cmake/DetectSSE2.cmake"
FILENAME "DetectSSE2.cmake"
SHA512 219a4c8591ee31d11eb3d1e4803cc3c9d4573984bb25ecac6f2c76e6a3dab598c00b0157d0f94b18016de6786e49d8b29a161693a5ce23d761c8fe6a798c1bca
)
file(COPY "${WK_ANGLE_CMAKE_DETECTSSE2}" DESTINATION "${SOURCE_PATH}/cmake")
vcpkg_download_distfile(WK_ANGLE_CMAKE_WEBKITMACROS
URLS "https://github.com/WebKit/WebKit/raw/${ANGLE_WEBKIT_BUILDSYSTEM_COMMIT}/Source/cmake/WebKitMacros.cmake"
FILENAME "WebKitMacros.cmake"
SHA512 0d126b1d1b0ca995c2ea6e51c73326db363f560f3f07912ce58c7c022d9257d27b963dac56aee0e9604ca7a3d74c5aa9f0451c243fec922fb485dd2253685ab6
)
file(COPY "${WK_ANGLE_CMAKE_WEBKITMACROS}" DESTINATION "${SOURCE_PATH}/cmake")
# Copy additional custom CMake buildsystem into appropriate folders
file(GLOB MAIN_BUILDSYSTEM "${CMAKE_CURRENT_LIST_DIR}/cmake-buildsystem/CMakeLists.txt" "${CMAKE_CURRENT_LIST_DIR}/cmake-buildsystem/*.cmake")
file(COPY ${MAIN_BUILDSYSTEM} DESTINATION "${SOURCE_PATH}")
file(GLOB MODULES "${CMAKE_CURRENT_LIST_DIR}/cmake-buildsystem/cmake/*.cmake")
file(COPY ${MODULES} DESTINATION "${SOURCE_PATH}/cmake")
function(checkout_in_path PATH URL REF)
if(EXISTS "${PATH}")
return()
endif()
vcpkg_from_git(
OUT_SOURCE_PATH DEP_SOURCE_PATH
URL "${URL}"
REF "${REF}"
)
file(RENAME "${DEP_SOURCE_PATH}" "${PATH}")
file(REMOVE_RECURSE "${DEP_SOURCE_PATH}")
endfunction()
checkout_in_path(
"${SOURCE_PATH}/third_party/zlib"
"https://chromium.googlesource.com/chromium/src/third_party/zlib"
"${ANGLE_THIRDPARTY_ZLIB_COMMIT}"
)
vcpkg_cmake_configure(
SOURCE_PATH "${SOURCE_PATH}"
OPTIONS_DEBUG -DDISABLE_INSTALL_HEADERS=1
OPTIONS
"-D${ANGLE_CPU_BITNESS}=1"
"-DPORT=${ANGLE_BUILDSYSTEM_PORT}"
"-DANGLE_USE_D3D11_COMPOSITOR_NATIVE_WINDOW=${ANGLE_USE_D3D11_COMPOSITOR_NATIVE_WINDOW}"
"-DVCPKG_TARGET_IS_WINDOWS=${VCPKG_TARGET_IS_WINDOWS}"
)
vcpkg_cmake_install()
vcpkg_cmake_config_fixup(CONFIG_PATH share/unofficial-angle PACKAGE_NAME unofficial-angle)
vcpkg_copy_pdbs()
file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
# Remove empty directories inside include directory
file(GLOB directory_children RELATIVE "${CURRENT_PACKAGES_DIR}/include" "${CURRENT_PACKAGES_DIR}/include/*")
foreach(directory_child ${directory_children})
if(IS_DIRECTORY "${CURRENT_PACKAGES_DIR}/include/${directory_child}")
file(GLOB_RECURSE subdirectory_children "${CURRENT_PACKAGES_DIR}/include/${directory_child}/*")
if("${subdirectory_children}" STREQUAL "")
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/include/${directory_child}")
endif()
endif()
endforeach()
unset(subdirectory_children)
unset(directory_child)
unset(directory_children)
file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")

View File

@@ -1,7 +1,5 @@
if(MLN_WITH_EGL)
set(_RENDERER EGL)
elseif(MLN_WITH_OSMESA)
set(_RENDERER OSMesa)
elseif(MLN_WITH_VULKAN)
set(_RENDERER Vulkan)
else()
@@ -107,29 +105,6 @@ if(MLN_WITH_EGL)
unofficial::angle::libEGL
unofficial::angle::libGLESv2
)
elseif(MLN_WITH_OSMESA)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_LIST_DIR}/vendor/mesa3d)
find_package(OSMesa REQUIRED)
target_sources(
mbgl-core
PRIVATE
${PROJECT_SOURCE_DIR}/platform/windows/src/headless_backend_osmesa.cpp
${PROJECT_SOURCE_DIR}/platform/windows/src/gl_functions.cpp
)
set_property(
SOURCE ${PROJECT_SOURCE_DIR}/platform/windows/src/headless_backend_osmesa.cpp
PROPERTY INCLUDE_DIRECTORIES ${OSMesa_INCLUDE_DIRS}
)
target_link_libraries(
mbgl-core
PRIVATE
OSMesa::osmesa
OSMesa::libGLESv2
)
elseif(MLN_WITH_VULKAN)
target_sources(
mbgl-core