Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_34031325
engine
提交
07e7dafa
E
engine
项目概览
qq_34031325
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
engine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
07e7dafa
编写于
2月 22, 2021
作者:
K
Kaushik Iska
提交者:
GitHub
2月 22, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[macos] Make metal the default rendering backend on macOS >= 10.14 (#23967)
Fixes:
https://github.com/flutter/flutter/issues/74058
上级
9fd39160
变更
10
显示空白变更内容
内联
并排
Showing
10 changed file
with
125 addition
and
62 deletion
+125
-62
ci/licenses_golden/licenses_flutter
ci/licenses_golden/licenses_flutter
+2
-0
shell/platform/darwin/macos/BUILD.gn
shell/platform/darwin/macos/BUILD.gn
+7
-14
shell/platform/darwin/macos/framework/Source/FlutterEmbedderExternalTextureUnittests.mm
...amework/Source/FlutterEmbedderExternalTextureUnittests.mm
+3
-5
shell/platform/darwin/macos/framework/Source/FlutterEngine.mm
...l/platform/darwin/macos/framework/Source/FlutterEngine.mm
+3
-10
shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm
...arwin/macos/framework/Source/FlutterOpenGLRendererTest.mm
+27
-12
shell/platform/darwin/macos/framework/Source/FlutterRenderingBackend.h
...m/darwin/macos/framework/Source/FlutterRenderingBackend.h
+30
-0
shell/platform/darwin/macos/framework/Source/FlutterRenderingBackend.mm
.../darwin/macos/framework/Source/FlutterRenderingBackend.mm
+44
-0
shell/platform/darwin/macos/framework/Source/FlutterView.mm
shell/platform/darwin/macos/framework/Source/FlutterView.mm
+3
-11
shell/platform/darwin/macos/framework/Source/FlutterViewController.mm
...rm/darwin/macos/framework/Source/FlutterViewController.mm
+2
-5
tools/gn
tools/gn
+4
-5
未找到文件。
ci/licenses_golden/licenses_flutter
浏览文件 @
07e7dafa
...
...
@@ -1132,6 +1132,8 @@ FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterOpenG
FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.mm
FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm
FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterRenderer.h
FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterRenderingBackend.h
FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterRenderingBackend.mm
FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterResizableBackingStoreProvider.h
FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterResizableBackingStoreProvider.mm
FILE: ../../../flutter/shell/platform/darwin/macos/framework/Source/FlutterResizeSynchronizer.h
...
...
shell/platform/darwin/macos/BUILD.gn
浏览文件 @
07e7dafa
...
...
@@ -82,6 +82,8 @@ source_set("flutter_framework_source") {
"framework/Source/FlutterOpenGLRenderer.h",
"framework/Source/FlutterOpenGLRenderer.mm",
"framework/Source/FlutterRenderer.h",
"framework/Source/FlutterRenderingBackend.h",
"framework/Source/FlutterRenderingBackend.mm",
"framework/Source/FlutterResizableBackingStoreProvider.h",
"framework/Source/FlutterResizableBackingStoreProvider.mm",
"framework/Source/FlutterResizeSynchronizer.h",
...
...
@@ -152,23 +154,17 @@ executable("flutter_desktop_darwin_unittests") {
testonly = true
sources = [
"framework/Source/FlutterEmbedderExternalTextureUnittests.mm",
"framework/Source/FlutterEngineTest.mm",
"framework/Source/FlutterGLCompositorUnittests.mm",
"framework/Source/FlutterMetalRendererTest.mm",
"framework/Source/FlutterMetalSurfaceManagerTest.mm",
"framework/Source/FlutterOpenGLRendererTest.mm",
"framework/Source/FlutterViewControllerTest.mm",
"framework/Source/FlutterViewControllerTestUtils.h",
"framework/Source/FlutterViewControllerTestUtils.mm",
]
if (shell_enable_metal) {
sources += [
"framework/Source/FlutterEmbedderExternalTextureUnittests.mm",
"framework/Source/FlutterMetalRendererTest.mm",
"framework/Source/FlutterMetalSurfaceManagerTest.mm",
]
} else {
sources += [ "framework/Source/FlutterOpenGLRendererTest.mm" ]
}
cflags_objcc = flutter_cflags_objcc_arc
ldflags = [ "-ObjC" ]
...
...
@@ -177,6 +173,7 @@ executable("flutter_desktop_darwin_unittests") {
":flutter_desktop_darwin_fixtures",
":flutter_framework_source",
"//flutter/shell/platform/darwin/common:framework_shared",
"//flutter/shell/platform/darwin/graphics",
"//flutter/shell/platform/embedder:embedder_as_internal_library",
"//flutter/shell/platform/embedder:embedder_test_utils",
"//flutter/testing",
...
...
@@ -185,10 +182,6 @@ executable("flutter_desktop_darwin_unittests") {
"//flutter/testing:testing_lib",
"//third_party/ocmock:ocmock",
]
if (shell_enable_metal) {
deps += [ "//flutter/shell/platform/darwin/graphics" ]
}
}
copy("copy_dylib") {
...
...
shell/platform/darwin/macos/framework/Source/FlutterEmbedderExternalTextureUnittests.mm
浏览文件 @
07e7dafa
...
...
@@ -41,6 +41,9 @@ TEST(FlutterEmbedderExternalTextureUnittests, TestTextureResolution) {
textureDescriptor
.
usage
=
MTLTextureUsageRenderTarget
|
MTLTextureUsageShaderRead
;
id
<
MTLTexture
>
mtlTexture
=
[
darwinContextMetal
.
device
newTextureWithDescriptor
:
textureDescriptor
];
std
::
vector
<
FlutterMetalTextureHandle
>
textures
=
{
(
__bridge
FlutterMetalTextureHandle
)
mtlTexture
,
};
// callback to resolve the texture.
EmbedderExternalTextureMetal
::
ExternalTextureCallback
callback
=
[
&
](
int64_t
texture_id
,
size_t
w
,
...
...
@@ -54,11 +57,6 @@ TEST(FlutterEmbedderExternalTextureUnittests, TestTextureResolution) {
texture
->
height
=
h
;
texture
->
width
=
w
;
texture
->
pixel_format
=
FlutterMetalExternalTexturePixelFormat
::
kRGBA
;
std
::
vector
<
FlutterMetalTextureHandle
>
textures
=
{
(
__bridge
FlutterMetalTextureHandle
)
mtlTexture
,
};
texture
->
textures
=
textures
.
data
();
return
std
::
unique_ptr
<
FlutterMetalExternalTexture
>
(
texture
);
...
...
shell/platform/darwin/macos/framework/Source/FlutterEngine.mm
浏览文件 @
07e7dafa
...
...
@@ -13,6 +13,7 @@
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterGLCompositor.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterRenderingBackend.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterViewController_Internal.h"
#import "flutter/shell/platform/embedder/embedder.h"
...
...
@@ -131,10 +132,6 @@ static void OnPlatformMessage(const FlutterPlatformMessage* message, FlutterEngi
// Pointer to the Dart AOT snapshot and instruction data.
_FlutterEngineAOTData
*
_aotData
;
// If set to true, engine will render using metal. This is controlled by SHELL_ENABLE_METAL
// for now, intent is to be made default in the future.
BOOL
_enableMetalRendering
;
// _macOSGLCompositor is created when the engine is created and
// it's destruction is handled by ARC when the engine is destroyed.
std
::
unique_ptr
<
flutter
::
FlutterGLCompositor
>
_macOSGLCompositor
;
...
...
@@ -157,14 +154,10 @@ static void OnPlatformMessage(const FlutterPlatformMessage* message, FlutterEngi
_messageHandlers
=
[[
NSMutableDictionary
alloc
]
init
];
_allowHeadlessExecution
=
allowHeadlessExecution
;
#ifdef SHELL_ENABLE_METAL
_enableMetalRendering
=
YES
;
#endif
_embedderAPI
.
struct_size
=
sizeof
(
FlutterEngineProcTable
);
FlutterEngineGetProcAddresses
(
&
_embedderAPI
);
if
(
_enableMetalRendering
)
{
if
(
[
FlutterRenderingBackend
renderUsingMetal
]
)
{
_renderer
=
[[
FlutterMetalRenderer
alloc
]
initWithFlutterEngine
:
self
];
}
else
{
_renderer
=
[[
FlutterOpenGLRenderer
alloc
]
initWithFlutterEngine
:
self
];
...
...
@@ -307,7 +300,7 @@ static void OnPlatformMessage(const FlutterPlatformMessage* message, FlutterEngi
-
(
FlutterCompositor
*
)
createFlutterCompositor
{
// When rendering with metal do not support platform views.
if
(
_enableMetalRendering
)
{
if
(
[
FlutterRenderingBackend
renderUsingMetal
]
)
{
return
nil
;
}
...
...
shell/platform/darwin/macos/framework/Source/FlutterOpenGLRendererTest.mm
浏览文件 @
07e7dafa
...
...
@@ -13,21 +13,36 @@
#include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
#include "flutter/testing/testing.h"
namespace
flutter
::
testing
{
@interface
TestOpenGLEngine
:
FlutterEngine
@property
(
nonatomic
,
readwrite
)
id
<
FlutterRenderer
>
renderer
;
-
(
nullable
instancetype
)
initWithGLRenderer
;
@end
@implementation
TestOpenGLEngine
namespace
{
// Returns an engine configured for the test fixture resource configuration.
FlutterEngine
*
CreateTestEngine
()
{
NSString
*
fixtures
=
@
(
testing
::
GetFixturesPath
());
@synthesize
renderer
;
-
(
nullable
instancetype
)
initWithGLRenderer
{
NSString
*
fixtures
=
@
(
flutter
::
testing
::
GetFixturesPath
());
FlutterDartProject
*
project
=
[[
FlutterDartProject
alloc
]
initWithAssetsPath:
fixtures
ICUDataPath:
[
fixtures
stringByAppendingString
:
@"/icudtl.dat"
]];
return
[[
FlutterEngine
alloc
]
initWithName
:
@"test"
project
:
project
allowHeadlessExecution
:
true
];
self
=
[
self
initWithName
:
@"test"
project
:
project
allowHeadlessExecution
:
true
];
if
(
self
)
{
renderer
=
[[
FlutterOpenGLRenderer
alloc
]
initWithFlutterEngine
:
self
];
}
return
self
;
}
}
// namespace
@end
namespace
flutter
::
testing
{
TEST
(
FlutterOpenGLRenderer
,
RegisterExternalTexture
)
{
FlutterEngine
*
engine
=
CreateTestEngine
()
;
FlutterEngine
*
engine
=
[[
TestOpenGLEngine
alloc
]
initWithGLRenderer
]
;
EXPECT_TRUE
([
engine
runWithEntrypoint
:
@"main"
]);
id
<
FlutterTexture
>
flutterTexture
=
OCMProtocolMock
(
@protocol
(
FlutterTexture
));
...
...
@@ -48,7 +63,7 @@ TEST(FlutterOpenGLRenderer, RegisterExternalTexture) {
}
TEST
(
FlutterOpenGLRenderer
,
UnregisterExternalTexture
)
{
FlutterEngine
*
engine
=
CreateTestEngine
()
;
FlutterEngine
*
engine
=
[[
TestOpenGLEngine
alloc
]
initWithGLRenderer
]
;
EXPECT_TRUE
([
engine
runWithEntrypoint
:
@"main"
]);
id
<
FlutterTexture
>
flutterTexture
=
OCMProtocolMock
(
@protocol
(
FlutterTexture
));
...
...
@@ -70,7 +85,7 @@ TEST(FlutterOpenGLRenderer, UnregisterExternalTexture) {
}
TEST
(
FlutterOpenGLRenderer
,
MarkExternalTextureFrameAvailable
)
{
FlutterEngine
*
engine
=
CreateTestEngine
()
;
FlutterEngine
*
engine
=
[[
TestOpenGLEngine
alloc
]
initWithGLRenderer
]
;
EXPECT_TRUE
([
engine
runWithEntrypoint
:
@"main"
]);
id
<
FlutterTexture
>
flutterTexture
=
OCMProtocolMock
(
@protocol
(
FlutterTexture
));
...
...
@@ -92,7 +107,7 @@ TEST(FlutterOpenGLRenderer, MarkExternalTextureFrameAvailable) {
}
TEST
(
FlutterOpenGLRenderer
,
PresetDelegatesToFlutterView
)
{
FlutterEngine
*
engine
=
CreateTestEngine
()
;
FlutterEngine
*
engine
=
[[
TestOpenGLEngine
alloc
]
initWithGLRenderer
]
;
FlutterOpenGLRenderer
*
renderer
=
[[
FlutterOpenGLRenderer
alloc
]
initWithFlutterEngine
:
engine
];
id
mockFlutterView
=
OCMClassMock
([
FlutterView
class
]);
[[
mockFlutterView
expect
]
present
];
...
...
@@ -102,7 +117,7 @@ TEST(FlutterOpenGLRenderer, PresetDelegatesToFlutterView) {
}
TEST
(
FlutterOpenGLRenderer
,
FBOReturnedByFlutterView
)
{
FlutterEngine
*
engine
=
CreateTestEngine
()
;
FlutterEngine
*
engine
=
[[
TestOpenGLEngine
alloc
]
initWithGLRenderer
]
;
FlutterOpenGLRenderer
*
renderer
=
[[
FlutterOpenGLRenderer
alloc
]
initWithFlutterEngine
:
engine
];
id
mockFlutterView
=
OCMClassMock
([
FlutterView
class
]);
FlutterFrameInfo
frameInfo
;
...
...
shell/platform/darwin/macos/framework/Source/FlutterRenderingBackend.h
0 → 100644
浏览文件 @
07e7dafa
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <Cocoa/Cocoa.h>
/**
* Flutter on macOS currently supports both OpenGL and Metal rendering backends. This class provides
* utilities for determining the rendering backend and the corresponging layer properties.
*/
@interface
FlutterRenderingBackend
:
NSObject
/**
* Returns YES if the engine is supposed to use Metal as the rendering backend. On macOS versions
* >= 10.4 this is YES.
*/
+
(
BOOL
)
renderUsingMetal
;
/**
* CALayer class depending on the rendering backend.
*/
+
(
nonnull
Class
)
layerClass
;
/**
* On both Metal and OpenGL rendering backends, `wantsLayer` is set on the `FlutterView`. This
* methos is used by `FlutterView` to provide the said `CALayer`.
*/
+
(
nonnull
CALayer
*
)
createBackingLayer
;
@end
shell/platform/darwin/macos/framework/Source/FlutterRenderingBackend.mm
0 → 100644
浏览文件 @
07e7dafa
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterRenderingBackend.h"
#import <QuartzCore/QuartzCore.h>
@implementation
FlutterRenderingBackend
+
(
BOOL
)
renderUsingMetal
{
if
(
@available
(
macOS
10.14
,
*
))
{
return
YES
;
}
else
{
return
NO
;
}
}
+
(
Class
)
layerClass
{
BOOL
enableMetal
=
[
FlutterRenderingBackend
renderUsingMetal
];
if
(
enableMetal
)
{
return
[
CAMetalLayer
class
];
}
else
{
return
[
CAOpenGLLayer
class
];
}
}
+
(
CALayer
*
)
createBackingLayer
{
BOOL
enableMetal
=
[
FlutterRenderingBackend
renderUsingMetal
];
if
(
enableMetal
)
{
CAMetalLayer
*
metalLayer
=
[
CAMetalLayer
layer
];
// This is set to true to synchronize the presentation of the layer and its contents with Core
// Animation. When presenting the texture see `[FlutterMetalResizableBackingStoreProvider
// resizeSynchronizerCommit:]` we start a CATransaction and wait for the command buffer to be
// scheduled. This ensures that the resizing process is smooth.
metalLayer
.
presentsWithTransaction
=
YES
;
metalLayer
.
autoresizingMask
=
kCALayerHeightSizable
|
kCALayerWidthSizable
;
return
metalLayer
;
}
else
{
return
[
CAOpenGLLayer
layer
];
}
}
@end
shell/platform/darwin/macos/framework/Source/FlutterView.mm
浏览文件 @
07e7dafa
...
...
@@ -4,6 +4,7 @@
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterView.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterRenderingBackend.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterResizeSynchronizer.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterSurfaceManager.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/MacOSGLContextSwitch.h"
...
...
@@ -39,22 +40,13 @@
return
self
;
}
#ifdef SHELL_ENABLE_METAL
+
(
Class
)
layerClass
{
return
[
CAMetalLayer
c
lass
];
return
[
FlutterRenderingBackend
layerC
lass
];
}
-
(
CALayer
*
)
makeBackingLayer
{
CAMetalLayer
*
metalLayer
=
[
CAMetalLayer
layer
];
// This is set to true to synchronize the presentation of the layer and its contents with Core
// Animation. When presenting the texture see `[FlutterMetalResizableBackingStoreProvider
// resizeSynchronizerCommit:]` we start a CATransaction and wait for the command buffer to be
// scheduled. This ensures that the resizing process is smooth.
metalLayer
.
presentsWithTransaction
=
YES
;
metalLayer
.
autoresizingMask
=
kCALayerHeightSizable
|
kCALayerWidthSizable
;
return
metalLayer
;
return
[
FlutterRenderingBackend
createBackingLayer
];
}
#endif
-
(
instancetype
)
initWithMainContext
:(
NSOpenGLContext
*
)
mainContext
reshapeListener
:(
id
<
FlutterViewReshapeListener
>
)
reshapeListener
{
...
...
shell/platform/darwin/macos/framework/Source/FlutterViewController.mm
浏览文件 @
07e7dafa
...
...
@@ -12,6 +12,7 @@
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterMetalRenderer.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterMouseCursorPlugin.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterOpenGLRenderer.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterRenderingBackend.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterTextInputPlugin.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterView.h"
#import "flutter/shell/platform/embedder/embedder.h"
...
...
@@ -278,11 +279,7 @@ static void CommonInit(FlutterViewController* controller) {
-
(
void
)
loadView
{
FlutterView
*
flutterView
;
BOOL
enableMetalRendering
=
NO
;
#ifdef SHELL_ENABLE_METAL
enableMetalRendering
=
YES
;
#endif
if
(
enableMetalRendering
)
{
if
([
FlutterRenderingBackend
renderUsingMetal
])
{
FlutterMetalRenderer
*
metalRenderer
=
reinterpret_cast
<
FlutterMetalRenderer
*>
(
_engine
.
renderer
);
id
<
MTLDevice
>
device
=
metalRenderer
.
device
;
id
<
MTLCommandQueue
>
commandQueue
=
metalRenderer
.
commandQueue
;
...
...
tools/gn
浏览文件 @
07e7dafa
...
...
@@ -54,6 +54,9 @@ def get_out_dir(args):
if
args
.
enable_vulkan
:
target_dir
.
append
(
'vulkan'
)
# This exists for backwards compatibility of tests that are being run
# on LUCI. This can be removed in coordination with a LUCI change:
# https://github.com/flutter/flutter/issues/76547
if
args
.
macos_enable_metal
:
target_dir
.
append
(
'metal'
)
...
...
@@ -263,11 +266,7 @@ def to_gn_args(args):
# build a macOS metal only shell and a gl only shell.
gn_args
[
'allow_deprecated_api_calls'
]
=
True
gn_args
[
'skia_use_metal'
]
=
True
if
args
.
macos_enable_metal
:
gn_args
[
'shell_enable_metal'
]
=
True
# Skia has Metal support on macOS version >= 10.14.
MACOS_SKIA_METAL_SUPPORTED_MIN_VERSION
=
'10.14'
gn_args
[
'mac_sdk_min'
]
=
MACOS_SKIA_METAL_SUPPORTED_MIN_VERSION
if
args
.
enable_vulkan
:
# Enable vulkan in the Flutter shell.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录