Skip to content

Commit f3c0a76

Browse files
authored
Generate and run (#44)
* 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.
1 parent fd50964 commit f3c0a76

File tree

12 files changed

+407
-301
lines changed

12 files changed

+407
-301
lines changed

build/travis/licenses.py

+8
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,14 @@ def get_maven_dependencies_populated():
433433
'license_file': '',
434434
'skipped': 'internal project',
435435
},
436+
'com.graphicsfuzz:generate-and-run-shaders': {
437+
'comment': '',
438+
'name': '',
439+
'url': '',
440+
'license_url': '',
441+
'license_file': '',
442+
'skipped': 'internal project',
443+
},
436444
'com.graphicsfuzz:generator': {
437445
'comment': '',
438446
'name': '',

common/src/main/java/com/graphicsfuzz/common/util/Helper.java

+29
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.graphicsfuzz.common.glslversion.ShadingLanguageVersion;
2121
import com.graphicsfuzz.common.tool.PrettyPrinterVisitor;
2222
import com.graphicsfuzz.common.transformreduce.Constants;
23+
import com.graphicsfuzz.common.transformreduce.GlslShaderJob;
2324
import com.graphicsfuzz.common.transformreduce.ShaderJob;
2425
import java.io.BufferedReader;
2526
import java.io.File;
@@ -168,6 +169,34 @@ public static TranslationUnit parse(File shader, boolean stripHeader)
168169
return ParseHelper.parse(shader, stripHeader);
169170
}
170171

172+
public static ShaderJob parseShaderJob(File workDir, String shaderJobPrefix,
173+
boolean stripHeader) throws IOException,
174+
ParseTimeoutException {
175+
final File referenceUniforms =
176+
new File(workDir, shaderJobPrefix + ".json");
177+
final File referenceVert =
178+
new File(workDir, shaderJobPrefix + ".vert");
179+
final File referenceFrag =
180+
new File(workDir, shaderJobPrefix + ".frag");
181+
return new GlslShaderJob(
182+
referenceVert.exists()
183+
? Optional.of(Helper.parse(referenceVert, stripHeader))
184+
: Optional.empty(),
185+
referenceFrag.exists()
186+
? Optional.of(Helper.parse(referenceFrag, stripHeader))
187+
: Optional.empty(),
188+
new UniformsInfo(referenceUniforms));
189+
}
190+
191+
public static ShaderJob parseShaderJob(String shaderJobPrefix,
192+
boolean stripHeader) throws IOException,
193+
ParseTimeoutException {
194+
String path = FilenameUtils.getFullPath(shaderJobPrefix);
195+
path = path.equals("") ? "." : path;
196+
return parseShaderJob(new File(path), FilenameUtils.getName(shaderJobPrefix), stripHeader);
197+
}
198+
199+
171200
public static Optional<String> readLicenseFile(File licenseFile) throws IOException {
172201
if (licenseFile == null || !licenseFile.isFile()) {
173202
return Optional.empty();

generate-and-run-shaders/pom.xml

+8
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ limitations under the License.
6969
<groupId>net.sourceforge.argparse4j</groupId>
7070
<artifactId>argparse4j</artifactId>
7171
</dependency>
72+
<dependency>
73+
<groupId>org.slf4j</groupId>
74+
<artifactId>slf4j-api</artifactId>
75+
</dependency>
76+
<dependency>
77+
<groupId>org.apache.commons</groupId>
78+
<artifactId>commons-lang3</artifactId>
79+
</dependency>
7280

7381
</dependencies>
7482

generate-and-run-shaders/src/main/java/com/graphicsfuzz/generator/GenerateAndRunShaders.java

+54-37
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,34 @@
1717
package com.graphicsfuzz.generator;
1818

1919
import com.graphicsfuzz.common.glslversion.ShadingLanguageVersion;
20+
import com.graphicsfuzz.common.transformreduce.GlslShaderJob;
21+
import com.graphicsfuzz.common.transformreduce.ShaderJob;
22+
import com.graphicsfuzz.common.util.Helper;
2023
import com.graphicsfuzz.common.util.ParseTimeoutException;
24+
import com.graphicsfuzz.common.util.RandomWrapper;
25+
import com.graphicsfuzz.common.util.UniformsInfo;
2126
import com.graphicsfuzz.generator.tool.Generate;
2227
import com.graphicsfuzz.shadersets.ShaderDispatchException;
2328
import java.io.File;
2429
import java.io.IOException;
30+
import java.nio.charset.StandardCharsets;
2531
import java.util.ArrayList;
32+
import java.util.Arrays;
33+
import java.util.HashSet;
2634
import java.util.List;
35+
import java.util.Optional;
36+
import java.util.Set;
2737
import java.util.concurrent.BlockingQueue;
2838
import java.util.concurrent.LinkedBlockingQueue;
39+
import java.util.stream.Collectors;
2940
import net.sourceforge.argparse4j.ArgumentParsers;
41+
import net.sourceforge.argparse4j.impl.Arguments;
3042
import net.sourceforge.argparse4j.inf.ArgumentParser;
3143
import net.sourceforge.argparse4j.inf.ArgumentParserException;
3244
import net.sourceforge.argparse4j.inf.Namespace;
3345
import org.apache.commons.io.FileUtils;
3446
import org.apache.commons.io.FilenameUtils;
47+
import org.apache.commons.lang3.tuple.Pair;
3548

3649
public class GenerateAndRunShaders {
3750

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

86+
parser.addArgument("--ignore_crash_strings")
87+
.help("File containing crash strings to ignore, one per line.")
88+
.type(File.class);
89+
90+
parser.addArgument("--only_variants")
91+
.help("Only run variant shaders (so sacrifice finding wrong images in favour of crashes.")
92+
.type(Boolean.class)
93+
.action(Arguments.storeTrue());
94+
7395
try {
7496
return parser.parseArgs(args);
7597
} catch (ArgumentParserException exception) {
@@ -81,7 +103,7 @@ private static Namespace parse(String[] args) {
81103
}
82104

83105
public static void main(String[] args)
84-
throws IOException, ParseTimeoutException, InterruptedException, ShaderDispatchException {
106+
throws IOException, InterruptedException {
85107
final Namespace ns = parse(args);
86108
final File referencesDir = ns.get("references");
87109
if (!referencesDir.exists()) {
@@ -98,57 +120,52 @@ public static void main(String[] args)
98120
final ShadingLanguageVersion shadingLanguageVersion = ns.get("webgl")
99121
? ShadingLanguageVersion.webGlFromVersionString(ns.get("glsl_version"))
100122
: ShadingLanguageVersion.fromVersionString(ns.get("glsl_version"));
101-
final boolean replaceFloatLiterals = ns.getBoolean("replace_float_literals");
102123

103-
final List<File> referenceShaders = populateReferenceShaders(referencesDir);
124+
final BlockingQueue<Pair<ShaderJob, ShaderJob>> queue =
125+
new LinkedBlockingQueue<>();
104126

105-
final BlockingQueue<ReferenceVariantPair> queue = new LinkedBlockingQueue<>();
127+
final File crashStringsToIgnoreFile = ns.get("ignore_crash_strings");
128+
final Set<String> crashStringsToIgnore = new HashSet<>();
129+
if (crashStringsToIgnoreFile != null) {
130+
crashStringsToIgnore.addAll(FileUtils.readLines(crashStringsToIgnoreFile,
131+
StandardCharsets.UTF_8));
132+
}
133+
134+
final List<String> shaderJobPrefixes =
135+
Arrays.stream(referencesDir.listFiles((dir, name) -> name.endsWith(".json")))
136+
.map(item -> FilenameUtils.removeExtension(item.getName()))
137+
.collect(Collectors.toList());
138+
if (shaderJobPrefixes.isEmpty()) {
139+
throw new IllegalArgumentException("No shader jobs found.");
140+
}
106141

107-
new Thread(new ShaderConsumer(
142+
final Thread consumer = new Thread(new ShaderConsumer(
108143
LIMIT,
109144
queue,
110145
outputDir,
111146
ns.get("server"),
112147
ns.get("token"),
113-
referenceShaders,
114-
shadingLanguageVersion,
115-
replaceFloatLiterals
116-
)).start();
148+
shadingLanguageVersion,
149+
crashStringsToIgnore,
150+
ns
151+
));
152+
consumer.start();
117153

118-
new Thread(new ShaderProducer(
154+
final Thread producer = new Thread(new ShaderProducer(
119155
LIMIT,
156+
shaderJobPrefixes,
157+
new RandomWrapper(ns.get("seed")),
120158
queue,
121-
outputDir,
122-
referenceShaders,
123-
shadingLanguageVersion,
124-
replaceFloatLiterals,
159+
referencesDir,
160+
shadingLanguageVersion,
125161
donors,
126162
ns
127-
)).start();
163+
));
164+
producer.start();
128165

129-
}
166+
consumer.join();
167+
producer.join();
130168

131-
private static List<File> populateReferenceShaders(File shaders)
132-
throws IOException, ParseTimeoutException {
133-
final List<File> files = new ArrayList<>();
134-
for (File shader : shaders.listFiles((dir, name) -> name.endsWith(".frag"))) {
135-
final File uniforms = new File(FilenameUtils
136-
.removeExtension(shader.getAbsolutePath()) + ".json");
137-
if (!uniforms
138-
.exists()) {
139-
throw new IllegalArgumentException("Shader " + shader.getName()
140-
+ " has no associated JSON file.");
141-
}
142-
final String license = FilenameUtils.removeExtension(shader.getAbsolutePath()) + ".license";
143-
if (!new File(license)
144-
.exists()) {
145-
throw new IllegalArgumentException("Shader " + shader.getName()
146-
+ " has no associated license file.");
147-
}
148-
files.add(shader);
149-
}
150-
return files;
151169
}
152170

153-
154171
}

generate-and-run-shaders/src/main/java/com/graphicsfuzz/generator/ReferenceVariantPair.java

-38
This file was deleted.

0 commit comments

Comments
 (0)