diff --git a/.github/workflows/build-tests-windows.yml b/.github/workflows/build-tests-windows.yml index db2fab20..c0c5de19 100644 --- a/.github/workflows/build-tests-windows.yml +++ b/.github/workflows/build-tests-windows.yml @@ -26,6 +26,14 @@ jobs: - StandaloneWindows64 # Build a Windows 64-bit standalone. - WSAPlayer # Build a UWP App - tvOS # Build an Apple TV XCode project + enableGpu: + - false + include: + # Additionally test enableGpu build for a standalone windows target + - projectPath: test-project + unityVersion: 2023.2.2f1 + targetPlatform: StandaloneWindows64 + enableGpu: true steps: ########################### @@ -71,6 +79,7 @@ jobs: projectPath: ${{ matrix.projectPath }} unityVersion: ${{ matrix.unityVersion }} targetPlatform: ${{ matrix.targetPlatform }} + enableGpu: ${{ matrix.enableGpu }} customParameters: -profile SomeProfile -someBoolean -someValue exampleValue allowDirtyBuild: true # We use dirty build because we are replacing the default project settings file above @@ -96,6 +105,7 @@ jobs: projectPath: ${{ matrix.projectPath }} unityVersion: ${{ matrix.unityVersion }} targetPlatform: ${{ matrix.targetPlatform }} + enableGpu: ${{ matrix.enableGpu }} customParameters: -profile SomeProfile -someBoolean -someValue exampleValue allowDirtyBuild: true # We use dirty build because we are replacing the default project settings file above @@ -120,6 +130,7 @@ jobs: projectPath: ${{ matrix.projectPath }} unityVersion: ${{ matrix.unityVersion }} targetPlatform: ${{ matrix.targetPlatform }} + enableGpu: ${{ matrix.enableGpu }} customParameters: -profile SomeProfile -someBoolean -someValue exampleValue allowDirtyBuild: true # We use dirty build because we are replacing the default project settings file above @@ -129,6 +140,6 @@ jobs: ########################### - uses: actions/upload-artifact@v4 with: - name: Build ${{ matrix.targetPlatform }} on Windows (${{ matrix.unityVersion }}) + name: Build ${{ matrix.targetPlatform }} on Windows (${{ matrix.unityVersion }})${{ matrix.enableGpu && ' With GPU' || '' }} path: build retention-days: 14 diff --git a/dist/index.js b/dist/index.js index 7ffa95af..aafcec4f 100644 Binary files a/dist/index.js and b/dist/index.js differ diff --git a/dist/index.js.map b/dist/index.js.map index ccde7107..e550dbc2 100644 Binary files a/dist/index.js.map and b/dist/index.js.map differ diff --git a/dist/platforms/windows/build.ps1 b/dist/platforms/windows/build.ps1 index 6b126058..ac78d62b 100644 --- a/dist/platforms/windows/build.ps1 +++ b/dist/platforms/windows/build.ps1 @@ -148,13 +148,20 @@ Write-Output "# Building project #" Write-Output "###########################" Write-Output "" +$unityGraphics = "-nographics" + +if ($LLVMPIPE_INSTALLED -eq "true") +{ + $unityGraphics = "-force-opengl" +} + # If $Env:CUSTOM_PARAMETERS contains spaces and is passed directly on the command line to Unity, powershell will wrap it # in double quotes. To avoid this, parse $Env:CUSTOM_PARAMETERS into an array, while respecting any quotations within the string. $_, $customParametersArray = Invoke-Expression('Write-Output -- "" ' + $Env:CUSTOM_PARAMETERS) $unityArgs = @( "-quit", "-batchmode", - "-nographics", + $unityGraphics, "-silent-crashes", "-customBuildName", "`"$Env:BUILD_NAME`"", "-projectPath", "`"$Env:UNITY_PROJECT_PATH`"", diff --git a/dist/platforms/windows/entrypoint.ps1 b/dist/platforms/windows/entrypoint.ps1 index 4d7057e6..81d2bf0c 100644 --- a/dist/platforms/windows/entrypoint.ps1 +++ b/dist/platforms/windows/entrypoint.ps1 @@ -13,6 +13,11 @@ Get-Process -Name regsvr32 | ForEach-Object { Stop-Process -Id $_.Id -Force } # Setup Git Credentials . "c:\steps\set_gitcredential.ps1" +if ($env:ENABLE_GPU -eq "true") { + # Install LLVMpipe software graphics driver + . "c:\steps\install_llvmpipe.ps1" +} + # Activate Unity if ($env:SKIP_ACTIVATION -ne "true") { . "c:\steps\activate.ps1" diff --git a/dist/platforms/windows/install_llvmpipe.ps1 b/dist/platforms/windows/install_llvmpipe.ps1 new file mode 100644 index 00000000..fa88d2ea --- /dev/null +++ b/dist/platforms/windows/install_llvmpipe.ps1 @@ -0,0 +1,56 @@ +$Private:repo = "mmozeiko/build-mesa" +$Private:downloadPath = "$Env:TEMP\mesa.zip" +$Private:extractPath = "$Env:TEMP\mesa" +$Private:destinationPath = "$Env:UNITY_PATH\Editor\" +$Private:version = "25.1.0" + +$LLVMPIPE_INSTALLED = "false" + +try { + # Get the release info from GitHub API (version fixed to decrease probability of breakage) + $releaseUrl = "https://api.github.com/repos/$repo/releases/tags/$version" + $release = Invoke-RestMethod -Uri $releaseUrl -Headers @{ "User-Agent" = "PowerShell" } + + # Get the download URL for the zip asset + $zipUrl = $release.assets | Where-Object { $_.name -like "mesa-llvmpipe-x64*.zip" } | Select-Object -First 1 -ExpandProperty browser_download_url + + if (-not $zipUrl) { + throw "No zip file found in the latest release." + } + + # Download the zip file + Write-Host "Downloading $zipUrl..." + Invoke-WebRequest -Uri $zipUrl -OutFile $downloadPath + + # Create extraction directory if it doesn't exist + if (-not (Test-Path $extractPath)) { + New-Item -ItemType Directory -Path $extractPath | Out-Null + } + + # Extract the zip file + Write-Host "Extracting $downloadPath to $extractPath..." + Expand-Archive -Path $downloadPath -DestinationPath $extractPath -Force + + # Create destination directory if it doesn't exist + if (-not (Test-Path $destinationPath)) { + New-Item -ItemType Directory -Path $destinationPath | Out-Null + } + + # Copy extracted files to destination + Write-Host "Copying files to $destinationPath..." + Copy-Item -Path "$extractPath\*" -Destination $destinationPath -Recurse -Force + + Write-Host "Successfully downloaded, extracted, and copied Mesa files to $destinationPath" + + $LLVMPIPE_INSTALLED = "true" +} catch { + Write-Error "An error occurred: $_" +} finally { + # Clean up temporary files + if (Test-Path $downloadPath) { + Remove-Item $downloadPath -Force + } + if (Test-Path $extractPath) { + Remove-Item $extractPath -Recurse -Force + } +}