Unverified Commit 87d5fb99 authored by Igor Demin's avatar Igor Demin Committed by GitHub

Windows ARM support (#610)

* Windows ARM support

Add skia.arch Gradle property.

We set it to `arm64` on CI to build a version for Windows ARM

* Fix build
parent f2266923
......@@ -109,7 +109,7 @@ fun createWindow(title: String, exitOnClose: Boolean) = SwingUtilities.invokeLat
// Window transparency
if (System.getProperty("skiko.transparency") == "true") {
window.setUndecorated(true)
window.isUndecorated = true
// On Windows we don't set transparent background to avoid event input issues (JDK specific)
if (hostOs != OS.Windows) {
window.background = Color(0, 0, 0, 0)
......
......@@ -23,6 +23,8 @@ fun targetSuffix(os: OS, arch: Arch): String {
val skiko = SkikoProperties(rootProject)
val buildType = skiko.buildType
val targetOs = hostOs
val targetArch = skiko.targetArch
allprojects {
group = SkikoArtifacts.groupId
......@@ -34,7 +36,7 @@ repositories {
}
val windowsSdkPaths: WindowsSdkPaths by lazy {
findWindowsSdkPathsForCurrentOS(gradle)
findWindowsSdkPaths(gradle, targetArch)
}
fun KotlinTarget.isIosSimArm64() =
......@@ -221,7 +223,7 @@ kotlin {
compilations.all {
kotlinOptions.jvmTarget = "1.8"
}
generateVersion(hostOs, hostArch)
generateVersion(targetOs, targetArch)
}
if (supportAndroid) {
......@@ -620,8 +622,8 @@ val skikoAwtJar by project.tasks.registering(Jar::class) {
archiveBaseName.set("skiko-awt")
from(kotlin.jvm("awt").compilations["main"].output.allOutputs)
}
val skikoAwtRuntimeJar = createSkikoJvmJarTask(hostOs, hostArch, skikoAwtJar)
val skikoRuntimeDirForTests = skikoRuntimeDirForTestsTask(hostOs, hostArch, skikoAwtJar, skikoAwtRuntimeJar)
val skikoAwtRuntimeJar = createSkikoJvmJarTask(targetOs, targetArch, skikoAwtJar)
val skikoRuntimeDirForTests = skikoRuntimeDirForTestsTask(targetOs, targetArch, skikoAwtJar, skikoAwtRuntimeJar)
val skikoJarForTests = skikoJarForTestsTask(skikoRuntimeDirForTests)
if (supportAndroid) {
......
......@@ -58,7 +58,11 @@ val OS.dynamicLibExt: String
enum class Arch(val id: String) {
X64("x64"),
Arm64("arm64"),
Wasm("wasm")
Wasm("wasm");
companion object {
fun byName(name: String) = Arch.values().find { it.id == name }
}
}
enum class SkiaBuildType(
......@@ -127,6 +131,9 @@ class SkikoProperties(private val myProject: Project) {
val buildType: SkiaBuildType
get() = if (myProject.findProperty("skiko.debug") == "true") SkiaBuildType.DEBUG else SkiaBuildType.RELEASE
val targetArch: Arch
get() = myProject.findProperty("skiko.arch")?.toString()?.let(Arch::byName) ?: hostArch
val includeTestHelpers: Boolean
get() = !isRelease
......@@ -148,8 +155,11 @@ class SkikoProperties(private val myProject: Project) {
// todo: make compatible with the configuration cache
val skiaDir: File?
get() = (System.getenv()["SKIA_DIR"] ?: System.getProperty("skia.dir"))?.let { File(it) }
?.takeIf { it.isDirectory }
get() = (
System.getenv()["SKIA_DIR"]
?: System.getProperty("skia.dir")
?: myProject.findProperty("skia.dir")?.toString()
)?.let { File(it) }?.takeIf { it.isDirectory }
val composeRepoUrl: String
get() = System.getenv("COMPOSE_REPO_URL") ?: "https://maven.pkg.jetbrains.space/public/p/compose/dev"
......
......@@ -5,6 +5,7 @@ import org.gradle.nativeplatform.platform.internal.NativePlatformInternal
import org.gradle.nativeplatform.toolchain.internal.SystemLibraries
import org.gradle.nativeplatform.toolchain.internal.msvcpp.*
import java.io.File
import kotlin.math.abs
data class WindowsSdkPaths(
val compiler: File,
......@@ -17,26 +18,30 @@ private const val ENV_SKIKO_VSBT_PATH = "SKIKO_VSBT_PATH"
private const val ENV_SKIKO_VSBT_VERSION = "SKIKO_VSBT_VERSION"
private const val ENV_SKIKO_WINDOWS_SDK_VERSION = "SKIKO_WINDOWS_SDK_VERSION"
fun findWindowsSdkPathsForCurrentOS(gradle: Gradle): WindowsSdkPaths {
fun findWindowsSdkPaths(gradle: Gradle, arch: Arch): WindowsSdkPaths {
check(hostOs.isWindows) { "Unexpected host os: $hostOs, expected: ${OS.Windows}" }
val hostPlatform = host()
val finder = GradleWindowsComponentFinderWrapper(gradle, hostPlatform)
val finder = GradleWindowsComponentFinderWrapper(gradle, hostPlatform, arch)
val visualCpp = finder.findVisualCpp()
val windowsSdk = finder.findWindowsSdk()
val ucrt = finder.findUcrt()
val systemLibraries = listOf(visualCpp, windowsSdk, ucrt)
return WindowsSdkPaths(
compiler = visualCpp.compilerExecutable,
linker = visualCpp.linkerExecutable,
includeDirs = systemLibraries.flatMap { it.includeDirs },
libDirs = systemLibraries.flatMap { it.libDirs }
compiler = visualCpp.compilerExecutable.fixPathFor(arch),
linker = visualCpp.linkerExecutable.fixPathFor(arch),
includeDirs = systemLibraries.flatMap { it.includeDirs }.map { it.fixPathFor(arch) },
libDirs = systemLibraries.flatMap { it.libDirs }.map { it.fixPathFor(arch) },
)
}
// workaround until https://github.com/gradle/gradle/pull/21780 is merged
private fun File.fixPathFor(arch: Arch) = File(absolutePath.replace("x64", arch.id))
private class GradleWindowsComponentFinderWrapper(
private val gradle: Gradle,
private val hostPlatform: NativePlatformInternal
private val hostPlatform: NativePlatformInternal,
private val arch: Arch,
) {
fun findVisualCpp(): VisualCpp {
val skikoVsbtPath = System.getenv(ENV_SKIKO_VSBT_PATH)
......
......@@ -6,6 +6,7 @@ kotlin.native.enableDependencyPropagation=false
dependencies.skia.windows-x64=m105-305b7c02-1
dependencies.skia.linux-x64=m105-305b7c02-1
dependencies.skia.macos-x64=m105-305b7c02-1
dependencies.skia.windows-arm64=m105-305b7c02-1
dependencies.skia.linux-arm64=m105-305b7c02-1
dependencies.skia.macos-arm64=m105-305b7c02-1
dependencies.skia.wasm-wasm=m105-305b7c02-1
......
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
......@@ -48,7 +48,10 @@ object SkikoProperties {
"SOFTWARE_COMPAT" -> return GraphicsApi.SOFTWARE_COMPAT
"SOFTWARE_FAST", "DIRECT_SOFTWARE" -> return GraphicsApi.SOFTWARE_FAST
"SOFTWARE" -> return if (hostOs == OS.MacOS) GraphicsApi.SOFTWARE_COMPAT else GraphicsApi.SOFTWARE_FAST
"OPENGL" -> return GraphicsApi.OPENGL
"OPENGL" ->
// Skia isn't properly tested on OpenGL and Windows ARM (https://groups.google.com/g/skia-discuss/c/McoclAhLpvg?pli=1)
return if (hostOs != OS.Windows || hostArch != Arch.Arm64) GraphicsApi.OPENGL
else throw Exception("$hostOs-$hostArch does not support OpenGL rendering API.")
"DIRECT3D" -> {
return if (hostOs == OS.Windows) GraphicsApi.DIRECT3D
else throw Exception("$hostOs does not support DirectX rendering API.")
......@@ -75,7 +78,11 @@ object SkikoProperties {
var fallbackApis = when (hostOs) {
OS.Linux -> listOf(GraphicsApi.OPENGL, GraphicsApi.SOFTWARE_FAST, GraphicsApi.SOFTWARE_COMPAT)
OS.MacOS -> listOf(GraphicsApi.METAL, GraphicsApi.SOFTWARE_COMPAT)
OS.Windows -> listOf(GraphicsApi.DIRECT3D, GraphicsApi.OPENGL, GraphicsApi.SOFTWARE_FAST, GraphicsApi.SOFTWARE_COMPAT)
OS.Windows -> when (hostArch) {
// Skia isn't properly tested on OpenGL and Windows ARM (https://groups.google.com/g/skia-discuss/c/McoclAhLpvg?pli=1)
Arch.Arm64 -> listOf(GraphicsApi.DIRECT3D, GraphicsApi.SOFTWARE_FAST, GraphicsApi.SOFTWARE_COMPAT)
else -> listOf(GraphicsApi.DIRECT3D, GraphicsApi.OPENGL, GraphicsApi.SOFTWARE_FAST, GraphicsApi.SOFTWARE_COMPAT)
}
OS.Android -> return listOf(GraphicsApi.OPENGL)
OS.JS, OS.Ios -> TODO("commonize me")
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment