diff --git a/lib/ui/painting.dart b/lib/ui/painting.dart index af95a225d3720..d3e91ab5b7ac4 100644 --- a/lib/ui/painting.dart +++ b/lib/ui/painting.dart @@ -4039,14 +4039,16 @@ class FragmentProgram extends NativeFieldWrapperClass1 { /// The asset must be a file produced as the output of the `impellerc` /// compiler. The constructed object should then be reused via the [shader] /// method to create [Shader] objects that can be used by [Shader.paint]. - static FragmentProgram fromAsset(String assetKey) { + static Future fromAsset(String assetKey) { FragmentProgram? program = _shaderRegistry[assetKey]?.target; - if (program == null) { - program = FragmentProgram._fromAsset(assetKey); - _shaderRegistry[assetKey] = WeakReference(program); + if (program != null) { + return Future.value(program); } - - return program; + return Future.microtask(() { + final FragmentProgram program = FragmentProgram._fromAsset(assetKey); + _shaderRegistry[assetKey] = WeakReference(program); + return program; + }); } // TODO(zra): This is part of a soft transition of the framework to this diff --git a/lib/web_ui/lib/painting.dart b/lib/web_ui/lib/painting.dart index fa7297d3826cf..f3e9703b16963 100644 --- a/lib/web_ui/lib/painting.dart +++ b/lib/web_ui/lib/painting.dart @@ -835,7 +835,7 @@ class ImageDescriptor { } class FragmentProgram { - static FragmentProgram fromAsset(String assetKey) { + static Future fromAsset(String assetKey) { throw UnsupportedError('FragmentProgram is not supported for the CanvasKit or HTML renderers.'); } diff --git a/testing/dart/fragment_shader_test.dart b/testing/dart/fragment_shader_test.dart index e922a27f678f5..d77e7b6835913 100644 --- a/testing/dart/fragment_shader_test.dart +++ b/testing/dart/fragment_shader_test.dart @@ -15,7 +15,7 @@ import 'shader_test_file_utils.dart'; void main() async { test('simple shader renders correctly', () async { - final FragmentProgram program = await FragmentProgram.fromAssetAsync( + final FragmentProgram program = await FragmentProgram.fromAsset( 'functions.frag.iplr', ); final Shader shader = program.shader( @@ -25,7 +25,7 @@ void main() async { }); test('blue-green image renders green', () async { - final FragmentProgram program = await FragmentProgram.fromAssetAsync( + final FragmentProgram program = await FragmentProgram.fromAsset( 'blue_green_sampler.frag.iplr', ); final Image blueGreenImage = await _createBlueGreenImage(); @@ -39,7 +39,7 @@ void main() async { }); test('shader with uniforms renders correctly', () async { - final FragmentProgram program = await FragmentProgram.fromAssetAsync( + final FragmentProgram program = await FragmentProgram.fromAsset( 'uniforms.frag.iplr', ); @@ -65,7 +65,7 @@ void main() async { }); test('The ink_sparkle shader is accepted', () async { - final FragmentProgram program = await FragmentProgram.fromAssetAsync( + final FragmentProgram program = await FragmentProgram.fromAsset( 'ink_sparkle.frag.iplr', ); final Shader shader = program.shader( @@ -79,7 +79,7 @@ void main() async { }); test('Uniforms are sorted correctly', () async { - final FragmentProgram program = await FragmentProgram.fromAssetAsync( + final FragmentProgram program = await FragmentProgram.fromAsset( 'uniforms_sorted.frag.iplr', ); @@ -97,7 +97,7 @@ void main() async { test('fromAsset throws an exception on invalid assetKey', () async { bool throws = false; try { - final FragmentProgram program = await FragmentProgram.fromAssetAsync( + await FragmentProgram.fromAsset( '', ); } catch (e) { @@ -109,7 +109,7 @@ void main() async { test('fromAsset throws an exception on invalid data', () async { bool throws = false; try { - final FragmentProgram program = await FragmentProgram.fromAssetAsync( + await FragmentProgram.fromAsset( 'DashInNooglerHat.jpg', ); } catch (e) { @@ -119,7 +119,7 @@ void main() async { }); test('fromAsset accepts a shader with no uniforms', () async { - final FragmentProgram program = await FragmentProgram.fromAssetAsync( + final FragmentProgram program = await FragmentProgram.fromAsset( 'no_uniforms.frag.iplr', ); final Shader shader = program.shader(); @@ -143,7 +143,7 @@ void main() async { _expectIplrShadersRenderGreen(iplrSupportedOpShaders); test('Equality depends on floatUniforms', () async { - final FragmentProgram program = await FragmentProgram.fromAssetAsync( + final FragmentProgram program = await FragmentProgram.fromAsset( 'simple.frag.iplr', ); final Float32List ones = Float32List.fromList([1]); @@ -165,10 +165,10 @@ void main() async { }); test('Equality depends on data', () async { - final FragmentProgram programA = await FragmentProgram.fromAssetAsync( + final FragmentProgram programA = await FragmentProgram.fromAsset( 'simple.frag.iplr', ); - final FragmentProgram programB = await FragmentProgram.fromAssetAsync( + final FragmentProgram programB = await FragmentProgram.fromAsset( 'uniforms.frag.iplr', ); final Shader a = programA.shader(); @@ -242,7 +242,7 @@ Future> _loadShaderAssets( .where((FileSystemEntity entry) => path.extension(entry.path) == ext), (FileSystemEntity entry) async { final String key = path.basenameWithoutExtension(entry.path); - out[key] = await FragmentProgram.fromAssetAsync( + out[key] = await FragmentProgram.fromAsset( path.basename(entry.path), ); }, diff --git a/testing/dart/observatory/shader_reload_test.dart b/testing/dart/observatory/shader_reload_test.dart index 477265b2c372c..77b499276c378 100644 --- a/testing/dart/observatory/shader_reload_test.dart +++ b/testing/dart/observatory/shader_reload_test.dart @@ -14,12 +14,13 @@ void main() { test('simple iplr shader can be re-initialized', () async { vms.VmService? vmService; try { - final FragmentProgram program = await FragmentProgram.fromAssetAsync( + final FragmentProgram program = await FragmentProgram.fromAsset( 'functions.frag.iplr', ); final Shader shader = program.shader( floatUniforms: Float32List.fromList([1]), ); + _use(shader); final developer.ServiceProtocolInfo info = await developer.Service.getInfo(); @@ -48,3 +49,7 @@ void main() { } }); } + +void _use(Shader shader) { + +}