@@ -1409,6 +1409,14 @@ class Paint {
14091409 );
14101410 return true ;
14111411 }());
1412+ assert (() {
1413+ if (value is FragmentShader ) {
1414+ if (! value._validateSamplers ()) {
1415+ throw Exception ('Invalid FragmentShader ${value ._debugName ?? '' }: missing sampler' );
1416+ }
1417+ }
1418+ return true ;
1419+ }());
14121420 _ensureObjectsInitialized ()[_kShaderIndex] = value;
14131421 }
14141422
@@ -4151,10 +4159,16 @@ class FragmentProgram extends NativeFieldWrapperClass1 {
41514159 _constructor ();
41524160 final String result = _initFromAsset (assetKey);
41534161 if (result.isNotEmpty) {
4154- throw result; // ignore: only_throw_errors
4162+ throw Exception ( result);
41554163 }
4164+ assert (() {
4165+ _debugName = assetKey;
4166+ return true ;
4167+ }());
41564168 }
41574169
4170+ String ? _debugName;
4171+
41584172 // TODO(zra): Document custom shaders on the website and add a link to it
41594173 // here. https://github.com/flutter/flutter/issues/107929.
41604174 /// Creates a fragment program from the asset with key [assetKey] .
@@ -4222,7 +4236,7 @@ class FragmentProgram extends NativeFieldWrapperClass1 {
42224236 external String _initFromAsset (String assetKey);
42234237
42244238 /// Returns a fresh instance of [FragmentShader] .
4225- FragmentShader fragmentShader () => FragmentShader ._(this );
4239+ FragmentShader fragmentShader () => FragmentShader ._(this , debugName : _debugName );
42264240}
42274241
42284242/// A [Shader] generated from a [FragmentProgram] .
@@ -4239,17 +4253,18 @@ class FragmentProgram extends NativeFieldWrapperClass1 {
42394253/// are required to exist simultaneously, they must be obtained from two
42404254/// different calls to [FragmentProgram.fragmentShader] .
42414255class FragmentShader extends Shader {
4242- FragmentShader ._(FragmentProgram program) : super ._() {
4256+ FragmentShader ._(FragmentProgram program, { String ? debugName } ) : _debugName = debugName, super ._() {
42434257 _floats = _constructor (
42444258 program,
42454259 program._uniformFloatCount,
42464260 program._samplerCount,
42474261 );
42484262 }
42494263
4250- static final Float32List _kEmptyFloat32List = Float32List ( 0 ) ;
4264+ final String ? _debugName ;
42514265
4252- late Float32List _floats;
4266+ static final Float32List _kEmptyFloat32List = Float32List (0 );
4267+ Float32List _floats = _kEmptyFloat32List;
42534268
42544269 /// Sets the float uniform at [index] to [value] .
42554270 void setFloat (int index, double value) {
@@ -4284,6 +4299,9 @@ class FragmentShader extends Shader {
42844299 @FfiNative < Void Function (Pointer <Void >, Handle , Handle )> ('ReusableFragmentShader::SetSampler' )
42854300 external void _setSampler (int index, ImageShader sampler);
42864301
4302+ @FfiNative < Bool Function (Pointer <Void >)> ('ReusableFragmentShader::ValidateSamplers' )
4303+ external bool _validateSamplers ();
4304+
42874305 @FfiNative < Void Function (Pointer <Void >)> ('ReusableFragmentShader::Dispose' )
42884306 external void _dispose ();
42894307}
0 commit comments