-
Notifications
You must be signed in to change notification settings - Fork 6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Don't retain the MTLTexture or MTLDevice in TestMetalContext #30832
Conversation
It looks like this pull request may not have tests. Please make sure to add tests before merging. If you need an exemption to this rule, contact Hixie on the #hackers channel in Chat. If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix? Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing. |
testing/test_metal_context.mm
Outdated
for (auto& [_, texture] : textures_) { | ||
[(id)texture.get() release]; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This isn't necessary, those textures are stored in sk_cfp which calls release in its deconstructor. If you see this being necessary you probably have a double retain. It looks correct when you are making it to me, the apis are a bit confusing though.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah right - I missed that we were calling the sk_cfp
copy ctor when assigning the MTLTexture
into the textures_
map (and that the textures_
map holds the sk_cfp
and not a raw pointer). This means that we don't need to release manually in this dtor, but I believe we still need to remove the extra retain
call, right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nope, I believe we should have the retain now. [device newTextureWithDescriptor:texture_descriptor.get()]
should return an object that is on the autorelease pool. Which means it will get released when this event is done, so we'd need a retain to keep it alive in the smart pointer.
I'm not 100% certain because the semantics for an objc method called new*
that return an objc object are a bit unclear to me. I think technically anything that isn't named create
should be on the autorelease pool, but that isn't the case for -[NSObject new]
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unless I'm misunderstanding the guide at https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html, it says that any ObjC method with "new" in the name returns an object that the caller owns outright. That implies to me that it won't be in the autorelease pool.
That being said, I think that the MTLTextureDescriptor
does fall under that category perhaps, as the ObjC method name does not include the word "new", "create" etc, so I'd expect that to be in the autorelease pool?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, yep, you're right, anything that begins with "new" means the caller owns it. No need to retain it again. You don't run into new
methods often.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, the unit test that was failing was because the MTLTextureDescriptor
is indeed returned already in the autorelease pool, so that retain still needs to be there.
With that fixed, all the unit tests are now passing locally.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks!
flutter/engine@fab1982...83d99a5 2022-01-14 skia-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from 35I2K_Bou... to V541xkYVr... (flutter/engine#30879) 2022-01-14 skia-flutter-autoroll@skia.org Roll Dart SDK from dcab0d0b2f6c to d0d4dbfc6e69 (1 revision) (flutter/engine#30878) 2022-01-14 skia-flutter-autoroll@skia.org Roll Skia from 1f0e64acd621 to f260a297c68d (1 revision) (flutter/engine#30877) 2022-01-14 638538+chaselatta@users.noreply.github.com [fuchsia] stamp package with target api level (flutter/engine#30857) 2022-01-14 skia-flutter-autoroll@skia.org Roll Skia from dd9e165ef7d0 to 1f0e64acd621 (1 revision) (flutter/engine#30876) 2022-01-14 skia-flutter-autoroll@skia.org Roll Fuchsia Mac SDK from BQ2l2096A... to bGW3xlB1D... (flutter/engine#30875) 2022-01-14 skia-flutter-autoroll@skia.org Roll Skia from 7aec4b164e79 to dd9e165ef7d0 (1 revision) (flutter/engine#30874) 2022-01-14 skia-flutter-autoroll@skia.org Roll Dart SDK from 68ccd13498be to dcab0d0b2f6c (1 revision) (flutter/engine#30872) 2022-01-14 skia-flutter-autoroll@skia.org Roll Dart SDK from aa6fbac07951 to 68ccd13498be (1 revision) (flutter/engine#30870) 2022-01-14 skia-flutter-autoroll@skia.org Roll Skia from 76e62d32d979 to 7aec4b164e79 (1 revision) (flutter/engine#30869) 2022-01-14 skia-flutter-autoroll@skia.org Roll Skia from a6f2ebf30fea to 76e62d32d979 (1 revision) (flutter/engine#30868) 2022-01-14 skia-flutter-autoroll@skia.org Roll Dart SDK from ba044d5e9c03 to aa6fbac07951 (1 revision) (flutter/engine#30867) 2022-01-14 skia-flutter-autoroll@skia.org Roll Skia from 7c80b2f08ead to a6f2ebf30fea (1 revision) (flutter/engine#30863) 2022-01-14 dkwingsmt@users.noreply.github.com [Windows, Keyboard] Lift key event redispatching to KeyboardManagerWin32 (flutter/engine#30702) 2022-01-14 jason-simmons@users.noreply.github.com Ensure that PlatformViewIOS does not call into Shell semantics APIs during destruction (flutter/engine#30835) 2022-01-14 skia-flutter-autoroll@skia.org Roll Skia from 119fb6bb2568 to 7c80b2f08ead (1 revision) (flutter/engine#30862) 2022-01-14 skia-flutter-autoroll@skia.org Roll Dart SDK from b36d861d5487 to ba044d5e9c03 (1 revision) (flutter/engine#30861) 2022-01-14 skia-flutter-autoroll@skia.org Roll Skia from 62b32180c192 to 119fb6bb2568 (1 revision) (flutter/engine#30860) 2022-01-14 skia-flutter-autoroll@skia.org Roll Fuchsia Mac SDK from Uvw9UoGSm... to BQ2l2096A... (flutter/engine#30859) 2022-01-13 gw280@google.com Move SoftwareCanvasProvider into its own source file (flutter/engine#30856) 2022-01-13 skia-flutter-autoroll@skia.org Roll Skia from c505bdca9d60 to 62b32180c192 (1 revision) (flutter/engine#30855) 2022-01-13 gw280@google.com Create a DisplayList benchmarks dylib on iOS (flutter/engine#30833) 2022-01-13 gw280@google.com Don't retain the MTLTexture or MTLDevice in TestMetalContext (flutter/engine#30832) 2022-01-13 skia-flutter-autoroll@skia.org Roll Skia from 455e580b9c78 to c505bdca9d60 (1 revision) (flutter/engine#30852) 2022-01-13 74682667+chandarrengoog@users.noreply.github.com Roll buildroot to 7effd69. (flutter/engine#30851) 2022-01-13 scheglov@google.com Remove unused field initializing formal parameters. (flutter/engine#30822) 2022-01-13 skia-flutter-autoroll@skia.org Roll Dart SDK from f1c98a571d1a to b36d861d5487 (1 revision) (flutter/engine#30850) 2022-01-13 skia-flutter-autoroll@skia.org Roll Skia from 759bc62a06d2 to 455e580b9c78 (2 revisions) (flutter/engine#30849) 2022-01-13 43054281+camsim99@users.noreply.github.com Remove usages of deprecated setSystemUiVisibility() (flutter/engine#29493) 2022-01-13 skia-flutter-autoroll@skia.org Roll Skia from b21c4af0f670 to 759bc62a06d2 (3 revisions) (flutter/engine#30848) 2022-01-13 akbiggs@users.noreply.github.com [fuchsia] Switch from core-jit to core snapshots. (flutter/engine#30744) Also rolling transitive DEPS: fuchsia/sdk/core/linux-amd64 from 35I2K_BouXUN to V541xkYVrdUC fuchsia/sdk/core/mac-amd64 from Uvw9UoGSmIjy to bGW3xlB1DoAm
* a193f08 [fuchsia] Switch from core-jit to core snapshots. (flutter/engine#30744) * 7e50462 Roll Skia from b21c4af0f670 to 759bc62a06d2 (3 revisions) (flutter/engine#30848) * 8db5038 Remove usages of deprecated setSystemUiVisibility() (flutter/engine#29493) * c05d0df Roll Skia from 759bc62a06d2 to 455e580b9c78 (2 revisions) (flutter/engine#30849) * 1fab2fb Roll Dart SDK from f1c98a571d1a to b36d861d5487 (1 revision) (flutter/engine#30850) * f9385e7 Remove unused field initializing formal parameters. (flutter/engine#30822) * b6e5d99 Roll buildroot to 7effd69. (flutter/engine#30851) * 742eaf8 Roll Skia from 455e580b9c78 to c505bdca9d60 (1 revision) (flutter/engine#30852) * d0f2beb Don't retain the MTLTexture or MTLDevice in TestMetalContext (flutter/engine#30832) * f121c1f Create a DisplayList benchmarks dylib on iOS (flutter/engine#30833) * 4499797 Roll Skia from c505bdca9d60 to 62b32180c192 (1 revision) (flutter/engine#30855) * fcf7458 Move SoftwareCanvasProvider into its own source file (flutter/engine#30856) * 794a833 Roll Fuchsia Mac SDK from Uvw9UoGSm... to BQ2l2096A... (flutter/engine#30859) * 4b32e1c Roll Skia from 62b32180c192 to 119fb6bb2568 (1 revision) (flutter/engine#30860) * facfa74 Roll Dart SDK from b36d861d5487 to ba044d5e9c03 (1 revision) (flutter/engine#30861) * f6613c9 Roll Skia from 119fb6bb2568 to 7c80b2f08ead (1 revision) (flutter/engine#30862) * fb3ee7f Ensure that PlatformViewIOS does not call into Shell semantics APIs during destruction (flutter/engine#30835) * 073e6c5 [Windows, Keyboard] Lift key event redispatching to KeyboardManagerWin32 (flutter/engine#30702) * 88e67a2 Roll Skia from 7c80b2f08ead to a6f2ebf30fea (1 revision) (flutter/engine#30863) * 1f4e7fa Roll Dart SDK from ba044d5e9c03 to aa6fbac07951 (1 revision) (flutter/engine#30867) * 3fbd427 Roll Skia from a6f2ebf30fea to 76e62d32d979 (1 revision) (flutter/engine#30868) * b6db081 Roll Skia from 76e62d32d979 to 7aec4b164e79 (1 revision) (flutter/engine#30869) * b92fd27 Roll Dart SDK from aa6fbac07951 to 68ccd13498be (1 revision) (flutter/engine#30870) * 8961366 Roll Dart SDK from 68ccd13498be to dcab0d0b2f6c (1 revision) (flutter/engine#30872) * 18ea2ce Roll Skia from 7aec4b164e79 to dd9e165ef7d0 (1 revision) (flutter/engine#30874) * 9d660d9 Roll Fuchsia Mac SDK from BQ2l2096A... to bGW3xlB1D... (flutter/engine#30875) * ad68b1b Roll Skia from dd9e165ef7d0 to 1f0e64acd621 (1 revision) (flutter/engine#30876) * b61a6f5 [fuchsia] stamp package with target api level (flutter/engine#30857) * 5787489 Roll Skia from 1f0e64acd621 to f260a297c68d (1 revision) (flutter/engine#30877) * 87ba2d8 Roll Dart SDK from dcab0d0b2f6c to d0d4dbfc6e69 (1 revision) (flutter/engine#30878) * 83d99a5 Roll Fuchsia Linux SDK from 35I2K_Bou... to V541xkYVr... (flutter/engine#30879) * 50adf4c Revert "Remove usages of deprecated setSystemUiVisibility()" (flutter/engine#30880)
* a193f08 [fuchsia] Switch from core-jit to core snapshots. (flutter/engine#30744) * 7e50462 Roll Skia from b21c4af0f670 to 759bc62a06d2 (3 revisions) (flutter/engine#30848) * 8db5038 Remove usages of deprecated setSystemUiVisibility() (flutter/engine#29493) * c05d0df Roll Skia from 759bc62a06d2 to 455e580b9c78 (2 revisions) (flutter/engine#30849) * 1fab2fb Roll Dart SDK from f1c98a571d1a to b36d861d5487 (1 revision) (flutter/engine#30850) * f9385e7 Remove unused field initializing formal parameters. (flutter/engine#30822) * b6e5d99 Roll buildroot to 7effd69. (flutter/engine#30851) * 742eaf8 Roll Skia from 455e580b9c78 to c505bdca9d60 (1 revision) (flutter/engine#30852) * d0f2beb Don't retain the MTLTexture or MTLDevice in TestMetalContext (flutter/engine#30832) * f121c1f Create a DisplayList benchmarks dylib on iOS (flutter/engine#30833) * 4499797 Roll Skia from c505bdca9d60 to 62b32180c192 (1 revision) (flutter/engine#30855) * fcf7458 Move SoftwareCanvasProvider into its own source file (flutter/engine#30856) * 794a833 Roll Fuchsia Mac SDK from Uvw9UoGSm... to BQ2l2096A... (flutter/engine#30859) * 4b32e1c Roll Skia from 62b32180c192 to 119fb6bb2568 (1 revision) (flutter/engine#30860) * facfa74 Roll Dart SDK from b36d861d5487 to ba044d5e9c03 (1 revision) (flutter/engine#30861) * f6613c9 Roll Skia from 119fb6bb2568 to 7c80b2f08ead (1 revision) (flutter/engine#30862) * fb3ee7f Ensure that PlatformViewIOS does not call into Shell semantics APIs during destruction (flutter/engine#30835) * 073e6c5 [Windows, Keyboard] Lift key event redispatching to KeyboardManagerWin32 (flutter/engine#30702) * 88e67a2 Roll Skia from 7c80b2f08ead to a6f2ebf30fea (1 revision) (flutter/engine#30863) * 1f4e7fa Roll Dart SDK from ba044d5e9c03 to aa6fbac07951 (1 revision) (flutter/engine#30867) * 3fbd427 Roll Skia from a6f2ebf30fea to 76e62d32d979 (1 revision) (flutter/engine#30868) * b6db081 Roll Skia from 76e62d32d979 to 7aec4b164e79 (1 revision) (flutter/engine#30869) * b92fd27 Roll Dart SDK from aa6fbac07951 to 68ccd13498be (1 revision) (flutter/engine#30870) * 8961366 Roll Dart SDK from 68ccd13498be to dcab0d0b2f6c (1 revision) (flutter/engine#30872) * 18ea2ce Roll Skia from 7aec4b164e79 to dd9e165ef7d0 (1 revision) (flutter/engine#30874) * 9d660d9 Roll Fuchsia Mac SDK from BQ2l2096A... to bGW3xlB1D... (flutter/engine#30875) * ad68b1b Roll Skia from dd9e165ef7d0 to 1f0e64acd621 (1 revision) (flutter/engine#30876) * b61a6f5 [fuchsia] stamp package with target api level (flutter/engine#30857) * 5787489 Roll Skia from 1f0e64acd621 to f260a297c68d (1 revision) (flutter/engine#30877) * 87ba2d8 Roll Dart SDK from dcab0d0b2f6c to d0d4dbfc6e69 (1 revision) (flutter/engine#30878) * 83d99a5 Roll Fuchsia Linux SDK from 35I2K_Bou... to V541xkYVr... (flutter/engine#30879) * 50adf4c Revert "Remove usages of deprecated setSystemUiVisibility()" (flutter/engine#30880)
This fixes a memory leak where we weren't ever releasing the
MTLTexture
,MTLDevice
orMTLTextureDescriptor
inTestMetalContext
.Basically, in
CreateMetalTexture
we manually retain theMTLTexture
andMTLTextureDescriptor
when we create them, but this is unnecessary as we automatically take ownership of both of these. TheMTLTextureDescriptor
is automatically released at the end of the block byscoped_nsobject
, but theMTLTexture
needs to be released in the destructor.Similarly in the
TestMetalContext
constructor, we manuallyretain
the device returned byMTLCreateSystemDefaultDevice()
, but as we are expected to have ownership of it this is unnecessary. Thefml::scoped_nsprotocol
/scoped_nsobject
smart pointers adopt the ownership without callingretain
, andrelease
when going out of scope at the end of the constructor, which is fine because we assign them to the private members before then, with an additionalretain
call.The additional
retain
calls at the end of the constructor are fine as they are balanced out by therelease
calls in the destructor.This is poorly documented in the Apple docs, but I believe the "Create" rule described at https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-103029 should cover it.