mirror of
https://github.com/TelegramMessenger/Telegram-iOS.git
synced 2026-07-06 03:33:41 +02:00
Metal rendering improvements
This commit is contained in:
parent
b90e1bcef6
commit
1cda4437cc
5 changed files with 53 additions and 202 deletions
|
|
@ -245,6 +245,12 @@ public final class AnimatedStickerCachedFrameSource: AnimatedStickerFrameSource
|
|||
}
|
||||
}
|
||||
|
||||
private func alignUp(size: Int, align: Int) -> Int {
|
||||
precondition(((align - 1) & align) == 0, "Align must be a power of two")
|
||||
|
||||
let alignmentMask = align - 1
|
||||
return (size + alignmentMask) & ~alignmentMask
|
||||
}
|
||||
|
||||
private final class AnimatedStickerDirectFrameSourceCache {
|
||||
private enum FrameRangeResult {
|
||||
|
|
@ -274,8 +280,8 @@ private final class AnimatedStickerDirectFrameSourceCache {
|
|||
self.storeQueue = sharedStoreQueue
|
||||
|
||||
self.frameCount = frameCount
|
||||
self.width = width
|
||||
self.height = height
|
||||
self.width = alignUp(size: width, align: 8)
|
||||
self.height = alignUp(size: width, align: 8)
|
||||
self.useHardware = useHardware
|
||||
|
||||
let suffix : String
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ public final class AnimatedStickerNode: ASDisplayNode {
|
|||
override public func didLoad() {
|
||||
super.didLoad()
|
||||
|
||||
if #available(iOS 10.0, *), self.useMetalCache {
|
||||
if #available(iOS 10.0, *), (self.useMetalCache/* || "".isEmpty*/) {
|
||||
self.renderer = AnimatedStickerNode.hardwareRendererPool.take()
|
||||
} else {
|
||||
self.renderer = AnimatedStickerNode.softwareRendererPool.take()
|
||||
|
|
|
|||
|
|
@ -42,9 +42,9 @@ final class AnimationRendererPool {
|
|||
}
|
||||
|
||||
private func putBack(renderer: AnimationRenderer) {
|
||||
#if DEBUG
|
||||
/*#if DEBUG
|
||||
self.items.append(renderer)
|
||||
#endif
|
||||
#endif*/
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,44 +8,19 @@ import Accelerate
|
|||
import AnimationCompression
|
||||
import Metal
|
||||
import MetalKit
|
||||
import MetalImageView
|
||||
|
||||
@available(iOS 10.0, *)
|
||||
final class CompressedAnimationRenderer: ASDisplayNode, AnimationRenderer {
|
||||
private final class View: UIView {
|
||||
static override var layerClass: AnyClass {
|
||||
#if targetEnvironment(simulator)
|
||||
if #available(iOS 13.0, *) {
|
||||
return CAMetalLayer.self
|
||||
} else {
|
||||
preconditionFailure()
|
||||
}
|
||||
#else
|
||||
return CAMetalLayer.self
|
||||
#endif
|
||||
return MetalImageLayer.self
|
||||
}
|
||||
|
||||
init(device: MTLDevice) {
|
||||
super.init(frame: CGRect())
|
||||
|
||||
#if targetEnvironment(simulator)
|
||||
if #available(iOS 13.0, *) {
|
||||
let metalLayer = self.layer as! CAMetalLayer
|
||||
|
||||
metalLayer.device = MTLCreateSystemDefaultDevice()
|
||||
metalLayer.pixelFormat = .bgra8Unorm
|
||||
metalLayer.framebufferOnly = true
|
||||
metalLayer.allowsNextDrawableTimeout = true
|
||||
}
|
||||
#else
|
||||
let metalLayer = self.layer as! CAMetalLayer
|
||||
|
||||
metalLayer.device = MTLCreateSystemDefaultDevice()
|
||||
metalLayer.pixelFormat = .bgra8Unorm
|
||||
metalLayer.framebufferOnly = true
|
||||
if #available(iOS 11.0, *) {
|
||||
metalLayer.allowsNextDrawableTimeout = true
|
||||
}
|
||||
#endif
|
||||
(self.layer as! MetalImageLayer).renderer.device = device
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
|
|
@ -82,16 +57,25 @@ final class CompressedAnimationRenderer: ASDisplayNode, AnimationRenderer {
|
|||
func render(queue: Queue, width: Int, height: Int, bytesPerRow: Int, data: Data, type: AnimationRendererFrameType, mulAlpha: Bool, completion: @escaping () -> Void) {
|
||||
switch type {
|
||||
case .dct:
|
||||
self.renderer.renderIdct(metalLayer: self.layer, compressedImage: AnimationCompressor.CompressedImageData(data: data), completion: completion)
|
||||
self.renderer.renderIdct(layer: self.layer as! MetalImageLayer, compressedImage: AnimationCompressor.CompressedImageData(data: data), completion: { [weak self] in
|
||||
self?.updateHighlightedContentNode()
|
||||
completion()
|
||||
})
|
||||
case .argb:
|
||||
self.renderer.renderRgb(metalLayer: self.layer, width: width, height: height, bytesPerRow: bytesPerRow, data: data, completion: completion)
|
||||
self.renderer.renderRgb(layer: self.layer as! MetalImageLayer, width: width, height: height, bytesPerRow: bytesPerRow, data: data, completion: { [weak self] in
|
||||
self?.updateHighlightedContentNode()
|
||||
completion()
|
||||
})
|
||||
case .yuva:
|
||||
self.renderer.renderYuva(metalLayer: self.layer, width: width, height: height, data: data, completion: completion)
|
||||
self.renderer.renderYuva(layer: self.layer as! MetalImageLayer, width: width, height: height, data: data, completion: { [weak self] in
|
||||
self?.updateHighlightedContentNode()
|
||||
completion()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private func updateHighlightedContentNode() {
|
||||
/*guard let highlightedContentNode = self.highlightedContentNode, let highlightedColor = self.highlightedColor else {
|
||||
guard let highlightedContentNode = self.highlightedContentNode, let highlightedColor = self.highlightedColor else {
|
||||
return
|
||||
}
|
||||
if let contents = self.contents, CFGetTypeID(contents as CFTypeRef) == CGImage.typeID {
|
||||
|
|
@ -100,11 +84,11 @@ final class CompressedAnimationRenderer: ASDisplayNode, AnimationRenderer {
|
|||
highlightedContentNode.tintColor = highlightedColor
|
||||
if self.highlightReplacesContent {
|
||||
self.contents = nil
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
func setOverlayColor(_ color: UIColor?, replace: Bool, animated: Bool) {
|
||||
/*self.highlightReplacesContent = replace
|
||||
self.highlightReplacesContent = replace
|
||||
var updated = false
|
||||
if let current = self.highlightedColor, let color = color {
|
||||
updated = !current.isEqual(color)
|
||||
|
|
@ -141,6 +125,6 @@ final class CompressedAnimationRenderer: ASDisplayNode, AnimationRenderer {
|
|||
strongSelf.highlightedContentNode?.removeFromSupernode()
|
||||
strongSelf.highlightedContentNode = nil
|
||||
})
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue