Unverified Commit b005a347 authored by Zachary Anderson's avatar Zachary Anderson Committed by GitHub

[flutter_tool] Pass --input-type to impellerc (#106845)

parent eb3cf24b
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
import 'package:process/process.dart'; import 'package:process/process.dart';
import '../../artifacts.dart'; import '../../artifacts.dart';
import '../../base/common.dart';
import '../../base/file_system.dart'; import '../../base/file_system.dart';
import '../../base/io.dart'; import '../../base/io.dart';
import '../../base/logger.dart'; import '../../base/logger.dart';
...@@ -43,17 +42,13 @@ class ShaderCompiler { ...@@ -43,17 +42,13 @@ class ShaderCompiler {
/// ///
/// All parameters are required. /// All parameters are required.
/// ///
/// If the input file is not a fragment shader, this returns false. /// If the shader compiler subprocess fails, it will print the stdout and
/// If the shader compiler subprocess fails, it will [throwToolExit]. /// stderr to the log and throw a [ShaderCompilerException]. Otherwise, it
/// Otherwise, it will return true. /// will return true.
Future<bool> compileShader({ Future<bool> compileShader({
required File input, required File input,
required String outputPath, required String outputPath,
}) async { }) async {
if (!input.path.endsWith('.frag')) {
return false;
}
final File impellerc = _fs.file( final File impellerc = _fs.file(
_artifacts.getHostArtifact(HostArtifact.impellerc), _artifacts.getHostArtifact(HostArtifact.impellerc),
); );
...@@ -72,6 +67,7 @@ class ShaderCompiler { ...@@ -72,6 +67,7 @@ class ShaderCompiler {
'--flutter-spirv', '--flutter-spirv',
'--spirv=$outputPath', '--spirv=$outputPath',
'--input=${input.path}', '--input=${input.path}',
'--input-type=frag',
]; ];
final Process impellercProcess = await _processManager.start(cmd); final Process impellercProcess = await _processManager.start(cmd);
final int code = await impellercProcess.exitCode; final int code = await impellercProcess.exitCode;
......
...@@ -169,11 +169,25 @@ Future<void> writeBundle( ...@@ -169,11 +169,25 @@ Future<void> writeBundle(
// platform channels in the framework will URI encode these values, // platform channels in the framework will URI encode these values,
// and the native APIs will look for files this way. // and the native APIs will look for files this way.
final File file = globals.fs.file(globals.fs.path.join(bundleDir.path, entry.key)); final File file = globals.fs.file(globals.fs.path.join(bundleDir.path, entry.key));
final AssetKind assetKind = entryKinds[entry.key] ?? AssetKind.regular;
file.parent.createSync(recursive: true); file.parent.createSync(recursive: true);
final DevFSContent devFSContent = entry.value; final DevFSContent devFSContent = entry.value;
if (devFSContent is DevFSFileContent) { if (devFSContent is DevFSFileContent) {
final File input = devFSContent.file as File; final File input = devFSContent.file as File;
if (!await shaderCompiler.compileShader(input: input, outputPath: file.path)) { bool doCopy = true;
switch (assetKind) {
case AssetKind.regular:
break;
case AssetKind.font:
break;
case AssetKind.shader:
doCopy = !await shaderCompiler.compileShader(
input: input,
outputPath: file.path,
);
break;
}
if (doCopy) {
input.copySync(file.path); input.copySync(file.path);
} }
} else { } else {
......
...@@ -444,6 +444,7 @@ flutter: ...@@ -444,6 +444,7 @@ flutter:
'--flutter-spirv', '--flutter-spirv',
'--spirv=$outputPath', '--spirv=$outputPath',
'--input=/$shaderPath', '--input=/$shaderPath',
'--input-type=frag',
], ],
onRun: () { onRun: () {
fileSystem.file(outputPath).createSync(recursive: true); fileSystem.file(outputPath).createSync(recursive: true);
......
...@@ -10,8 +10,8 @@ import 'package:flutter_tools/src/build_system/targets/shader_compiler.dart'; ...@@ -10,8 +10,8 @@ import 'package:flutter_tools/src/build_system/targets/shader_compiler.dart';
import '../../../src/common.dart'; import '../../../src/common.dart';
import '../../../src/fake_process_manager.dart'; import '../../../src/fake_process_manager.dart';
const String shaderPath = '/shaders/my_shader.frag'; const String fragPath = '/shaders/my_shader.frag';
const String notShaderPath = '/shaders/not_a_shader.file'; const String notFragPath = '/shaders/not_a_frag.file';
const String outputPath = '/output/shaders/my_shader.spv'; const String outputPath = '/output/shaders/my_shader.spv';
void main() { void main() {
...@@ -27,13 +27,27 @@ void main() { ...@@ -27,13 +27,27 @@ void main() {
impellerc = artifacts.getHostArtifact(HostArtifact.impellerc).path; impellerc = artifacts.getHostArtifact(HostArtifact.impellerc).path;
fileSystem.file(impellerc).createSync(recursive: true); fileSystem.file(impellerc).createSync(recursive: true);
fileSystem.file(shaderPath).createSync(recursive: true); fileSystem.file(fragPath).createSync(recursive: true);
fileSystem.file(notShaderPath).createSync(recursive: true); fileSystem.file(notFragPath).createSync(recursive: true);
}); });
testWithoutContext('compileShader returns false for non-shader files', () async { testWithoutContext('compileShader invokes impellerc for .frag files', () async {
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
FakeCommand(
command: <String>[
impellerc,
'--flutter-spirv',
'--spirv=$outputPath',
'--input=$fragPath',
'--input-type=frag',
],
onRun: () {
fileSystem.file(outputPath).createSync(recursive: true);
},
),
]);
final ShaderCompiler shaderCompiler = ShaderCompiler( final ShaderCompiler shaderCompiler = ShaderCompiler(
processManager: FakeProcessManager.empty(), processManager: processManager,
logger: logger, logger: logger,
fileSystem: fileSystem, fileSystem: fileSystem,
artifacts: artifacts, artifacts: artifacts,
...@@ -41,21 +55,23 @@ void main() { ...@@ -41,21 +55,23 @@ void main() {
expect( expect(
await shaderCompiler.compileShader( await shaderCompiler.compileShader(
input: fileSystem.file(notShaderPath), input: fileSystem.file(fragPath),
outputPath: outputPath, outputPath: outputPath,
), ),
false, true,
); );
expect(fileSystem.file(outputPath).existsSync(), true);
}); });
testWithoutContext('compileShader returns true for shader files', () async { testWithoutContext('compileShader invokes impellerc for non-.frag files', () async {
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[ final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
FakeCommand( FakeCommand(
command: <String>[ command: <String>[
impellerc, impellerc,
'--flutter-spirv', '--flutter-spirv',
'--spirv=$outputPath', '--spirv=$outputPath',
'--input=$shaderPath', '--input=$notFragPath',
'--input-type=frag',
], ],
onRun: () { onRun: () {
fileSystem.file(outputPath).createSync(recursive: true); fileSystem.file(outputPath).createSync(recursive: true);
...@@ -71,11 +87,41 @@ void main() { ...@@ -71,11 +87,41 @@ void main() {
expect( expect(
await shaderCompiler.compileShader( await shaderCompiler.compileShader(
input: fileSystem.file(shaderPath), input: fileSystem.file(notFragPath),
outputPath: outputPath, outputPath: outputPath,
), ),
true, true,
); );
expect(fileSystem.file(outputPath).existsSync(), true); expect(fileSystem.file(outputPath).existsSync(), true);
}); });
testWithoutContext('compileShader throws an exception when impellerc fails', () async {
final FakeProcessManager processManager = FakeProcessManager.list(<FakeCommand>[
FakeCommand(
command: <String>[
impellerc,
'--flutter-spirv',
'--spirv=$outputPath',
'--input=$notFragPath',
'--input-type=frag',
],
exitCode: 1,
),
]);
final ShaderCompiler shaderCompiler = ShaderCompiler(
processManager: processManager,
logger: logger,
fileSystem: fileSystem,
artifacts: artifacts,
);
await expectLater(
() => shaderCompiler.compileShader(
input: fileSystem.file(notFragPath),
outputPath: outputPath,
),
throwsA(isA<ShaderCompilerException>()),
);
expect(fileSystem.file(outputPath).existsSync(), false);
});
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment