diff --git a/lib/ui/painting.dart b/lib/ui/painting.dart index 3336554b1790b..af95a225d3720 100644 --- a/lib/ui/painting.dart +++ b/lib/ui/painting.dart @@ -4049,6 +4049,12 @@ class FragmentProgram extends NativeFieldWrapperClass1 { return program; } + // TODO(zra): This is part of a soft transition of the framework to this + // API, which pushes the asset load to an asynchronous operation. + static Future fromAssetAsync(String assetKey) { + return Future.microtask(() => FragmentProgram.fromAsset(assetKey)); + } + static Map> _shaderRegistry = >{}; diff --git a/lib/web_ui/lib/painting.dart b/lib/web_ui/lib/painting.dart index e04bd8d66b72d..fa7297d3826cf 100644 --- a/lib/web_ui/lib/painting.dart +++ b/lib/web_ui/lib/painting.dart @@ -839,6 +839,10 @@ class FragmentProgram { throw UnsupportedError('FragmentProgram is not supported for the CanvasKit or HTML renderers.'); } + static Future fromAssetAsync(String assetKey) { + return Future.microtask(() => FragmentProgram.fromAsset(assetKey)); + } + FragmentProgram._(); Shader shader({ diff --git a/testing/dart/fragment_shader_test.dart b/testing/dart/fragment_shader_test.dart index c172dbd174508..e922a27f678f5 100644 --- a/testing/dart/fragment_shader_test.dart +++ b/testing/dart/fragment_shader_test.dart @@ -13,9 +13,9 @@ import 'package:path/path.dart' as path; import 'shader_test_file_utils.dart'; -void main() { +void main() async { test('simple shader renders correctly', () async { - final FragmentProgram program = FragmentProgram.fromAsset( + final FragmentProgram program = await FragmentProgram.fromAssetAsync( 'functions.frag.iplr', ); final Shader shader = program.shader( @@ -25,7 +25,7 @@ void main() { }); test('blue-green image renders green', () async { - final FragmentProgram program = FragmentProgram.fromAsset( + final FragmentProgram program = await FragmentProgram.fromAssetAsync( 'blue_green_sampler.frag.iplr', ); final Image blueGreenImage = await _createBlueGreenImage(); @@ -39,7 +39,7 @@ void main() { }); test('shader with uniforms renders correctly', () async { - final FragmentProgram program = FragmentProgram.fromAsset( + final FragmentProgram program = await FragmentProgram.fromAssetAsync( 'uniforms.frag.iplr', ); @@ -65,7 +65,7 @@ void main() { }); test('The ink_sparkle shader is accepted', () async { - final FragmentProgram program = FragmentProgram.fromAsset( + final FragmentProgram program = await FragmentProgram.fromAssetAsync( 'ink_sparkle.frag.iplr', ); final Shader shader = program.shader( @@ -79,7 +79,7 @@ void main() { }); test('Uniforms are sorted correctly', () async { - final FragmentProgram program = FragmentProgram.fromAsset( + final FragmentProgram program = await FragmentProgram.fromAssetAsync( 'uniforms_sorted.frag.iplr', ); @@ -97,7 +97,7 @@ void main() { test('fromAsset throws an exception on invalid assetKey', () async { bool throws = false; try { - final FragmentProgram program = FragmentProgram.fromAsset( + final FragmentProgram program = await FragmentProgram.fromAssetAsync( '', ); } catch (e) { @@ -109,7 +109,7 @@ void main() { test('fromAsset throws an exception on invalid data', () async { bool throws = false; try { - final FragmentProgram program = FragmentProgram.fromAsset( + final FragmentProgram program = await FragmentProgram.fromAssetAsync( 'DashInNooglerHat.jpg', ); } catch (e) { @@ -119,7 +119,7 @@ void main() { }); test('fromAsset accepts a shader with no uniforms', () async { - final FragmentProgram program = FragmentProgram.fromAsset( + final FragmentProgram program = await FragmentProgram.fromAssetAsync( 'no_uniforms.frag.iplr', ); final Shader shader = program.shader(); @@ -127,7 +127,7 @@ void main() { }); // Test all supported GLSL ops. See lib/spirv/lib/src/constants.dart - final Map iplrSupportedGLSLOpShaders = _loadShaderAssets( + final Map iplrSupportedGLSLOpShaders = await _loadShaderAssets( path.join('supported_glsl_op_shaders', 'iplr'), '.iplr', ); @@ -135,15 +135,15 @@ void main() { _expectIplrShadersRenderGreen(iplrSupportedGLSLOpShaders); // Test all supported instructions. See lib/spirv/lib/src/constants.dart - final Map iplrSupportedOpShaders = _loadShaderAssets( + final Map iplrSupportedOpShaders = await _loadShaderAssets( path.join('supported_op_shaders', 'iplr'), '.iplr', ); expect(iplrSupportedOpShaders.isNotEmpty, true); _expectIplrShadersRenderGreen(iplrSupportedOpShaders); - test('Equality depends on floatUniforms', () { - final FragmentProgram program = FragmentProgram.fromAsset( + test('Equality depends on floatUniforms', () async { + final FragmentProgram program = await FragmentProgram.fromAssetAsync( 'simple.frag.iplr', ); final Float32List ones = Float32List.fromList([1]); @@ -165,10 +165,10 @@ void main() { }); test('Equality depends on data', () async { - final FragmentProgram programA = FragmentProgram.fromAsset( + final FragmentProgram programA = await FragmentProgram.fromAssetAsync( 'simple.frag.iplr', ); - final FragmentProgram programB = FragmentProgram.fromAsset( + final FragmentProgram programB = await FragmentProgram.fromAssetAsync( 'uniforms.frag.iplr', ); final Shader a = programA.shader(); @@ -225,7 +225,10 @@ Future _imageByteDataFromShader({ // $FLUTTER_BUILD_DIRECTORY/gen/flutter/lib/spirv/test/$leafFolderName // This is synchronous so that tests can be inside of a loop with // the proper test name. -Map _loadShaderAssets(String leafFolderName, String ext) { +Future> _loadShaderAssets( + String leafFolderName, + String ext, + ) async { final Map out = SplayTreeMap(); final Directory directory = shaderDirectory(leafFolderName); @@ -233,13 +236,17 @@ Map _loadShaderAssets(String leafFolderName, String ext return out; } - directory + await Future.forEach( + directory .listSync() - .where((FileSystemEntity entry) => path.extension(entry.path) == ext) - .forEach((FileSystemEntity entry) { - final String key = path.basenameWithoutExtension(entry.path); - out[key] = FragmentProgram.fromAsset(path.basename(entry.path)); - }); + .where((FileSystemEntity entry) => path.extension(entry.path) == ext), + (FileSystemEntity entry) async { + final String key = path.basenameWithoutExtension(entry.path); + out[key] = await FragmentProgram.fromAssetAsync( + path.basename(entry.path), + ); + }, + ); return out; } diff --git a/testing/dart/observatory/shader_reload_test.dart b/testing/dart/observatory/shader_reload_test.dart index e19b629b6f43c..477265b2c372c 100644 --- a/testing/dart/observatory/shader_reload_test.dart +++ b/testing/dart/observatory/shader_reload_test.dart @@ -14,7 +14,7 @@ void main() { test('simple iplr shader can be re-initialized', () async { vms.VmService? vmService; try { - final FragmentProgram program = FragmentProgram.fromAsset( + final FragmentProgram program = await FragmentProgram.fromAssetAsync( 'functions.frag.iplr', ); final Shader shader = program.shader(