[Impeller] fix macOS managed memory. (#164635)

Still crashes with non UMA GPU. Reason is that the if check is using
`MTLResourceStorageModeManaged` when it should be using
`MTLStorageModeManaged`

Fixes https://github.com/flutter/flutter/issues/163218
This commit is contained in:
Jonah Williams 2025-03-05 12:40:20 -08:00 committed by GitHub
parent 1e9676fc95
commit 1cd6cb0cdc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 27 additions and 3 deletions

View File

@ -44,6 +44,11 @@ class AllocatorMTL final : public Allocator {
// |Allocator|
Bytes DebugGetHeapUsage() const override;
// visible for testing.
void DebugSetSupportsUMA(bool value);
AllocatorMTL(id<MTLDevice> device, std::string label);
private:
friend class ContextMTL;
@ -60,8 +65,6 @@ class AllocatorMTL final : public Allocator {
ISize max_texture_supported_;
AllocatorMTL(id<MTLDevice> device, std::string label);
// |Allocator|
bool IsValid() const;

View File

@ -255,6 +255,10 @@ ISize AllocatorMTL::GetMaxTextureSizeSupported() const {
return max_texture_supported_;
}
void AllocatorMTL::DebugSetSupportsUMA(bool value) {
supports_uma_ = value;
}
Bytes AllocatorMTL::DebugGetHeapUsage() const {
#ifdef IMPELLER_DEBUG
return debug_allocater_->GetAllocationSize();

View File

@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "flutter/testing/testing.h"
#include "impeller/core/device_buffer_descriptor.h"
#include "impeller/core/formats.h"
#include "impeller/core/texture_descriptor.h"
#include "impeller/playground/playground_test.h"
@ -70,5 +71,21 @@ TEST_P(AllocatorMTLTest, DebugTraceMemoryStatistics) {
0u);
}
TEST_P(AllocatorMTLTest, ManagedMemory) {
auto& context_mtl = ContextMTL::Cast(*GetContext());
auto allocator = std::make_unique<AllocatorMTL>(context_mtl.GetMTLDevice(),
"test-allocator");
allocator->DebugSetSupportsUMA(false);
DeviceBufferDescriptor desc;
desc.size = 100;
desc.storage_mode = StorageMode::kHostVisible;
auto buffer = allocator->CreateBuffer(desc);
ASSERT_TRUE(buffer);
EXPECT_NE(buffer->OnGetContents(), nullptr);
}
} // namespace testing
} // namespace impeller

View File

@ -25,7 +25,7 @@ id<MTLBuffer> DeviceBufferMTL::GetMTLBuffer() const {
uint8_t* DeviceBufferMTL::OnGetContents() const {
#if !FML_OS_IOS
if (storage_mode_ != MTLStorageModeShared &&
storage_mode_ != MTLResourceStorageModeManaged) {
storage_mode_ != MTLStorageModeManaged) {
return nullptr;
}
#else