TestMetalContext: Use ARC-managed Metal types (flutter/engine#56717)
Previously, we could not include any Objective-C types in test_metal_context.h, since that file was transitively included in pure C++ translation units. All users have been refactored into backend-specific files, and all Metal-related files are Objective-C++ files. We now use Metal types directly in the header, without the workarounds. Issue: https://github.com/flutter/flutter/issues/158998 Issue: https://github.com/flutter/flutter/issues/137801 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
This commit is contained in:
parent
ccef3ff9c3
commit
1a60defc96
@ -19,8 +19,9 @@ EmbedderTestContextMetal::EmbedderTestContextMetal(std::string assets_path)
|
||||
renderer_config_.type = FlutterRendererType::kMetal;
|
||||
renderer_config_.metal = {
|
||||
.struct_size = sizeof(FlutterMetalRendererConfig),
|
||||
.device = metal_context_->GetMetalDevice(),
|
||||
.present_command_queue = metal_context_->GetMetalCommandQueue(),
|
||||
.device = (__bridge FlutterMetalDeviceHandle)metal_context_->GetMetalDevice(),
|
||||
.present_command_queue =
|
||||
(__bridge FlutterMetalCommandQueueHandle)metal_context_->GetMetalCommandQueue(),
|
||||
.get_next_drawable_callback =
|
||||
[](void* user_data, const FlutterFrameInfo* frame_info) {
|
||||
return reinterpret_cast<EmbedderTestContextMetal*>(user_data)->GetNextDrawable(
|
||||
|
@ -9,6 +9,8 @@
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
|
||||
#include <Metal/Metal.h>
|
||||
|
||||
#include "third_party/skia/include/gpu/ganesh/GrDirectContext.h"
|
||||
#include "third_party/skia/include/ports/SkCFObject.h"
|
||||
|
||||
@ -27,9 +29,9 @@ class TestMetalContext {
|
||||
|
||||
~TestMetalContext();
|
||||
|
||||
void* GetMetalDevice() const;
|
||||
id<MTLDevice> GetMetalDevice() const;
|
||||
|
||||
void* GetMetalCommandQueue() const;
|
||||
id<MTLCommandQueue> GetMetalCommandQueue() const;
|
||||
|
||||
sk_sp<GrDirectContext> GetSkiaContext() const;
|
||||
|
||||
@ -41,7 +43,8 @@ class TestMetalContext {
|
||||
TextureInfo GetTextureInfo(int64_t texture_id);
|
||||
|
||||
private:
|
||||
std::unique_ptr<MetalObjCFields> metal_;
|
||||
id<MTLDevice> device_;
|
||||
id<MTLCommandQueue> command_queue_;
|
||||
sk_sp<GrDirectContext> skia_context_;
|
||||
std::mutex textures_mutex_;
|
||||
int64_t texture_id_ctr_ = 1; // guarded by textures_mutex
|
||||
|
@ -17,12 +17,6 @@ static_assert(__has_feature(objc_arc), "ARC must be enabled.");
|
||||
|
||||
namespace flutter::testing {
|
||||
|
||||
// TOOD(cbracken): https://github.com/flutter/flutter/issues/157942
|
||||
struct MetalObjCFields {
|
||||
id<MTLDevice> device;
|
||||
id<MTLCommandQueue> command_queue;
|
||||
};
|
||||
|
||||
TestMetalContext::TestMetalContext() {
|
||||
id<MTLDevice> device = MTLCreateSystemDefaultDevice();
|
||||
if (!device) {
|
||||
@ -48,22 +42,21 @@ TestMetalContext::TestMetalContext() {
|
||||
FML_LOG(ERROR) << "Could not create the GrDirectContext from the Metal Device "
|
||||
"and command queue.";
|
||||
}
|
||||
|
||||
metal_ = std::make_unique<MetalObjCFields>(MetalObjCFields{device, command_queue});
|
||||
device_ = device;
|
||||
command_queue_ = command_queue;
|
||||
}
|
||||
|
||||
TestMetalContext::~TestMetalContext() {
|
||||
std::scoped_lock lock(textures_mutex_);
|
||||
textures_.clear();
|
||||
metal_.reset();
|
||||
}
|
||||
|
||||
void* TestMetalContext::GetMetalDevice() const {
|
||||
return metal_ ? (__bridge void*)metal_->device : nil;
|
||||
id<MTLDevice> TestMetalContext::GetMetalDevice() const {
|
||||
return device_;
|
||||
}
|
||||
|
||||
void* TestMetalContext::GetMetalCommandQueue() const {
|
||||
return metal_ ? (__bridge void*)metal_->command_queue : nil;
|
||||
id<MTLCommandQueue> TestMetalContext::GetMetalCommandQueue() const {
|
||||
return command_queue_;
|
||||
}
|
||||
|
||||
sk_sp<GrDirectContext> TestMetalContext::GetSkiaContext() const {
|
||||
@ -88,12 +81,12 @@ TestMetalContext::TextureInfo TestMetalContext::CreateMetalTexture(const SkISize
|
||||
return {.texture_id = -1, .texture = nullptr};
|
||||
}
|
||||
|
||||
if (!metal_) {
|
||||
if (!device_) {
|
||||
FML_CHECK(false) << "Invalid Metal device.";
|
||||
return {.texture_id = -1, .texture = nullptr};
|
||||
}
|
||||
|
||||
id<MTLTexture> texture = [metal_->device newTextureWithDescriptor:texture_descriptor];
|
||||
id<MTLTexture> texture = [device_ newTextureWithDescriptor:texture_descriptor];
|
||||
if (!texture) {
|
||||
FML_CHECK(false) << "Could not create texture from texture descriptor.";
|
||||
return {.texture_id = -1, .texture = nullptr};
|
||||
|
Loading…
x
Reference in New Issue
Block a user