Visitar URL original
[flutter_tools] Support flavors and transformers for shaders by Laurie-Lin · Pull Request #181889 · flutter/flutter · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 26 additions & 25 deletions packages/flutter_tools/lib/src/asset.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1064,28 +1064,8 @@ class ManifestAssetBundle implements AssetBundle {
}
}

result.removeWhere((_Asset asset, List<_Asset> variants) {
if (!asset.matchesFlavor(flavor)) {
_logger.printTrace(
'Skipping assets entry "${asset.entryUri.path}" since '
'its configured flavor(s) did not match the provided flavor (if any).\n'
'Configured flavors: ${asset.flavors.join(', ')}\n',
);
return true;
}
if (!asset.matchesPlatform(targetPlatform)) {
_logger.printTrace(
'Skipping assets entry "${asset.entryUri.path}" since '
'its configured platform(s) did not match the target platform.\n'
'Configured platforms: ${asset.platforms.join(', ')}\n'
'Target platform: ${targetPlatform.osName}\n',
);
return true;
}
return false;
});

for (final Uri shaderUri in flutterManifest.shaders) {
for (final AssetsEntry shaderEntry in flutterManifest.shaders) {
final Uri shaderUri = shaderEntry.uri;
for (final AssetsEntry assetEntry in flutterManifest.assets) {
final String assetPath = assetEntry.uri.path;
final String shaderPath = shaderUri.path;
Expand Down Expand Up @@ -1116,12 +1096,33 @@ class ManifestAssetBundle implements AssetBundle {
packageName: packageName,
attributedPackage: attributedPackage,
assetKind: AssetKind.shader,
flavors: <String>{},
platforms: <String>{},
transformers: <AssetTransformerEntry>[],
flavors: shaderEntry.flavors,
Comment thread
Laurie-Lin marked this conversation as resolved.
Resolved
platforms: shaderEntry.platforms,
transformers: shaderEntry.transformers,
);
}

result.removeWhere((_Asset asset, List<_Asset> variants) {
if (!asset.matchesFlavor(flavor)) {
_logger.printWarning(
'Skipping assets entry "${asset.entryUri.path}" since '
'its configured flavor(s) did not match the provided flavor (if any).\n'
'Configured flavors: ${asset.flavors.join(', ')}\n',
);
return true;
}
if (!asset.matchesPlatform(targetPlatform)) {
_logger.printWarning(
'Skipping assets entry "${asset.entryUri.path}" since '
'its configured platform(s) did not match the target platform.\n'
'Configured platforms: ${asset.platforms.join(', ')}\n'
'Target platform: ${targetPlatform.osName}\n',
);
return true;
}
return false;
});

// Add assets referenced in the fonts section of the manifest.
for (final Font font in flutterManifest.fonts) {
for (final FontAsset fontAsset in font.fontAssets) {
Expand Down
22 changes: 21 additions & 1 deletion packages/flutter_tools/lib/src/build_system/targets/assets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,28 @@ Future<Depfile> copyAssets(
quiet: quiet,
);
case AssetKind.shader:
var inputToCompiler = content.file as File;
if (entry.value.transformers.isNotEmpty) {
transformResource = await transformPool.request();
final transformedShaderSourcePath = '${file.path}.transformed';
final AssetTransformationFailure? failure = await assetTransformer.transformAsset(
asset: inputToCompiler,
outputPath: transformedShaderSourcePath,
workingDirectory: environment.projectDir.path,
transformerEntries: entry.value.transformers,
logger: environment.logger,
);
if (failure != null) {
throwToolExit(
'User-defined transformation of shader "${entry.key}" failed.\n'
'${failure.message}',
);
}
inputToCompiler = environment.fileSystem.file(transformedShaderSourcePath);
}

doCopy = !await shaderCompiler.compileShader(
input: content.file as File,
input: inputToCompiler,
outputPath: file.path,
targetPlatform: targetPlatform,
);
Expand Down
21 changes: 20 additions & 1 deletion packages/flutter_tools/lib/src/bundle_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,27 @@ Future<void> writeBundle(
case AssetKind.font:
break;
case AssetKind.shader:
var inputToCompiler = input;
if (entry.value.transformers.isNotEmpty) {
final transformedShaderSourcePath = '${file.path}.transformed';
final AssetTransformationFailure? failure = await assetTransformer.transformAsset(
asset: inputToCompiler,
outputPath: transformedShaderSourcePath,
workingDirectory: projectDir.path,
transformerEntries: entry.value.transformers,
logger: logger,
);
if (failure != null) {
throwToolExit(
'User-defined transformation of shader "${entry.key}" failed.\n'
'${failure.message}',
);
}
inputToCompiler = fileSystem.file(transformedShaderSourcePath);
}

doCopy = !await shaderCompiler.compileShader(
input: input,
input: inputToCompiler,
outputPath: file.path,
targetPlatform: targetPlatform,
);
Expand Down
17 changes: 16 additions & 1 deletion packages/flutter_tools/lib/src/devfs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -651,7 +651,22 @@ class DevFS {
final AssetKind? kind = bundle.entries[archivePath]?.kind;
switch (kind) {
case AssetKind.shader:
final Future<DevFSContent?> pending = shaderCompiler.recompileShader(entry.content);
final Future<DevFSContent?> pending = (() async {
DevFSContent content = entry.content;
if (entry.transformers.isNotEmpty) {
final DevFSContent? transformed = await _assetTransformer.retransformAsset(
inputAssetKey: archivePath,
inputAssetContent: content,
transformerEntries: entry.transformers,
workingDirectory: rootDirectory.path,
);
if (transformed == null) {
return null;
}
content = transformed;
}
return shaderCompiler.recompileShader(content);
})();
pendingAssetBuilds.add(pending);
pending.then((DevFSContent? content) {
if (content == null) {
Expand Down
46 changes: 6 additions & 40 deletions packages/flutter_tools/lib/src/flutter_manifest.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class FlutterManifest {
required Logger logger,
List<AssetsEntry>? assets,
List<Font>? fonts,
List<Uri>? shaders,
List<AssetsEntry>? shaders,
List<DeferredComponent>? deferredComponents,
bool removeDependencies = false,
}) {
Expand All @@ -106,9 +106,9 @@ class FlutterManifest {
}

if (shaders != null && shaders.isNotEmpty) {
copy._flutterDescriptor['shaders'] = YamlList.wrap(
shaders.map((Uri uri) => uri.toString()).toList(),
);
copy._flutterDescriptor['shaders'] = YamlList.wrap(<Object?>[
for (final AssetsEntry shader in shaders) shader.descriptor,
]);
}

if (deferredComponents != null && deferredComponents.isNotEmpty) {
Expand Down Expand Up @@ -431,31 +431,7 @@ class FlutterManifest {
return fonts;
}

late final List<Uri> shaders = _extractAssetUris('shaders', 'Shader');

List<Uri> _extractAssetUris(String key, String singularName) {
if (!_flutterDescriptor.containsKey(key)) {
return <Uri>[];
}

final items = _flutterDescriptor[key] as List<Object?>?;
if (items == null) {
return const <Uri>[];
}
final results = <Uri>[];
for (final Object? item in items) {
if (item is! String || item == '') {
_logger.printError('$singularName manifest contains a null or empty uri.');
continue;
}
try {
results.add(Uri.parse(item));
} on FormatException {
_logger.printError('$singularName manifest contains invalid uri: $item.');
}
}
return results;
}
late final List<AssetsEntry> shaders = _computeAssets(_flutterDescriptor['shaders']);

/// Whether localization Dart files should be generated.
late final generateLocalizations = _flutterDescriptor['generate'] == true;
Expand Down Expand Up @@ -572,17 +548,7 @@ void _validateFlutter(YamlMap? yaml, List<String> errors) {
case 'assets':
errors.addAll(_validateAssets(yamlValue));
case 'shaders':
if (yamlValue is! YamlList) {
errors.add(
'Expected "$yamlKey" to be a list, but got $yamlValue (${yamlValue.runtimeType}).',
);
} else if (yamlValue.isEmpty) {
break;
} else if (yamlValue[0] is! String) {
errors.add(
'Expected "$yamlKey" to be a list of strings, but the first element is $yamlValue (${yamlValue.runtimeType}).',
);
}
errors.addAll(_validateAssets(yamlValue));
Comment thread
Laurie-Lin marked this conversation as resolved.
Resolved
case 'fonts':
if (yamlValue is! YamlList) {
errors.add(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ void main() {
rootProject.replacePubspec(
rootProject.manifest.copyWith(
logger: logger,
shaders: <Uri>[Uri(host: 'Random')],
shaders: <AssetsEntry>[AssetsEntry(uri: Uri.parse('Random'))],
),
);
expect(previewManifest.shouldRegeneratePubspec(), true);
Expand Down
Loading