• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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