Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit aeb2cd9

Browse files
author
Jonah Williams
authored
[Impeller] use SSBOs for gradients where supported (metal/vulkan) (#37654)
* [Impeller] use uniform array for more efficient small gradients * ++ * Make this work on Android * ++ * ++ * ++ * compiler support and basic feature detection * ++ * ++ * rename to ssbo_fill, move to context * ++ * ++ * ++ * tests * ++ * ++
1 parent e3844cc commit aeb2cd9

39 files changed

+718
-32
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,7 @@ FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/branching.glsl
11211121
FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/color.glsl
11221122
FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/constants.glsl
11231123
FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/gaussian.glsl
1124+
FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/gradient.glsl
11241125
FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/texture.glsl
11251126
FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/transform.glsl
11261127
FILE: ../../../flutter/impeller/compiler/shader_lib/impeller/types.glsl
@@ -1291,6 +1292,7 @@ FILE: ../../../flutter/impeller/entity/shaders/glyph_atlas_sdf.frag
12911292
FILE: ../../../flutter/impeller/entity/shaders/glyph_atlas_sdf.vert
12921293
FILE: ../../../flutter/impeller/entity/shaders/gradient_fill.vert
12931294
FILE: ../../../flutter/impeller/entity/shaders/linear_gradient_fill.frag
1295+
FILE: ../../../flutter/impeller/entity/shaders/linear_gradient_ssbo_fill.frag
12941296
FILE: ../../../flutter/impeller/entity/shaders/linear_to_srgb_filter.frag
12951297
FILE: ../../../flutter/impeller/entity/shaders/linear_to_srgb_filter.vert
12961298
FILE: ../../../flutter/impeller/entity/shaders/morphology_filter.frag
@@ -1299,6 +1301,7 @@ FILE: ../../../flutter/impeller/entity/shaders/position.vert
12991301
FILE: ../../../flutter/impeller/entity/shaders/position_color.vert
13001302
FILE: ../../../flutter/impeller/entity/shaders/position_uv.vert
13011303
FILE: ../../../flutter/impeller/entity/shaders/radial_gradient_fill.frag
1304+
FILE: ../../../flutter/impeller/entity/shaders/radial_gradient_ssbo_fill.frag
13021305
FILE: ../../../flutter/impeller/entity/shaders/rrect_blur.frag
13031306
FILE: ../../../flutter/impeller/entity/shaders/rrect_blur.vert
13041307
FILE: ../../../flutter/impeller/entity/shaders/runtime_effect.vert
@@ -1307,6 +1310,7 @@ FILE: ../../../flutter/impeller/entity/shaders/solid_fill.vert
13071310
FILE: ../../../flutter/impeller/entity/shaders/srgb_to_linear_filter.frag
13081311
FILE: ../../../flutter/impeller/entity/shaders/srgb_to_linear_filter.vert
13091312
FILE: ../../../flutter/impeller/entity/shaders/sweep_gradient_fill.frag
1313+
FILE: ../../../flutter/impeller/entity/shaders/sweep_gradient_ssbo_fill.frag
13101314
FILE: ../../../flutter/impeller/entity/shaders/texture_fill.frag
13111315
FILE: ../../../flutter/impeller/entity/shaders/texture_fill.vert
13121316
FILE: ../../../flutter/impeller/entity/shaders/tiled_texture_fill.frag
@@ -1490,6 +1494,7 @@ FILE: ../../../flutter/impeller/renderer/backend/vulkan/texture_vk.h
14901494
FILE: ../../../flutter/impeller/renderer/backend/vulkan/vertex_descriptor_vk.cc
14911495
FILE: ../../../flutter/impeller/renderer/backend/vulkan/vertex_descriptor_vk.h
14921496
FILE: ../../../flutter/impeller/renderer/backend/vulkan/vk.h
1497+
FILE: ../../../flutter/impeller/renderer/backend_features.h
14931498
FILE: ../../../flutter/impeller/renderer/blit_command.cc
14941499
FILE: ../../../flutter/impeller/renderer/blit_command.h
14951500
FILE: ../../../flutter/impeller/renderer/blit_pass.cc

impeller/compiler/code_gen_template.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,6 @@ using Shader = {{camel_case(shader_name)}}{{camel_case(shader_stage)}}Shader;
202202
// Sanity checks for {{def.name}}
203203
{% if last(def.members).array_elements == 0 %}
204204
static_assert(std::is_standard_layout_v<Shader::{{def.name}}<0>>);
205-
static_assert(sizeof(Shader::{{def.name}}<0>) == {{def.byte_length}});
206205
{% for member in def.members %}
207206
static_assert(offsetof(Shader::{{def.name}}<0>, {{member.name}}) == {{member.offset}});
208207
{% endfor %}

impeller/compiler/compiler.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,14 @@ static CompilerBackend CreateGLSLCompiler(const spirv_cross::ParsedIR& ir,
4545
sl_options.force_zero_initialized_variables = true;
4646
sl_options.vertex.fixup_clipspace = true;
4747
if (source_options.target_platform == TargetPlatform::kOpenGLES) {
48-
sl_options.version = 100;
48+
sl_options.version = source_options.gles_language_version > 0
49+
? source_options.gles_language_version
50+
: 100;
4951
sl_options.es = true;
5052
} else {
51-
sl_options.version = 120;
53+
sl_options.version = source_options.gles_language_version > 0
54+
? source_options.gles_language_version
55+
: 120;
5256
sl_options.es = false;
5357
}
5458
gl_compiler->set_common_options(sl_options);

impeller/compiler/impellerc_main.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ bool Main(const fml::CommandLine& command_line) {
7373
switches.source_file_name, options.type, options.source_language,
7474
switches.entry_point);
7575
options.json_format = switches.json_format;
76+
options.gles_language_version = switches.gles_language_version;
7677

7778
Reflector::Options reflector_options;
7879
reflector_options.target_platform = switches.target_platform;

impeller/compiler/shader_lib/impeller/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ copy("impeller") {
99
"color.glsl",
1010
"constants.glsl",
1111
"gaussian.glsl",
12+
"gradient.glsl",
1213
"texture.glsl",
1314
"transform.glsl",
1415
"types.glsl",
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#ifndef GRADIENT_GLSL_
6+
#define GRADIENT_GLSL_
7+
8+
#include <impeller/texture.glsl>
9+
10+
/// Compute the indexes and mix coefficient used to mix colors for an
11+
/// arbitrarily sized color gradient.
12+
///
13+
/// The returned values are the lower index, upper index, and mix
14+
/// coefficient.
15+
vec3 IPComputeFixedGradientValues(float t, float colors_length) {
16+
float rough_index = (colors_length - 1) * t;
17+
float lower_index = floor(rough_index);
18+
float upper_index = ceil(rough_index);
19+
float scale = rough_index - lower_index;
20+
21+
return vec3(lower_index, upper_index, scale);
22+
}
23+
24+
#endif

impeller/compiler/source_options.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ struct SourceOptions {
2424
std::vector<IncludeDir> include_dirs;
2525
std::string file_name = "main.glsl";
2626
std::string entry_point_name = "main";
27+
uint32_t gles_language_version = 100;
2728
std::vector<std::string> defines;
2829
bool json_format = false;
2930

impeller/compiler/switches.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ void Switches::PrintHelp(std::ostream& stream) {
6969
stream << "[optional,multiple] --include=<include_directory>" << std::endl;
7070
stream << "[optional,multiple] --define=<define>" << std::endl;
7171
stream << "[optional] --depfile=<depfile_path>" << std::endl;
72+
stream << "[optional] --gles-language-verision=<number>" << std::endl;
7273
stream << "[optional] --json" << std::endl;
7374
}
7475

@@ -124,6 +125,9 @@ Switches::Switches(const fml::CommandLine& command_line)
124125
command_line.GetOptionValueWithDefault("reflection-cc", "")),
125126
depfile_path(command_line.GetOptionValueWithDefault("depfile", "")),
126127
json_format(command_line.HasOption("json")),
128+
gles_language_version(
129+
stoi(command_line.GetOptionValueWithDefault("gles-language-version",
130+
"0"))),
127131
entry_point(
128132
command_line.GetOptionValueWithDefault("entry-point", "main")) {
129133
if (!working_directory || !working_directory->is_valid()) {

impeller/compiler/switches.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct Switches {
3333
std::vector<std::string> defines;
3434
bool json_format;
3535
SourceLanguage source_language = SourceLanguage::kUnknown;
36+
uint32_t gles_language_version;
3637
std::string entry_point;
3738

3839
Switches();

impeller/entity/BUILD.gn

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,20 @@ impeller_shaders("entity_shaders") {
6666
]
6767
}
6868

69+
impeller_shaders("modern_entity_shaders") {
70+
name = "modern"
71+
72+
if (impeller_enable_opengles) {
73+
gles_language_version = "460"
74+
}
75+
76+
shaders = [
77+
"shaders/linear_gradient_ssbo_fill.frag",
78+
"shaders/radial_gradient_ssbo_fill.frag",
79+
"shaders/sweep_gradient_ssbo_fill.frag",
80+
]
81+
}
82+
6983
impeller_component("entity") {
7084
sources = [
7185
"contents/atlas_contents.cc",
@@ -146,6 +160,7 @@ impeller_component("entity") {
146160

147161
public_deps = [
148162
":entity_shaders",
163+
":modern_entity_shaders",
149164
"../archivist",
150165
"../image",
151166
"../renderer",

0 commit comments

Comments
 (0)