Hash :
bd5dce9a
Author :
Date :
2023-11-21T15:39:04
Metal: Use MTLEvent instead of MTLSharedEvent when possible Refactor mtl::Sync to be abstract and have multiple implementations using either MTLEvent or MTLSharedEvent. Use MTLEvent in all cases except for EGL Syncs when the user sets the sync type to EGL_SYNC_METAL_SHARED_EVENT_ANGLE. Determine completion of the sync object by watching for completion of the command buffer where the event's signaling was enqueued. Avoid any sleep loops by waiting on a condition_variable which is notified when the completed queue serial is updated. Forked from CLs by sky@ and kbr@ Bug: angleproject:8153 Change-Id: I4547444b596366496c811cb9954872b85ab14ad8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5133706 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// mtl_device.h:
// Defines the wrapper class for Metal's MTLDevice per context.
//
#ifndef LIBANGLE_RENDERER_METAL_CONTEXT_DEVICE_H_
#define LIBANGLE_RENDERER_METAL_CONTEXT_DEVICE_H_
#import <Metal/Metal.h>
#import <mach/mach_types.h>
#include "common/apple/apple_platform.h"
#include "libANGLE/renderer/metal/mtl_common.h"
namespace rx
{
namespace mtl
{
class ContextDevice final : public WrappedObject<id<MTLDevice>>, angle::NonCopyable
{
public:
ContextDevice(GLint ownershipIdentity);
~ContextDevice();
inline void set(id<MTLDevice> metalDevice) { ParentClass::set(metalDevice); }
AutoObjCPtr<id<MTLSamplerState>> newSamplerStateWithDescriptor(
MTLSamplerDescriptor *descriptor) const;
AutoObjCPtr<id<MTLTexture>> newTextureWithDescriptor(MTLTextureDescriptor *descriptor) const;
AutoObjCPtr<id<MTLTexture>> newTextureWithDescriptor(MTLTextureDescriptor *descriptor,
IOSurfaceRef iosurface,
NSUInteger plane) const;
AutoObjCPtr<id<MTLBuffer>> newBufferWithLength(NSUInteger length,
MTLResourceOptions options) const;
AutoObjCPtr<id<MTLBuffer>> newBufferWithBytes(const void *pointer,
NSUInteger length,
MTLResourceOptions options) const;
AutoObjCPtr<id<MTLComputePipelineState>> newComputePipelineStateWithFunction(
id<MTLFunction> computeFunction,
__autoreleasing NSError **error) const;
AutoObjCPtr<id<MTLRenderPipelineState>> newRenderPipelineStateWithDescriptor(
MTLRenderPipelineDescriptor *descriptor,
__autoreleasing NSError **error) const;
AutoObjCPtr<id<MTLLibrary>> newLibraryWithSource(NSString *source,
MTLCompileOptions *options,
__autoreleasing NSError **error) const;
AutoObjCPtr<id<MTLLibrary>> newLibraryWithData(dispatch_data_t data,
__autoreleasing NSError **error) const;
AutoObjCPtr<id<MTLDepthStencilState>> newDepthStencilStateWithDescriptor(
MTLDepthStencilDescriptor *descriptor) const;
AutoObjCPtr<id<MTLSharedEvent>> newSharedEvent() const;
AutoObjCPtr<id<MTLEvent>> newEvent() const;
void setOwnerWithIdentity(id<MTLResource> resource) const;
bool hasUnifiedMemory() const;
private:
using ParentClass = WrappedObject<id<MTLDevice>>;
#if ANGLE_USE_METAL_OWNERSHIP_IDENTITY
task_id_token_t mOwnershipIdentity = TASK_ID_TOKEN_NULL;
#endif
};
} // namespace mtl
} // namespace rx
#endif /* LIBANGLE_RENDERER_METAL_CONTEXT_DEVICE_H_ */