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

Commit e1c7570

Browse files
committed
Starts a transition to an async FragmentProgram.fromAsset
1 parent 4c613a6 commit e1c7570

File tree

4 files changed

+40
-23
lines changed

4 files changed

+40
-23
lines changed

lib/ui/painting.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4049,6 +4049,12 @@ class FragmentProgram extends NativeFieldWrapperClass1 {
40494049
return program;
40504050
}
40514051

4052+
// TODO(zra): This is part of a soft transition of the framework to this
4053+
// API, which pushes the asset load to an asynchronous operation.
4054+
static Future<FragmentProgram> fromAssetAsync(String assetKey) {
4055+
return Future<FragmentProgram>.microtask(() => FragmentProgram.fromAsset(assetKey));
4056+
}
4057+
40524058
static Map<String, WeakReference<FragmentProgram>> _shaderRegistry =
40534059
<String, WeakReference<FragmentProgram>>{};
40544060

lib/web_ui/lib/painting.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,10 @@ class FragmentProgram {
839839
throw UnsupportedError('FragmentProgram is not supported for the CanvasKit or HTML renderers.');
840840
}
841841

842+
static Future<FragmentProgram> fromAssetAsync(String assetKey) {
843+
return Future<FragmentProgram>.microtask(() => FragmentProgram.fromAsset(assetKey));
844+
}
845+
842846
FragmentProgram._();
843847

844848
Shader shader({

testing/dart/fragment_shader_test.dart

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import 'package:path/path.dart' as path;
1313

1414
import 'shader_test_file_utils.dart';
1515

16-
void main() {
16+
void main() async {
1717
test('simple shader renders correctly', () async {
18-
final FragmentProgram program = FragmentProgram.fromAsset(
18+
final FragmentProgram program = await FragmentProgram.fromAssetAsync(
1919
'functions.frag.iplr',
2020
);
2121
final Shader shader = program.shader(
@@ -25,7 +25,7 @@ void main() {
2525
});
2626

2727
test('blue-green image renders green', () async {
28-
final FragmentProgram program = FragmentProgram.fromAsset(
28+
final FragmentProgram program = await FragmentProgram.fromAssetAsync(
2929
'blue_green_sampler.frag.iplr',
3030
);
3131
final Image blueGreenImage = await _createBlueGreenImage();
@@ -39,7 +39,7 @@ void main() {
3939
});
4040

4141
test('shader with uniforms renders correctly', () async {
42-
final FragmentProgram program = FragmentProgram.fromAsset(
42+
final FragmentProgram program = await FragmentProgram.fromAssetAsync(
4343
'uniforms.frag.iplr',
4444
);
4545

@@ -65,7 +65,7 @@ void main() {
6565
});
6666

6767
test('The ink_sparkle shader is accepted', () async {
68-
final FragmentProgram program = FragmentProgram.fromAsset(
68+
final FragmentProgram program = await FragmentProgram.fromAssetAsync(
6969
'ink_sparkle.frag.iplr',
7070
);
7171
final Shader shader = program.shader(
@@ -79,7 +79,7 @@ void main() {
7979
});
8080

8181
test('Uniforms are sorted correctly', () async {
82-
final FragmentProgram program = FragmentProgram.fromAsset(
82+
final FragmentProgram program = await FragmentProgram.fromAssetAsync(
8383
'uniforms_sorted.frag.iplr',
8484
);
8585

@@ -97,7 +97,7 @@ void main() {
9797
test('fromAsset throws an exception on invalid assetKey', () async {
9898
bool throws = false;
9999
try {
100-
final FragmentProgram program = FragmentProgram.fromAsset(
100+
final FragmentProgram program = await FragmentProgram.fromAssetAsync(
101101
'<invalid>',
102102
);
103103
} catch (e) {
@@ -109,7 +109,7 @@ void main() {
109109
test('fromAsset throws an exception on invalid data', () async {
110110
bool throws = false;
111111
try {
112-
final FragmentProgram program = FragmentProgram.fromAsset(
112+
final FragmentProgram program = await FragmentProgram.fromAssetAsync(
113113
'DashInNooglerHat.jpg',
114114
);
115115
} catch (e) {
@@ -119,31 +119,31 @@ void main() {
119119
});
120120

121121
test('fromAsset accepts a shader with no uniforms', () async {
122-
final FragmentProgram program = FragmentProgram.fromAsset(
122+
final FragmentProgram program = await FragmentProgram.fromAssetAsync(
123123
'no_uniforms.frag.iplr',
124124
);
125125
final Shader shader = program.shader();
126126
await _expectShaderRendersGreen(shader);
127127
});
128128

129129
// Test all supported GLSL ops. See lib/spirv/lib/src/constants.dart
130-
final Map<String, FragmentProgram> iplrSupportedGLSLOpShaders = _loadShaderAssets(
130+
final Map<String, FragmentProgram> iplrSupportedGLSLOpShaders = await _loadShaderAssets(
131131
path.join('supported_glsl_op_shaders', 'iplr'),
132132
'.iplr',
133133
);
134134
expect(iplrSupportedGLSLOpShaders.isNotEmpty, true);
135135
_expectIplrShadersRenderGreen(iplrSupportedGLSLOpShaders);
136136

137137
// Test all supported instructions. See lib/spirv/lib/src/constants.dart
138-
final Map<String, FragmentProgram> iplrSupportedOpShaders = _loadShaderAssets(
138+
final Map<String, FragmentProgram> iplrSupportedOpShaders = await _loadShaderAssets(
139139
path.join('supported_op_shaders', 'iplr'),
140140
'.iplr',
141141
);
142142
expect(iplrSupportedOpShaders.isNotEmpty, true);
143143
_expectIplrShadersRenderGreen(iplrSupportedOpShaders);
144144

145-
test('Equality depends on floatUniforms', () {
146-
final FragmentProgram program = FragmentProgram.fromAsset(
145+
test('Equality depends on floatUniforms', () async {
146+
final FragmentProgram program = await FragmentProgram.fromAssetAsync(
147147
'simple.frag.iplr',
148148
);
149149
final Float32List ones = Float32List.fromList(<double>[1]);
@@ -165,10 +165,10 @@ void main() {
165165
});
166166

167167
test('Equality depends on data', () async {
168-
final FragmentProgram programA = FragmentProgram.fromAsset(
168+
final FragmentProgram programA = await FragmentProgram.fromAssetAsync(
169169
'simple.frag.iplr',
170170
);
171-
final FragmentProgram programB = FragmentProgram.fromAsset(
171+
final FragmentProgram programB = await FragmentProgram.fromAssetAsync(
172172
'uniforms.frag.iplr',
173173
);
174174
final Shader a = programA.shader();
@@ -225,21 +225,28 @@ Future<ByteData?> _imageByteDataFromShader({
225225
// $FLUTTER_BUILD_DIRECTORY/gen/flutter/lib/spirv/test/$leafFolderName
226226
// This is synchronous so that tests can be inside of a loop with
227227
// the proper test name.
228-
Map<String, FragmentProgram> _loadShaderAssets(String leafFolderName, String ext) {
228+
Future<Map<String, FragmentProgram>> _loadShaderAssets(
229+
String leafFolderName,
230+
String ext,
231+
) async {
229232
final Map<String, FragmentProgram> out = SplayTreeMap<String, FragmentProgram>();
230233

231234
final Directory directory = shaderDirectory(leafFolderName);
232235
if (!directory.existsSync()) {
233236
return out;
234237
}
235238

236-
directory
239+
await Future.forEach(
240+
directory
237241
.listSync()
238-
.where((FileSystemEntity entry) => path.extension(entry.path) == ext)
239-
.forEach((FileSystemEntity entry) {
240-
final String key = path.basenameWithoutExtension(entry.path);
241-
out[key] = FragmentProgram.fromAsset(path.basename(entry.path));
242-
});
242+
.where((FileSystemEntity entry) => path.extension(entry.path) == ext),
243+
(FileSystemEntity entry) async {
244+
final String key = path.basenameWithoutExtension(entry.path);
245+
out[key] = await FragmentProgram.fromAssetAsync(
246+
path.basename(entry.path),
247+
);
248+
},
249+
);
243250
return out;
244251
}
245252

testing/dart/observatory/shader_reload_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ void main() {
1414
test('simple iplr shader can be re-initialized', () async {
1515
vms.VmService? vmService;
1616
try {
17-
final FragmentProgram program = FragmentProgram.fromAsset(
17+
final FragmentProgram program = await FragmentProgram.fromAssetAsync(
1818
'functions.frag.iplr',
1919
);
2020
final Shader shader = program.shader(

0 commit comments

Comments
 (0)