/
MetalView_SwiftUICompatible.swift
44 lines (35 loc) · 1.43 KB
/
MetalView_SwiftUICompatible.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/*
See LICENSE folder for this sample’s licensing information.
Abstract:
A representable container that uses a `MTKView` to periodically render a `CIImage`.
*/
import SwiftUI
import MetalKit
struct MetalView_SwiftUICompatible: UIViewRepresentable {
@StateObject var renderer: Renderer
/// - Tag: MakeView
func makeUIView(context: Context) -> MTKView {
let view = MTKView(frame: .zero, device: renderer.device)
// Suggest to Core Animation, through MetalKit, how often to redraw the view.
view.preferredFramesPerSecond = 10
// Allow Core Image to render to the view using the Metal compute pipeline.
view.framebufferOnly = false
view.delegate = renderer
if let layer = view.layer as? CAMetalLayer {
// Enable EDR with a color space that supports values greater than SDR.
if #available(iOS 16.0, *) {
layer.wantsExtendedDynamicRangeContent = true
}
layer.colorspace = CGColorSpace(name: CGColorSpace.extendedLinearDisplayP3)
// Ensure the render view supports pixel values in EDR.
view.colorPixelFormat = MTLPixelFormat.rgba16Float
}
return view
}
func updateUIView(_ view: MTKView, context: Context) {
configure(view: view, using: renderer)
}
private func configure(view: MTKView, using renderer: Renderer) {
view.delegate = renderer
}
}