// RUN: %empty-directory(%t) // RUN: %target-build-swift %s -o %t/a.out4 -swift-version 4 && %target-codesign %t/a.out4 && %target-run %t/a.out4 // REQUIRES: objc_interop // UNSUPPORTED: OS=watchos // REQUIRES: executable_test import StdlibUnittest import Metal var MetalTests = TestSuite("Metal") if #available(OSX 10.13, iOS 11.0, tvOS 11.0, *) { // Call each overlay to ensure nothing explodes MetalTests.test("MTLArgumentEncoder") { func apiAvailabilityTest() { /* Setup */ let device = MTLCreateSystemDefaultDevice()! let buf = device.makeBuffer( length: 64, options: MTLResourceOptions.storageModeShared)! let texDesc = MTLTextureDescriptor() texDesc.usage = MTLTextureUsage.renderTarget let tex = device.makeTexture(descriptor: texDesc)! let smplr = device.makeSamplerState(descriptor: MTLSamplerDescriptor()) var arguments = [MTLArgumentDescriptor]() arguments.append(MTLArgumentDescriptor()) arguments.append(MTLArgumentDescriptor()) arguments.append(MTLArgumentDescriptor()) arguments[0].dataType = MTLDataType.pointer arguments[0].index = 0 arguments[1].dataType = MTLDataType.texture arguments[1].index = 1 arguments[2].dataType = MTLDataType.sampler arguments[2].index = 2 if #available(OSX 10.14, iOS 12.0, tvOS 12.0, *){ arguments.append(MTLArgumentDescriptor()) arguments[3].dataType = MTLDataType.indirectCommandBuffer arguments[3].index = 3 } /* Call APIs */ let argEncoder = device.makeArgumentEncoder(arguments: arguments)! argEncoder.setArgumentBuffer(buf, offset: 0) argEncoder.setBuffers([buf], offsets: [0], range: 0..<1) argEncoder.setTextures([tex], range: 1..<2) argEncoder.setSamplerStates([smplr], range: 2..<3) if #available(OSX 10.14, iOS 12.0, tvOS 12.0, *){ let icbDesc = MTLIndirectCommandBufferDescriptor() icbDesc.commandTypes = [.draw, .drawIndexed] icbDesc.inheritBuffers = false icbDesc.maxVertexBufferBindCount = 1 icbDesc.maxFragmentBufferBindCount = 1 let icb = device.makeIndirectCommandBuffer (descriptor: icbDesc, maxCommandCount: 1, options: MTLResourceOptions.storageModeShared )! argEncoder.setIndirectCommandBuffers([icb], range: 3..<4) } } } MetalTests.test("MTLBlitCommandEncoder") { func apiAvailabilityTest() { /* Setup */ let device = MTLCreateSystemDefaultDevice()! let queue = device.makeCommandQueue()! let cmdBuf = queue.makeCommandBuffer()! let bltCmdEncdr = cmdBuf.makeBlitCommandEncoder()! /* Call APIs */ let buf = device.makeBuffer(length: 4, options: MTLResourceOptions())! bltCmdEncdr.fill(buffer: buf, range: 0..