Dunfey · Hotel WWDC as data, est. 1983
Front desk everything
Years
Topics

2021 Audio & VideoPhotos & CameraGraphics & Games

WWDC21 · 9 min · Audio & Video / Photos & Camera / Graphics & Games

Explore Core Image kernel improvements

Discover how you can add Core Image kernels written in the Metal Shading Language into your app. We’ll explore how you can use Xcode rules and naming conventions for Core Image kernels written in the Metal Shading Language, and help you make sense of Metal’s Stitchable functions and dynamic library features to benefit Core Image kernels.

Watch at developer.apple.com ↗

Transcript all transcripts

Code shown on screen · 4 snippets

Extern CIKernels objectivec · at 3:54 ↗
// MyKernels.ci.metal
#include <CoreImage/CoreImage.h> // includes CIKernelMetalLib.h

using namespace metal;

extern "C" float4 myKernel (coreimage::sample_t s, 
                            float param, 
                            coreimage::destination dest) 
{
  float4 result = s;
  
  // Example code to create striped pattern
	float diagLine = dest.coord().x + dest.coord().y;
	float stripe   = fract(diagLine/20.0 + param*2.0);
  
  // Color range check
	if((stripe > 0.5) && ((s.r > 1) || (s.g > 1) || (s.b > 1)))
		result = float4(2.0, 0.0, 0.0, 1.0);
  
	return result;
}
Load your extern CI kernel and apply it to create a new image swift · at 4:32 ↗
class MyFilter: CIFilter {
    var inputImage: CIImage?
	var inputParam: Float = 0.0
    static var kernel: CIColorKernel = { () -> CIColorKernel in 
	  let url = Bundle.main.url(forResource: "MyKernels", 
                              withExtension: "ci.metallib")!
      let data = try! Data(contentsOf: url)
	  return try! CIColorKernel(functionName: "MyKernel", 
                              fromMetalLibraryData: data)
	}()
	override var outputImage : CIImage? {
      get { guard let input = inputImage else { return nil }
		return MyFilter.kernel.apply(extent:input.extent, 
                                 arguments:[input, inputParam]) }
	}
}
Stitchable CI Kernel objectivec · at 6:18 ↗
// MyKernels.ci.metal
#include <CoreImage/CoreImage.h> // includes CIKernelMetalLib.h

using namespace metal;

[[stitchable]] float4 myKernel (coreimage::sample_t s, 
                                float param, 
                                coreimage::destination d) 
{
  float4 result = s;
  
  // Example code to create striped pattern
	float diagLine = dest.coord().x + dest.coord().y;
	float stripe   = fract(diagLine/20.0 + param*2.0);
  
  // Color range check
	if((stripe > 0.5) && ((s.r > 1) || (s.g > 1) || (s.b > 1)))
		result = float4(2.0, 0.0, 0.0, 1.0);
  
	return result;
}
Load your stitchable CI kernel and apply it to create a new image swift · at 6:40 ↗
class MyFilter: CIFilter {
    var inputImage: CIImage?
	var inputParam: Float = 0.0
    static var kernel: CIColorKernel = { () -> CIColorKernel in 
	    let url = Bundle.main.url(forResource: "default", 
                                withExtension: "metallib")!
		let data = try! Data(contentsOf: url)
		return try! CIColorKernel(functionName: "MyKernel", fromMetalLibraryData: data)
	}()
	override var outputImage : CIImage? {
      get { guard let input = inputImage else { return nil }
		return MyFilter.kernel.apply(extent:input.extent, arguments:[input, inputParam]) }
	}
}

Resources