Skip to content

Commit

Permalink
Generate and run (#44)
Browse files Browse the repository at this point in the history
* Reworked "generate and run" so that we can generate lots of shaders, run them, and triage crashes. 
 Wrong image checking to follow.

* In the process, changed some occurrences of 'shader set' to 'shader family'.

* In the process, harmonised "generate" with "generate-and-run" so that parsing of shader jobs is done in one place, and so that adding of injectionSwitch is part of generating a variant, rather than a pre-processing step.
  • Loading branch information
afd committed Oct 5, 2018
1 parent fd50964 commit f3c0a76
Show file tree
Hide file tree
Showing 12 changed files with 407 additions and 301 deletions.
8 changes: 8 additions & 0 deletions build/travis/licenses.py
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,14 @@ def get_maven_dependencies_populated():
'license_file': '',
'skipped': 'internal project',
},
'com.graphicsfuzz:generate-and-run-shaders': {
'comment': '',
'name': '',
'url': '',
'license_url': '',
'license_file': '',
'skipped': 'internal project',
},
'com.graphicsfuzz:generator': {
'comment': '',
'name': '',
Expand Down
29 changes: 29 additions & 0 deletions common/src/main/java/com/graphicsfuzz/common/util/Helper.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.graphicsfuzz.common.glslversion.ShadingLanguageVersion;
import com.graphicsfuzz.common.tool.PrettyPrinterVisitor;
import com.graphicsfuzz.common.transformreduce.Constants;
import com.graphicsfuzz.common.transformreduce.GlslShaderJob;
import com.graphicsfuzz.common.transformreduce.ShaderJob;
import java.io.BufferedReader;
import java.io.File;
Expand Down Expand Up @@ -168,6 +169,34 @@ public static TranslationUnit parse(File shader, boolean stripHeader)
return ParseHelper.parse(shader, stripHeader);
}

public static ShaderJob parseShaderJob(File workDir, String shaderJobPrefix,
boolean stripHeader) throws IOException,
ParseTimeoutException {
final File referenceUniforms =
new File(workDir, shaderJobPrefix + ".json");
final File referenceVert =
new File(workDir, shaderJobPrefix + ".vert");
final File referenceFrag =
new File(workDir, shaderJobPrefix + ".frag");
return new GlslShaderJob(
referenceVert.exists()
? Optional.of(Helper.parse(referenceVert, stripHeader))
: Optional.empty(),
referenceFrag.exists()
? Optional.of(Helper.parse(referenceFrag, stripHeader))
: Optional.empty(),
new UniformsInfo(referenceUniforms));
}

public static ShaderJob parseShaderJob(String shaderJobPrefix,
boolean stripHeader) throws IOException,
ParseTimeoutException {
String path = FilenameUtils.getFullPath(shaderJobPrefix);
path = path.equals("") ? "." : path;
return parseShaderJob(new File(path), FilenameUtils.getName(shaderJobPrefix), stripHeader);
}


public static Optional<String> readLicenseFile(File licenseFile) throws IOException {
if (licenseFile == null || !licenseFile.isFile()) {
return Optional.empty();
Expand Down
8 changes: 8 additions & 0 deletions generate-and-run-shaders/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,14 @@ limitations under the License.
<groupId>net.sourceforge.argparse4j</groupId>
<artifactId>argparse4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>

</dependencies>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,34 @@
package com.graphicsfuzz.generator;

import com.graphicsfuzz.common.glslversion.ShadingLanguageVersion;
import com.graphicsfuzz.common.transformreduce.GlslShaderJob;
import com.graphicsfuzz.common.transformreduce.ShaderJob;
import com.graphicsfuzz.common.util.Helper;
import com.graphicsfuzz.common.util.ParseTimeoutException;
import com.graphicsfuzz.common.util.RandomWrapper;
import com.graphicsfuzz.common.util.UniformsInfo;
import com.graphicsfuzz.generator.tool.Generate;
import com.graphicsfuzz.shadersets.ShaderDispatchException;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.stream.Collectors;
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.impl.Arguments;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.tuple.Pair;

public class GenerateAndRunShaders {

Expand Down Expand Up @@ -70,6 +83,15 @@ private static Namespace parse(String[] args) {
// Optional arguments
Generate.addGeneratorCommonArguments(parser);

parser.addArgument("--ignore_crash_strings")
.help("File containing crash strings to ignore, one per line.")
.type(File.class);

parser.addArgument("--only_variants")
.help("Only run variant shaders (so sacrifice finding wrong images in favour of crashes.")
.type(Boolean.class)
.action(Arguments.storeTrue());

try {
return parser.parseArgs(args);
} catch (ArgumentParserException exception) {
Expand All @@ -81,7 +103,7 @@ private static Namespace parse(String[] args) {
}

public static void main(String[] args)
throws IOException, ParseTimeoutException, InterruptedException, ShaderDispatchException {
throws IOException, InterruptedException {
final Namespace ns = parse(args);
final File referencesDir = ns.get("references");
if (!referencesDir.exists()) {
Expand All @@ -98,57 +120,52 @@ public static void main(String[] args)
final ShadingLanguageVersion shadingLanguageVersion = ns.get("webgl")
? ShadingLanguageVersion.webGlFromVersionString(ns.get("glsl_version"))
: ShadingLanguageVersion.fromVersionString(ns.get("glsl_version"));
final boolean replaceFloatLiterals = ns.getBoolean("replace_float_literals");

final List<File> referenceShaders = populateReferenceShaders(referencesDir);
final BlockingQueue<Pair<ShaderJob, ShaderJob>> queue =
new LinkedBlockingQueue<>();

final BlockingQueue<ReferenceVariantPair> queue = new LinkedBlockingQueue<>();
final File crashStringsToIgnoreFile = ns.get("ignore_crash_strings");
final Set<String> crashStringsToIgnore = new HashSet<>();
if (crashStringsToIgnoreFile != null) {
crashStringsToIgnore.addAll(FileUtils.readLines(crashStringsToIgnoreFile,
StandardCharsets.UTF_8));
}

final List<String> shaderJobPrefixes =
Arrays.stream(referencesDir.listFiles((dir, name) -> name.endsWith(".json")))
.map(item -> FilenameUtils.removeExtension(item.getName()))
.collect(Collectors.toList());
if (shaderJobPrefixes.isEmpty()) {
throw new IllegalArgumentException("No shader jobs found.");
}

new Thread(new ShaderConsumer(
final Thread consumer = new Thread(new ShaderConsumer(
LIMIT,
queue,
outputDir,
ns.get("server"),
ns.get("token"),
referenceShaders,
shadingLanguageVersion,
replaceFloatLiterals
)).start();
shadingLanguageVersion,
crashStringsToIgnore,
ns
));
consumer.start();

new Thread(new ShaderProducer(
final Thread producer = new Thread(new ShaderProducer(
LIMIT,
shaderJobPrefixes,
new RandomWrapper(ns.get("seed")),
queue,
outputDir,
referenceShaders,
shadingLanguageVersion,
replaceFloatLiterals,
referencesDir,
shadingLanguageVersion,
donors,
ns
)).start();
));
producer.start();

}
consumer.join();
producer.join();

private static List<File> populateReferenceShaders(File shaders)
throws IOException, ParseTimeoutException {
final List<File> files = new ArrayList<>();
for (File shader : shaders.listFiles((dir, name) -> name.endsWith(".frag"))) {
final File uniforms = new File(FilenameUtils
.removeExtension(shader.getAbsolutePath()) + ".json");
if (!uniforms
.exists()) {
throw new IllegalArgumentException("Shader " + shader.getName()
+ " has no associated JSON file.");
}
final String license = FilenameUtils.removeExtension(shader.getAbsolutePath()) + ".license";
if (!new File(license)
.exists()) {
throw new IllegalArgumentException("Shader " + shader.getName()
+ " has no associated license file.");
}
files.add(shader);
}
return files;
}


}

This file was deleted.

Loading

0 comments on commit f3c0a76

Please sign in to comment.