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 package org.jetbrains.skiko
import javax.accessibility.Accessible
/** /**
* Provides [MetalAdapter] that holds pointer to native [MTLDevice](https://developer.apple.com/documentation/metal/mtldevice) * Provides [MetalAdapter] that holds pointer to native [MTLDevice](https://developer.apple.com/documentation/metal/mtldevice)
* chosen using [adapterPriority] * chosen using [adapterPriority]
...@@ -17,16 +15,18 @@ internal fun chooseMetalAdapter(adapterPriority: GpuPriority): MetalAdapter { ...@@ -17,16 +15,18 @@ internal fun chooseMetalAdapter(adapterPriority: GpuPriority): MetalAdapter {
val adapterName = getAdapterName(adapter) val adapterName = getAdapterName(adapter)
val adapterMemorySize = getAdapterMemorySize(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 ptr pointer for native [MTLDevice](https://developer.apple.com/documentation/metal/mtldevice)
* @param name the full name of the vendor device. * @param name the full name of the vendor device.
* @param memorySize approximation of how much memory this device can use with good performance. * @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() { internal fun MetalAdapter.dispose() {
disposeAdapter(ptr) disposeAdapter(ptr)
...@@ -49,6 +49,7 @@ private external fun chooseAdapter(adapterPriority: Int): Long ...@@ -49,6 +49,7 @@ private external fun chooseAdapter(adapterPriority: Int): Long
private external fun disposeAdapter(adapter: Long) private external fun disposeAdapter(adapter: Long)
private external fun getAdapterName(adapter: Long): String private external fun getAdapterName(adapter: Long): String
private external fun getAdapterMemorySize(adapter: Long): Long private external fun getAdapterMemorySize(adapter: Long): Long
private external fun getAdapterMaxTextureSize(adapter: Long): Int
@Suppress("SpellCheckingInspection") @Suppress("SpellCheckingInspection")
private external fun openAutoreleasepool(): Long private external fun openAutoreleasepool(): Long
......
...@@ -60,6 +60,10 @@ internal class MetalSwingRedrawer( ...@@ -60,6 +60,10 @@ internal class MetalSwingRedrawer(
return return
} }
require(width <= adapter.maxTextureSize && height <= adapter.maxTextureSize) {
"Texture dimensions must be less than maximum allowed size: ${adapter.maxTextureSize}, got $width x $height"
}
autoreleasepool { autoreleasepool {
autoCloseScope { autoCloseScope {
texturePtr = makeMetalTexture(adapter.ptr, texturePtr, width, height) texturePtr = makeMetalTexture(adapter.ptr, texturePtr, width, height)
......
...@@ -141,6 +141,20 @@ JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_MetalApiKt_getAdapterMemorySize ...@@ -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" } // extern "C"
#endif // SK_METAL #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