[Webkit-unassigned] [Bug 233941] Add support to attribute ownership of ANGLE Metal's resources
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Thu Dec 9 02:37:51 PST 2021
https://bugs.webkit.org/show_bug.cgi?id=233941
--- Comment #10 from Kimmo Kinnunen <kkinnunen at apple.com> ---
Comment on attachment 446442
--> https://bugs.webkit.org/attachment.cgi?id=446442
Patch
View in context: https://bugs.webkit.org/attachment.cgi?id=446442&action=review
> Source/ThirdParty/ANGLE/include/EGL/eglext_angle.h:181
> +#define EGL_CONTEXT_OWNERSHIP_IDENTITY_METAL_ANGLE 0x33B0
Let's put 0x34A7 for now (reserved for ANGLE)
> Source/ThirdParty/ANGLE/src/libANGLE/Caps.h:647
> + bool createContextOwnershipIdentity = false;
createContextOwnershipIdentity*Metal* ?
> Source/ThirdParty/ANGLE/src/libANGLE/Context.cpp:235
> +EGLint GetOwnershipIdentity(const egl::AttributeMap &attribs)
This file is for *all* implementations.
Ownership identity is a property of the Metal backend.
You need to move this to ContextMtl
> Source/ThirdParty/ANGLE/src/libANGLE/Context.cpp:237
> + return static_cast<EGLint>(attribs.getAsInt(EGL_CONTEXT_OWNERSHIP_IDENTITY_METAL_ANGLE, EGL_FALSE));
getAsInt already returns int.
The default value should be 0, not EGL_FALSE
> Source/ThirdParty/ANGLE/src/libANGLE/State.h:105
> + EGLint owwnershipIdentity);
Typo, but anyway needs to move away from the State.
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm:198
> + mContextDevice(
here you would add as the attribs: ContextMtl(.., AttributeMap& attribs)
mContextDevice(GetOwenershipIdentity(attribs))
and in GetOwenershipIdentity you'd #ifdef
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm:2449
> +#endif
Maybe remove, read the token off from attributes in the constructor and pass it to ContextDevice
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_context_device.h:28
> + ContextDevice(task_id_token_t ownershipIdentity) { mOwnershipIdentity = ownershipIdentity; }
Maybe:
1) remove ifdef
2) set the parameter as GLint
3) move the implementation to .mm file.
In implementation, do following
ContextDevice(GLint ownerIdentity)
{
#if ANGLE_USE_METAL_OWNERSHIP_IDENTITY
auto ownerIdentity = static_cast<task_id_token_t>(ownerIdentity);
if (ownerIdentity != TASK_ID_TOKEN_NULL)
{
kr = mach_port_mod_refs(mach_task_self(), ownerIdentity, MACH_PORT_RIGHT_SEND, 1);
.... check kr, etc.
mOwnerIdentity = ownerIdentity;
}
#endif
}
in ~ContextDevice, unref the task token.
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_context_device.mm:18
> +#pragma mark - Context Device implementation
I don't think you need a pragma mark categorisation for a 50 line implementation?
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_context_device.mm:36
> +#if USE_OWNERSHIP_IDENTITY_PRIVATE
so remove the extra ifdefs
the code should be
auto texture = [get() newTextureWithDescriptor:descriptor];
setOwnerWithIdentity(texture);
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_context_device.mm:124
> +}
Here you would #if:
void ContextDevice::setOwnerWithIdentity(id<MTLResource> resource)
{
#if ANGLE_USE_METAL_OWNERSHIP_IDENTITY
setOwnerWithIdentity(resource, mOwnerIdentity);
#endif
}
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm:304
> + id<MTLDevice> device = display->getMetalDevice();
these probably are now somehow wrong.
Anyway, we shouldn't modify the autopen tables unless the generator is modified.
I don't see the python files modified.
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_ownership_identity.h:21
> +#import "libANGLE/renderer/metal/mtl_ownership_identity_private.h"
Is it useful to have the thing implemented as:
- if MTLResource_Private.h is missing, don't use
- if mtl_ownership_identity_private.h is missing, don't use
Can we just remove this file and use the define: ANGLE_USE_METAL_OWNERSHIP_IDENTITY.
Then we make sure by default, ANGLE_USE_METAL_OWNERSHIP_IDENTITY is only defined if
1) os version is correct
2) internal headers are visible
3) user has requested the feature
(e.g. this define is what common/apple/apple_platform.h would set, see below)
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_ownership_identity_private.h:36
> +
This file could be called mtl_resource_spi.h
Contents would be:
#if ANGLE_USE_METAL_OWNERSHIP_IDENTITY
#import <Metal/Metal.h>
#import <Metal/MTLResource_Private.h>
#import <mach/mach_types.h>
namespace rx
{
....
}
#endif
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_task_identity_token.h:21
> +#define ANGLE_HAVE_MTLRESOURCE_SET_OWNERSHIP_IDENTITY 0
I think this could be moved to common/apple/apple_platform.h
I think additionally you could have the __has_include(<Metal/MTLResource_Private.h>) here
There you could have additionally
#define ANGLE_USE_METAL_OWNERSHIP_IDENTITY (ANGLE_HAVE_MTLRESOURCE_SET_OWNERSHIP_IDENTITY && defined(ANGLE_ENABLE_METAL_OWNERSHIP_IDENTITY))
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm:224
> + if ([[metalDevice name] rangeOfString:it.trademark].location != NSNotFound)
might be unneeded change?
> Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm:238
> + return angle::GetVendorIDFromMetalDeviceRegistryID([device registryID]);
might be unneeded change?
> Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.cpp:1634
>
Here you would validate that the passed identity is a task_id_token_t (e.g. at least that it's a send right? I'm not 100% sure) or null token.
I don't know yet how to do that, but we want to be relatively sure that there's no error when we ref it
--
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-unassigned/attachments/20211209/fbedf155/attachment-0001.htm>
More information about the webkit-unassigned
mailing list