Unverified Commit 37e1d91b authored by Elijah Semyonov's avatar Elijah Semyonov Committed by GitHub

Add support for querying and utilizing maximum texture size for Metal adapters (#1144)

Fixes [SKIKO-950](https://youtrack.jetbrains.com/issue/SKIKO-950)
parent 9c3169a5
package org.jetbrains.skiko
import javax.accessibility.Accessible
/**
* Provides [MetalAdapter] that holds pointer to native [MTLDevice](https://developer.apple.com/documentation/metal/mtldevice)
* chosen using [adapterPriority]
......@@ -17,16 +15,18 @@ internal fun chooseMetalAdapter(adapterPriority: GpuPriority): MetalAdapter {
val adapterName = getAdapterName(adapter)
val adapterMemorySize = getAdapterMemorySize(adapter)
val adapterMaxTextureSize = getAdapterMaxTextureSize(adapter)
return MetalAdapter(adapter, adapterName, adapterMemorySize)
return MetalAdapter(adapter, adapterName, adapterMemorySize, adapterMaxTextureSize)
}
/**
* @param ptr pointer for native [MTLDevice](https://developer.apple.com/documentation/metal/mtldevice)
* @param name the full name of the vendor device.
* @param memorySize approximation of how much memory this device can use with good performance.
* @param maxTextureSize maximum width and height supported for 2D textures.
*/
internal data class MetalAdapter(val ptr: Long, val name: String, val memorySize: Long)
internal data class MetalAdapter(val ptr: Long, val name: String, val memorySize: Long, val maxTextureSize: Int)
internal fun MetalAdapter.dispose() {
disposeAdapter(ptr)
......@@ -49,6 +49,7 @@ private external fun chooseAdapter(adapterPriority: Int): Long
private external fun disposeAdapter(adapter: Long)
private external fun getAdapterName(adapter: Long): String
private external fun getAdapterMemorySize(adapter: Long): Long
private external fun getAdapterMaxTextureSize(adapter: Long): Int
@Suppress("SpellCheckingInspection")
private external fun openAutoreleasepool(): Long
......
......@@ -60,6 +60,10 @@ internal class MetalSwingRedrawer(
return
}
require(width <= adapter.maxTextureSize && height <= adapter.maxTextureSize) {
"Texture dimensions must be less than maximum allowed size: ${adapter.maxTextureSize}, got $width x $height"
}
autoreleasepool {
autoCloseScope {
texturePtr = makeMetalTexture(adapter.ptr, texturePtr, width, height)
......
......@@ -141,6 +141,20 @@ JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_MetalApiKt_getAdapterMemorySize
}
}
JNIEXPORT jint JNICALL Java_org_jetbrains_skiko_MetalApiKt_getAdapterMaxTextureSize(
JNIEnv *env, jobject obj, jlong adapterPtr) {
@autoreleasepool {
id<MTLDevice> adapter = (__bridge id<MTLDevice>) (void *) adapterPtr;
// Query GPU family to determine max 2D texture dimension
// See: https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf
if ([adapter supportsFamily:MTLGPUFamilyApple3] ||
[adapter supportsFamily:MTLGPUFamilyMac2]) {
return 16384;
}
return 8192;
}
}
} // extern "C"
#endif // SK_METAL
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