From ca4e02c1232570bd00135fe0194892f8773d1b97 Mon Sep 17 00:00:00 2001 From: tdcosta100 Date: Wed, 30 Apr 2025 15:15:40 -0300 Subject: [PATCH] Use actions/cache for vcpkg binary cache and fix Windows integration with Mesa3D (#3422) --- .../scripts/windows-ci_configure_wrapper.ps1 | 1 - .github/workflows/node-ci.yml | 6 +- .github/workflows/windows-ci.yml | 98 +++++---- .gitignore | 1 - .pre-commit-config.yaml | 2 +- CMakeLists.txt | 1 - metrics/ignores/windows-egl.json | 19 +- .../src/mbgl/gl/headless_backend_osmesa.cpp | 45 ---- platform/glfw/CMakeLists.txt | 5 - platform/node/cmake/module.cmake | 12 -- platform/windows/FindOSMesa.cmake | 65 ------ platform/windows/Get-VendorPackages.ps1 | 13 +- platform/windows/README.md | 12 -- .../windows/src/headless_backend_osmesa.cpp | 56 ----- .../angle/004-fix-opengl32.dll-load.patch | 13 ++ .../vcpkg-custom-ports/angle/portfile.cmake | 194 ++++++++++++++++++ platform/windows/windows.cmake | 25 --- 17 files changed, 282 insertions(+), 286 deletions(-) delete mode 100644 platform/default/src/mbgl/gl/headless_backend_osmesa.cpp delete mode 100644 platform/windows/FindOSMesa.cmake delete mode 100644 platform/windows/src/headless_backend_osmesa.cpp create mode 100644 platform/windows/vendor/vcpkg-custom-ports/angle/004-fix-opengl32.dll-load.patch create mode 100644 platform/windows/vendor/vcpkg-custom-ports/angle/portfile.cmake diff --git a/.github/scripts/windows-ci_configure_wrapper.ps1 b/.github/scripts/windows-ci_configure_wrapper.ps1 index d91c71c0c..27e48588c 100644 --- a/.github/scripts/windows-ci_configure_wrapper.ps1 +++ b/.github/scripts/windows-ci_configure_wrapper.ps1 @@ -9,7 +9,6 @@ switch ($env:RENDERER) 'opengl' { $compile_flags += '-DMLN_WITH_OPENGL=ON'; break; } 'egl' { $compile_flags += '-DMLN_WITH_EGL=ON' ; break; } 'vulkan' { $compile_flags += @('-DMLN_WITH_VULKAN=ON', '-DMLN_WITH_OPENGL=OFF'); break; } - 'osmesa' { $compile_flags += '-DMLN_WITH_OSMESA=ON'; break; } } Write-Host 'Compile flags: ' $compile_flags diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 33d05ff48..0f50fafc8 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -277,10 +277,10 @@ jobs: working-directory: platform/node env: LIBGL_ALWAYS_SOFTWARE: true - GALLIUM_DRIVER: softpipe + GALLIUM_DRIVER: llvmpipe run: | - Invoke-WebRequest https://github.com/pal1000/mesa-dist-win/releases/download/22.3.5/mesa3d-22.3.5-release-msvc.7z -OutFile mesa3d.7z - & 'C:\Program Files\7-Zip\7z.exe' e -olib\node-v131 .\mesa3d.7z x64\opengl32.dll x64\libgallium_wgl.dll x64\libGLESv2.dll x64\libglapi.dll + (Invoke-WebRequest https://api.github.com/repos/pal1000/mesa-dist-win/releases -Headers @{ Authorization = ('Bearer {0}' -f '${{ secrets.GITHUB_TOKEN }}') } | ConvertFrom-Json)[0].assets | Where-Object name -match 'mesa3d-.+-(release|devel)-msvc\.7z' | foreach { Invoke-WebRequest $_.browser_download_url -OutFile mesa3d.7z } + & 'C:\Program Files\7-Zip\7z.exe' e -olib\node-v131 .\mesa3d.7z x64\opengl32.dll x64\libgallium_wgl.dll x64\libGLESv2.dll npm test # On PRs make sure that the npm package can be packaged. diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index fd0c613d8..78641324e 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -64,30 +64,46 @@ jobs: with: submodules: recursive - - uses: ilammy/msvc-dev-cmd@v1 + - name: Get vcpkg commit id + run: | + $vcpkg_commit_id = ($(git submodule status .\platform\windows\vendor\vcpkg).Trim() -split ' ')[0] + Add-Content -Path $env:GITHUB_ENV -Value "VCPKG_COMMIT_ID=${vcpkg_commit_id}" - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v7 + - name: Restore vcpkg binary cache + id: vcpkg-cache + uses: actions/cache/restore@v4 with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + path: ${{ github.workspace }}\platform\windows\vendor\vcpkg\archives + key: vcpkg-${{ env.VCPKG_COMMIT_ID }} + lookup-only: true + + - uses: ilammy/msvc-dev-cmd@v1 + if: steps.vcpkg-cache.outputs.cache-hit != 'true' - name: Acquire/Build Maplibre Native Core Dependencies + if: steps.vcpkg-cache.outputs.cache-hit != 'true' env: CI: 1, - VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" - timeout-minutes: 120 +# VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" + VCPKG_BINARY_SOURCES: "clear;files,${{ github.workspace }}\\platform\\windows\\vendor\\vcpkg\\archives,readwrite" + timeout-minutes: 60 run: | & ${{ github.workspace }}\platform\windows\Get-VendorPackages.ps1 -Triplet ${{ env.VSCMD_ARG_TGT_ARCH }}-windows -Renderer All + - name: Save vcpkg binary cache + if: steps.vcpkg-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + path: ${{ github.workspace }}\platform\windows\vendor\vcpkg\archives + key: vcpkg-${{ env.VCPKG_COMMIT_ID }} + windows-build-and-test: # if: needs.pre-job.outputs.should_skip != 'true' needs: windows-get-or-build-dependencies strategy: matrix: - renderer: [opengl, egl, vulkan, osmesa] + renderer: [opengl, egl, vulkan] runs-on: windows-2022 steps: - run: | @@ -96,7 +112,6 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive - fetch-depth: 0 - name: Initialize CodeQL uses: github/codeql-action/init@v3 @@ -105,13 +120,6 @@ jobs: - uses: ilammy/msvc-dev-cmd@v1 - - name: Export GitHub Actions cache environment variables - uses: actions/github-script@v7 - with: - script: | - core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); - core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - uses: mozilla-actions/sccache-action@v0.0.9 - name: Initialize sccache @@ -119,16 +127,27 @@ jobs: & $env:SCCACHE_PATH --start-server & $env:SCCACHE_PATH --zero-stats + - name: Get vcpkg commit id + run: | + $vcpkg_commit_id = ($(git submodule status .\platform\windows\vendor\vcpkg).Trim() -split ' ')[0] + Add-Content -Path $env:GITHUB_ENV -Value "VCPKG_COMMIT_ID=${vcpkg_commit_id}" + + - name: Restore vcpkg binary cache + uses: actions/cache/restore@v4 + with: + path: ${{ github.workspace }}\platform\windows\vendor\vcpkg\archives + key: vcpkg-${{ env.VCPKG_COMMIT_ID }} + - name: Configure MapLibre Native Core env: CI: 1 VCPKG_INSTALL_OPTIONS: "--debug" - VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" -# VCPKG_KEEP_ENV_VARS: "CMAKE_CXX_COMPILER_LAUNCHER;CMAKE_C_COMPILER_LAUNCHER" +# VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" + VCPKG_BINARY_SOURCES: "clear;files,${{ github.workspace }}\\platform\\windows\\vendor\\vcpkg\\archives,readwrite" CMAKE_C_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" CMAKE_CXX_COMPILER_LAUNCHER: "${{ env.SCCACHE_PATH }}" RENDERER: "${{ matrix.renderer }}" - timeout-minutes: 120 + timeout-minutes: 60 run: | cmake --version & ${{ github.workspace }}\.github\scripts\windows-ci_configure_wrapper.ps1 @@ -145,29 +164,28 @@ jobs: category: "/language:cpp" - name: Download Mesa3D - if: matrix.renderer != 'egl' run: | - Invoke-WebRequest https://github.com/pal1000/mesa-dist-win/releases/download/24.2.5/mesa3d-24.2.5-release-msvc.7z -OutFile mesa3d.7z + (Invoke-WebRequest https://api.github.com/repos/pal1000/mesa-dist-win/releases -Headers @{ Authorization = ('Bearer {0}' -f '${{ secrets.GITHUB_TOKEN }}') } | ConvertFrom-Json)[0].assets | Where-Object name -match 'mesa3d-.+-(release|devel)-msvc\.7z' | foreach { Invoke-WebRequest $_.browser_download_url -OutFile mesa3d.7z } - name: Extract Mesa3D files for OpenGL - if: matrix.renderer != 'egl' && matrix.renderer != 'vulkan' + if: matrix.renderer != 'vulkan' run: | - & 'C:\Program Files\7-Zip\7z.exe' e -obuild .\mesa3d.7z x64\opengl32.dll x64\libgallium_wgl.dll x64\libGLESv2.dll x64\libglapi.dll + & 'C:\Program Files\7-Zip\7z.exe' e -bb3 -obuild .\mesa3d.7z x64\opengl32.dll x64\libgallium_wgl.dll x64\libGLESv2.dll + + - name: Extract Mesa3D files for EGL + if: matrix.renderer == 'egl' + run: | + & 'C:\Program Files\7-Zip\7z.exe' e -bb3 -obuild .\mesa3d.7z x64\d3d10warp.dll - name: Extract Mesa3D files for Vulkan - if: matrix.renderer != 'egl' && matrix.renderer == 'vulkan' + if: matrix.renderer == 'vulkan' run: | - & 'C:\Program Files\7-Zip\7z.exe' e -obuild .\mesa3d.7z x64\lvp_icd.x86_64.json x64\vulkan_lvp.dll - - - name: Extract Mesa3D files for OSMesa - if: matrix.renderer == 'osmesa' - run: | - & 'C:\Program Files\7-Zip\7z.exe' e -obuild .\mesa3d.7z x64\osmesa.dll + & 'C:\Program Files\7-Zip\7z.exe' e -bb3 -obuild .\mesa3d.7z x64\lvp_icd.x86_64.json x64\vulkan_lvp.dll # unit tests - name: Configure Mesa3D drivers (OpenGL) - if: matrix.renderer != 'egl' && matrix.renderer != 'vulkan' + if: matrix.renderer != 'vulkan' run: | Add-Content -Path $env:GITHUB_ENV -Value 'GALLIUM_DRIVER=llvmpipe' @@ -179,11 +197,16 @@ jobs: - name: Download and configure Vulkan if: matrix.renderer == 'vulkan' run: | - Invoke-WebRequest https://sdk.lunarg.com/sdk/download/1.3.296.0/windows/VulkanRT-1.3.296.0-Components.zip -OutFile VulkanRT.zip - & 'C:\Program Files\7-Zip\7z.exe' e -obuild -r .\VulkanRT.zip *x64\vulkan-1.dll + $version = (Invoke-WebRequest -Uri "https://vulkan.lunarg.com/sdk/latest.json" | ConvertFrom-Json).windows + Invoke-WebRequest https://sdk.lunarg.com/sdk/download/$version/windows/VulkanRT-$version-Components.zip -OutFile VulkanRT.zip + & 'C:\Program Files\7-Zip\7z.exe' e -bb3 -obuild -r .\VulkanRT.zip *x64\vulkan-1.* - name: Run C++ tests continue-on-error: ${{ matrix.renderer == 'vulkan' }} + env: + ANGLE_DEFAULT_PLATFORM: 'gl' + GALLIUM_DRIVER: llvmpipe + LIBGL_ALWAYS_SOFTWARE: true run: build/mbgl-test-runner.exe # render tests @@ -191,7 +214,10 @@ jobs: - name: Run render test id: render_test env: - manifest_file: ${{ matrix.renderer == 'osmesa' && 'opengl' || matrix.renderer }} + manifest_file: ${{ matrix.renderer }} + ANGLE_DEFAULT_PLATFORM: 'gl' + GALLIUM_DRIVER: llvmpipe + LIBGL_ALWAYS_SOFTWARE: true run: build/mbgl-render-test-runner.exe "--manifestPath=metrics/windows-${env:manifest_file}.json" - name: Upload render test result @@ -200,7 +226,7 @@ jobs: with: name: render-test-result-${{ matrix.renderer }} path: | - metrics/windows-${{ matrix.renderer == 'osmesa' && 'opengl' || matrix.renderer }}.html + metrics/windows-${{ matrix.renderer }}.html # expression tests diff --git a/.gitignore b/.gitignore index df7a7a0f5..0b01fc047 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ /cmake-build-debug /platform/android/build /platform/android/MapLibreAndroid/src/main/assets/sdk_versions/com.mapbox.mapboxsdk -/platform/windows/vendor/mesa3d/ *.code-workspace local.properties diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8005f36d6..3d670a579 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,7 @@ repos: exclude: 'gradlew\.bat$' - id: trailing-whitespace # FIXME: these autogenerate files contain trailing whitespace. Need to fix generator. - exclude: 'platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/(location/LocationIndicatorLayer|style/layers/PropertyFactory)\.java$' + exclude: '(platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/(location/LocationIndicatorLayer|style/layers/PropertyFactory)\.java$)|(platform/windows/vendor/.*)' - repo: https://github.com/pre-commit/mirrors-clang-format rev: v20.1.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c1f3c18b..946db2819 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,6 @@ option(MLN_WITH_RTTI "Compile with runtime type information" OFF) option(MLN_WITH_OPENGL "Build with OpenGL renderer" ON) option(MLN_WITH_EGL "Build with EGL renderer" OFF) option(MLN_WITH_VULKAN "Build with Vulkan renderer" OFF) -option(MLN_WITH_OSMESA "Build with OSMesa (Software) renderer" OFF) option(MLN_WITH_PMTILES "Build with PMTiles support" ON) option(MLN_WITH_WERROR "Make all compilation warnings errors" ON) option(MLN_USE_UNORDERED_DENSE "Use ankerl dense containers for performance" ON) diff --git a/metrics/ignores/windows-egl.json b/metrics/ignores/windows-egl.json index bf7ca8b6e..751a9a705 100644 --- a/metrics/ignores/windows-egl.json +++ b/metrics/ignores/windows-egl.json @@ -1,14 +1,9 @@ { - "render-tests/circle-sort-key/literal": "Needs investigation (Diff: 0.034423828125)", - "render-tests/map-mode/tile-avoid-edges": "Needs investigation (Diff: 0.008159637451171875)", - "render-tests/regressions/mapbox-gl-js#2534": "Needs investigation (Diff: 0.000301361083984375)", - "render-tests/regressions/mapbox-gl-js#7066": "Needs investigation (Diff: 0.0002777777777777778)", - "render-tests/symbol-placement/line-center-buffer-tile-map-mode": "Needs investigation (Diff: 0.0058155059814453125)", - "render-tests/symbol-placement/line-center-tile-map-mode": "Needs investigation (Diff: 0.005688667297363281)", - "render-tests/text-variable-anchor/all-anchors-tile-map-mode": "Needs investigation (Diff: 0.011456489562988281)", - "render-tests/text-variable-anchor/left-top-right-bottom-offset-tile-map-mode": "Needs investigation (Diff: 0.012059211730957031)", - "render-tests/within/layout-text": "Needs investigation (Diff: 0.000244140625)", - "render-tests/within/paint-circle": "Needs investigation (Diff: 0.000244140625)", - "render-tests/within/paint-icon": "Needs investigation (Diff: 0.000244140625)", - "render-tests/within/paint-text": "Needs investigation (Diff: 0.000244140625)" + "render-tests/line-pattern/overscaled": "Needs investigation (Diff: 0.0089111328125)", + "render-tests/regressions/mapbox-gl-js#5642": "Needs investigation (Diff: 0.013671875)", + "render-tests/regressions/mapbox-gl-js#7066": "Needs investigation (Diff: 0.00024305555555555555)", + "render-tests/regressions/mapbox-gl-native#9976": "Needs investigation (Diff: 0.00756072998046875)", + "render-tests/runtime-styling/image-add-pattern": "Needs investigation (Diff: 0.001953125)", + "render-tests/runtime-styling/image-update-pattern": "Needs investigation (Diff: 0.001953125)", + "render-tests/sprites/2x-screen-2x-pattern": "Needs investigation (Diff: 0.00042724609375)" } diff --git a/platform/default/src/mbgl/gl/headless_backend_osmesa.cpp b/platform/default/src/mbgl/gl/headless_backend_osmesa.cpp deleted file mode 100644 index e1f4f907e..000000000 --- a/platform/default/src/mbgl/gl/headless_backend_osmesa.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include -#include - -#include - -#include - -namespace mbgl { -namespace gl { - -class OSMesaBackendImpl : public HeadlessBackend::Impl { -public: - OSMesaBackendImpl() { -#if OSMESA_MAJOR_VERSION * 100 + OSMESA_MINOR_VERSION >= 305 - glContext = OSMesaCreateContextExt(OSMESA_RGBA, 16, 0, 0, nullptr); -#else - glContext = OSMesaCreateContext(OSMESA_RGBA, nullptr); -#endif - if (glContext == nullptr) { - throw std::runtime_error("Error creating GL context object."); - } - } - - ~OSMesaBackendImpl() final { OSMesaDestroyContext(glContext); } - - gl::ProcAddress getExtensionFunctionPointer(const char* name) final { return OSMesaGetProcAddress(name); } - - void activateContext() final { - if (!OSMesaMakeCurrent(glContext, &fakeBuffer, GL_UNSIGNED_BYTE, 1, 1)) { - throw std::runtime_error("Switching OpenGL context failed.\n"); - } - } - -private: - OSMesaContext glContext = nullptr; - GLubyte fakeBuffer = 0; -}; - -void HeadlessBackend::createImpl() { - assert(!impl); - impl = std::make_unique(); -} - -} // namespace gl -} // namespace mbgl diff --git a/platform/glfw/CMakeLists.txt b/platform/glfw/CMakeLists.txt index 1792a5ab8..5515704ef 100644 --- a/platform/glfw/CMakeLists.txt +++ b/platform/glfw/CMakeLists.txt @@ -1,9 +1,4 @@ if(WIN32) - if(MLN_WITH_OSMESA) - message(WARNING "mbgl-glfw does not work with -DMLN_WITH_OSMESA=ON. If you want to build this target, don't use this option.") - return() - endif() - find_package(glfw3 REQUIRED) find_package(libuv REQUIRED) else() diff --git a/platform/node/cmake/module.cmake b/platform/node/cmake/module.cmake index e9520d3a3..e6443e2e4 100644 --- a/platform/node/cmake/module.cmake +++ b/platform/node/cmake/module.cmake @@ -211,18 +211,6 @@ function(add_node_module NAME) ) if(WIN32) - if(MLN_WITH_OSMESA) - get_filename_component(_OUTPUT_PATH "${_OUTPUT_PATH}" DIRECTORY "${CMAKE_CURRENT_SOURCE_PATH}") - - add_custom_command( - TARGET ${_TARGET} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/platform/windows/vendor/mesa3d/${_ARCH}/libglapi.dll" "${_OUTPUT_PATH}" - COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/platform/windows/vendor/mesa3d/${_ARCH}/libGLESv2.dll" "${_OUTPUT_PATH}" - COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/platform/windows/vendor/mesa3d/${_ARCH}/osmesa.dll" "${_OUTPUT_PATH}" - ) - endif() - unset(_ARCH) endif() endforeach() diff --git a/platform/windows/FindOSMesa.cmake b/platform/windows/FindOSMesa.cmake deleted file mode 100644 index 66f8eca40..000000000 --- a/platform/windows/FindOSMesa.cmake +++ /dev/null @@ -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() diff --git a/platform/windows/Get-VendorPackages.ps1 b/platform/windows/Get-VendorPackages.ps1 index cc46d2d75..b64ce4e2e 100644 --- a/platform/windows/Get-VendorPackages.ps1 +++ b/platform/windows/Get-VendorPackages.ps1 @@ -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 -} diff --git a/platform/windows/README.md b/platform/windows/README.md index 0c37f4205..f299ad014 100644 --- a/platform/windows/README.md +++ b/platform/windows/README.md @@ -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\` 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`). diff --git a/platform/windows/src/headless_backend_osmesa.cpp b/platform/windows/src/headless_backend_osmesa.cpp deleted file mode 100644 index 381aac3a0..000000000 --- a/platform/windows/src/headless_backend_osmesa.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include - -#include - -#include - -#include - -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(2048 * 2048 * 4)), - context(OSMesaCreateContextAttribs(std::initializer_list({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 buffer; - OSMesaContext context; -}; - -void HeadlessBackend::createImpl() { - assert(!impl); - impl = std::make_unique(); -} - -} // namespace gl -} // namespace mbgl diff --git a/platform/windows/vendor/vcpkg-custom-ports/angle/004-fix-opengl32.dll-load.patch b/platform/windows/vendor/vcpkg-custom-ports/angle/004-fix-opengl32.dll-load.patch new file mode 100644 index 000000000..88b5d6480 --- /dev/null +++ b/platform/windows/vendor/vcpkg-custom-ports/angle/004-fix-opengl32.dll-load.patch @@ -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."; diff --git a/platform/windows/vendor/vcpkg-custom-ports/angle/portfile.cmake b/platform/windows/vendor/vcpkg-custom-ports/angle/portfile.cmake new file mode 100644 index 000000000..0354308a2 --- /dev/null +++ b/platform/windows/vendor/vcpkg-custom-ports/angle/portfile.cmake @@ -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}") diff --git a/platform/windows/windows.cmake b/platform/windows/windows.cmake index 006b49165..94a302c08 100644 --- a/platform/windows/windows.cmake +++ b/platform/windows/windows.cmake @@ -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