1// 2// Copyright 2021 The ANGLE Project Authors. All rights reserved. 3// Use of this source code is governed by a BSD-style license that can be 4// found in the LICENSE file. 5// 6// mtl_context_device.mm: 7// Implementation of Metal framework's MTLDevice wrapper per context. 8// 9 10#include "libANGLE/renderer/metal/mtl_context_device.h" 11#if ANGLE_USE_METAL_OWNERSHIP_IDENTITY 12# include "libANGLE/renderer/metal/mtl_resource_spi.h" 13#endif 14 15namespace rx 16{ 17namespace mtl 18{ 19 20ContextDevice::ContextDevice(GLint ownershipIdentity) 21{ 22#if ANGLE_USE_METAL_OWNERSHIP_IDENTITY 23 mOwnershipIdentity = static_cast<task_id_token_t>(ownershipIdentity); 24 if (mOwnershipIdentity != TASK_ID_TOKEN_NULL) 25 { 26 kern_return_t kr = 27 mach_port_mod_refs(mach_task_self(), mOwnershipIdentity, MACH_PORT_RIGHT_SEND, 1); 28 if (ANGLE_UNLIKELY(kr != KERN_SUCCESS)) 29 { 30 ERR() << "mach_port_mod_refs failed with: %s (%x)" << mach_error_string(kr) << kr; 31 ASSERT(false); 32 } 33 } 34#endif 35} 36 37ContextDevice::~ContextDevice() 38{ 39#if ANGLE_USE_METAL_OWNERSHIP_IDENTITY 40 if (mOwnershipIdentity != TASK_ID_TOKEN_NULL) 41 { 42 kern_return_t kr = 43 mach_port_mod_refs(mach_task_self(), mOwnershipIdentity, MACH_PORT_RIGHT_SEND, -1); 44 if (ANGLE_UNLIKELY(kr != KERN_SUCCESS)) 45 { 46 ERR() << "mach_port_mod_refs failed with: %s (%x)" << mach_error_string(kr) << kr; 47 ASSERT(false); 48 } 49 } 50#endif 51} 52 53angle::ObjCPtr<id<MTLSamplerState>> ContextDevice::newSamplerStateWithDescriptor( 54 MTLSamplerDescriptor *descriptor) const 55{ 56 return angle::adoptObjCPtr([get() newSamplerStateWithDescriptor:descriptor]); 57} 58 59angle::ObjCPtr<id<MTLTexture>> ContextDevice::newTextureWithDescriptor( 60 MTLTextureDescriptor *descriptor) const 61{ 62 63 auto resource = angle::adoptObjCPtr([get() newTextureWithDescriptor:descriptor]); 64 setOwnerWithIdentity(resource); 65 return resource; 66} 67 68angle::ObjCPtr<id<MTLTexture>> ContextDevice::newTextureWithDescriptor( 69 MTLTextureDescriptor *descriptor, 70 IOSurfaceRef iosurface, 71 NSUInteger plane) const 72{ 73 return angle::adoptObjCPtr([get() newTextureWithDescriptor:descriptor 74 iosurface:iosurface 75 plane:plane]); 76} 77 78angle::ObjCPtr<id<MTLBuffer>> ContextDevice::newBufferWithLength(NSUInteger length, 79 MTLResourceOptions options) const 80{ 81 auto resource = angle::adoptObjCPtr([get() newBufferWithLength:length options:options]); 82 setOwnerWithIdentity(resource); 83 return resource; 84} 85 86angle::ObjCPtr<id<MTLBuffer>> ContextDevice::newBufferWithBytes(const void *pointer, 87 NSUInteger length, 88 MTLResourceOptions options) const 89{ 90 auto resource = angle::adoptObjCPtr([get() newBufferWithBytes:pointer 91 length:length 92 options:options]); 93 setOwnerWithIdentity(resource); 94 return resource; 95} 96 97angle::ObjCPtr<id<MTLComputePipelineState>> ContextDevice::newComputePipelineStateWithFunction( 98 id<MTLFunction> computeFunction, 99 __autoreleasing NSError **error) const 100{ 101 return angle::adoptObjCPtr([get() newComputePipelineStateWithFunction:computeFunction 102 error:error]); 103} 104 105angle::ObjCPtr<id<MTLRenderPipelineState>> ContextDevice::newRenderPipelineStateWithDescriptor( 106 MTLRenderPipelineDescriptor *descriptor, 107 __autoreleasing NSError **error) const 108{ 109 return angle::adoptObjCPtr([get() newRenderPipelineStateWithDescriptor:descriptor error:error]); 110} 111 112angle::ObjCPtr<id<MTLDepthStencilState>> ContextDevice::newDepthStencilStateWithDescriptor( 113 MTLDepthStencilDescriptor *descriptor) const 114{ 115 return angle::adoptObjCPtr([get() newDepthStencilStateWithDescriptor:descriptor]); 116} 117 118angle::ObjCPtr<id<MTLSharedEvent>> ContextDevice::newSharedEvent() const 119{ 120 return angle::adoptObjCPtr([get() newSharedEvent]); 121} 122 123angle::ObjCPtr<id<MTLEvent>> ContextDevice::newEvent() const 124{ 125 return angle::adoptObjCPtr([get() newEvent]); 126} 127 128void ContextDevice::setOwnerWithIdentity(id<MTLResource> resource) const 129{ 130#if ANGLE_USE_METAL_OWNERSHIP_IDENTITY 131 mtl::setOwnerWithIdentity(resource, mOwnershipIdentity); 132#endif 133} 134 135bool ContextDevice::hasUnifiedMemory() const 136{ 137 return [get() hasUnifiedMemory]; 138} 139 140} // namespace mtl 141} // namespace rx 142