Skip to content

Commit ec14f94

Browse files
ci_lynxjianliang00
authored andcommitted
[Optimize][Clay] Precompile skity default shaders on clay.
This patch let clay pre-compile some default skity shaders immediately when gl context is just created. This will reduce the first rasterizer task burdens. AutoLand: release/3.8, release/3.9, release/4.0 SkipChecks:macro issue: m-7336681683
1 parent b49ef1d commit ec14f94

8 files changed

Lines changed: 115 additions & 8 deletions

File tree

clay/gfx/rendering_backend.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
#include "skity/include/skity/text/font_manager.hpp"
9191
#include "skity/recorder/picture_recorder.hpp"
9292
#include "skity/render/canvas.hpp"
93+
#include "skity/render/precompile_context.hpp"
9394
#include "skity/text/font.hpp"
9495
#include "skity/text/text_blob.hpp"
9596
#endif // ENABLE_SKITY

clay/shell/common/output_surface.cc

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
#include "clay/shell/common/output_surface.h"
66

7+
#include "base/trace/native/trace_event.h"
8+
#include "clay/common/graphics/gl_context_switch.h"
9+
710
namespace clay {
811

912
OutputSurface::~OutputSurface() = default;
@@ -12,4 +15,42 @@ void OutputSurface::CreateMainGrContext() {}
1215

1316
clay::GrContextPtr OutputSurface::GetMainGrContext() { return nullptr; }
1417

18+
std::unique_ptr<GLContextResult> OutputSurface::MakeCurrent() {
19+
return std::make_unique<GLContextDefaultResult>(true);
20+
}
21+
22+
#ifdef ENABLE_SKITY
23+
void OutputSurface::PrecompileDefaultSkityShaders() {
24+
auto config = GetSkityPrecompileConfig();
25+
if (!config) {
26+
TRACE_EVENT("clay", "PrecompileDefaultSkityShaders config is null");
27+
return;
28+
}
29+
30+
clay::GrContextPtr main_context = GetMainGrContext();
31+
if (!main_context) {
32+
TRACE_EVENT("clay", "PrecompileDefaultSkityShaders main_context is null");
33+
return;
34+
}
35+
36+
auto context_switch = MakeCurrent();
37+
if (!context_switch || !context_switch->GetResult()) {
38+
TRACE_EVENT("clay", "PrecompileDefaultSkityShaders make current failed");
39+
return;
40+
}
41+
42+
TRACE_EVENT("clay", "PrecompileDefaultSkityShaders");
43+
auto precompile_context = main_context->CreatePrecompileContext(
44+
config->color_type, config->enable_msaa);
45+
if (precompile_context) {
46+
precompile_context->PrecompileDefaultShaders();
47+
}
48+
}
49+
50+
std::optional<OutputSurface::SkityPrecompileConfig>
51+
OutputSurface::GetSkityPrecompileConfig() const {
52+
return std::nullopt;
53+
}
54+
#endif // ENABLE_SKITY
55+
1556
} // namespace clay

clay/shell/common/output_surface.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
#define CLAY_SHELL_COMMON_OUTPUT_SURFACE_H_
77

88
#include <memory>
9+
#include <optional>
910

1011
#include "base/include/fml/memory/ref_counted.h"
1112
#include "clay/gfx/rendering_backend.h"
1213

1314
namespace clay {
15+
class GLContextResult;
1416
class Surface;
1517

1618
// OutputSurface is a ref counted object which is owned by platform thread and
@@ -24,10 +26,25 @@ class OutputSurface : public fml::RefCountedThreadSafe<OutputSurface> {
2426

2527
virtual clay::GrContextPtr GetMainGrContext();
2628

29+
virtual std::unique_ptr<GLContextResult> MakeCurrent();
30+
31+
#ifdef ENABLE_SKITY
32+
void PrecompileDefaultSkityShaders();
33+
#endif
34+
2735
virtual std::unique_ptr<Surface> CreateGPUSurface(
2836
clay::GrContext* gr_context = nullptr) = 0;
2937

3038
virtual bool IsValid() const = 0;
39+
40+
protected:
41+
#ifdef ENABLE_SKITY
42+
struct SkityPrecompileConfig {
43+
skity::PrecompileColorType color_type;
44+
bool enable_msaa = false;
45+
};
46+
virtual std::optional<SkityPrecompileConfig> GetSkityPrecompileConfig() const;
47+
#endif
3148
};
3249

3350
} // namespace clay

clay/shell/common/shell.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -561,8 +561,13 @@ bool Shell::Setup(std::unique_ptr<PlatformView> platform_view,
561561
if (output_surface) {
562562
output_surface->CreateMainGrContext();
563563
clay::GrContextPtr main_context = output_surface->GetMainGrContext();
564-
if (main_context && unref_queue) {
565-
unref_queue->SetContext(main_context);
564+
if (main_context) {
565+
#ifdef ENABLE_SKITY
566+
output_surface->PrecompileDefaultSkityShaders();
567+
#endif // ENABLE_SKITY
568+
if (unref_queue) {
569+
unref_queue->SetContext(main_context);
570+
}
566571
}
567572
}
568573
});

clay/shell/platform/embedder/embedder_surface_gl.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,15 @@ clay::GrContextPtr EmbedderSurfaceGL::GetMainGrContext() {
9999
return main_context_;
100100
}
101101

102+
std::unique_ptr<GLContextResult> EmbedderSurfaceGL::MakeCurrent() {
103+
return GLContextMakeCurrent();
104+
}
105+
106+
#ifdef ENABLE_SKITY
107+
std::optional<OutputSurface::SkityPrecompileConfig>
108+
EmbedderSurfaceGL::GetSkityPrecompileConfig() const {
109+
return SkityPrecompileConfig{skity::PrecompileColorType::kRGBA, false};
110+
}
111+
#endif
112+
102113
} // namespace clay

clay/shell/platform/embedder/embedder_surface_gl.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,15 @@ class EmbedderSurfaceGL final : public EmbedderSurface,
4141
// |GPUSurfaceGLDelegate|
4242
std::unique_ptr<GLContextResult> GLContextMakeCurrent() override;
4343

44+
// |OutputSurface|
45+
std::unique_ptr<GLContextResult> MakeCurrent() override;
46+
47+
#ifdef ENABLE_SKITY
48+
// |OutputSurface|
49+
std::optional<SkityPrecompileConfig> GetSkityPrecompileConfig()
50+
const override;
51+
#endif
52+
4453
// |GPUSurfaceGLDelegate|
4554
bool GLContextClearCurrent() override;
4655

clay/shell/platform/embedder/embedder_surface_metal.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ class EmbedderSurfaceMetal final : public EmbedderSurface,
5353
// |OutputSurface|
5454
clay::GrContextPtr GetMainGrContext() override;
5555

56+
#ifdef ENABLE_SKITY
57+
// |OutputSurface|
58+
std::optional<SkityPrecompileConfig> GetSkityPrecompileConfig()
59+
const override;
60+
#endif
61+
5662
// |GPUSurfaceMetalDelegate|
5763
GPUCAMetalLayerHandle GetCAMetalLayer(
5864
const skity::Vec2& frame_size) const override;

clay/shell/platform/embedder/embedder_surface_metal.mm

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,20 @@
2525
FLUTTER_ASSERT_ARC
2626
namespace clay {
2727

28+
namespace {
29+
30+
#ifdef ENABLE_SKITY
31+
constexpr MsaaSampleCount GetSkityMetalMsaaSampleCount() {
32+
#if defined(OS_OSX)
33+
return MsaaSampleCount::kFour;
34+
#else
35+
return MsaaSampleCount::kNone;
36+
#endif
37+
}
38+
#endif // ENABLE_SKITY
39+
40+
} // namespace
41+
2842
EmbedderSurfaceMetal::EmbedderSurfaceMetal(EmbedderSurfaceMetalDelegate* delegate)
2943
: GPUSurfaceMetalDelegate(MTLRenderTargetType::kMTLTexture), delegate_(delegate) {
3044
#ifndef ENABLE_SKITY
@@ -45,6 +59,14 @@
4559

4660
clay::GrContextPtr EmbedderSurfaceMetal::GetMainGrContext() { return main_context_; }
4761

62+
#ifdef ENABLE_SKITY
63+
std::optional<OutputSurface::SkityPrecompileConfig> EmbedderSurfaceMetal::GetSkityPrecompileConfig()
64+
const {
65+
return SkityPrecompileConfig{skity::PrecompileColorType::kBGRA,
66+
GetSkityMetalMsaaSampleCount() != MsaaSampleCount::kNone};
67+
}
68+
#endif // ENABLE_SKITY
69+
4870
EmbedderSurfaceMetal::~EmbedderSurfaceMetal() = default;
4971

5072
bool EmbedderSurfaceMetal::IsValid() const { return valid_; }
@@ -74,12 +96,7 @@
7496
}
7597
auto surface = std::make_unique<GPUSurfaceMetalSkity>(
7698
this, context ? std::shared_ptr<clay::GrContext>(context) : main_context_,
77-
#if defined(OS_OSX)
78-
MsaaSampleCount::kFour,
79-
#else
80-
MsaaSampleCount::kNone,
81-
#endif
82-
true);
99+
GetSkityMetalMsaaSampleCount(), true);
83100

84101
if (!surface->IsValid()) {
85102
return nullptr;

0 commit comments

Comments
 (0)