Skip to content

Commit cee68e5

Browse files
authored
injectionSwitch can now be disabled via a command-line argument. (#97)
1 parent 03803c9 commit cee68e5

File tree

18 files changed

+178
-73
lines changed

18 files changed

+178
-73
lines changed

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ public void run() {
8989
donorsDir,
9090
ns.get("generate_uniform_bindings"),
9191
ns.get("max_uniforms"),
92-
enabledTransformations
92+
enabledTransformations,
93+
!ns.getBoolean("no_injection_switch")
9394
);
9495

9596
int sent = 0;

generator/src/main/java/com/graphicsfuzz/generator/tool/FuzzShader.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public static void main(String[] args) {
3737
.visit(new Fuzzer(new FuzzingContext(),
3838
ShadingLanguageVersion.GLSL_440,
3939
new RandomWrapper(Integer.parseInt(args[0])),
40-
GenerationParams.normal(ShaderKind.FRAGMENT)).fuzzTranslationUnit());
40+
GenerationParams.normal(ShaderKind.FRAGMENT, true)).fuzzTranslationUnit());
4141

4242
}
4343

generator/src/main/java/com/graphicsfuzz/generator/tool/Generate.java

+13-6
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ public static void addGeneratorCommonArguments(ArgumentParser parser) {
154154
.setDefault(0)
155155
.type(Integer.class);
156156

157+
parser.addArgument("--no_injection_switch")
158+
.help("Do not generate the injectionSwitch uniform.")
159+
.action(Arguments.storeTrue());
160+
157161
}
158162

159163
/**
@@ -167,10 +171,12 @@ public static StringBuilder generateVariant(ShaderJob shaderJob,
167171
final StringBuilder result = new StringBuilder();
168172
final IRandom random = new RandomWrapper(args.getSeed());
169173

170-
for (TranslationUnit shader : shaderJob.getShaders()) {
171-
addInjectionSwitchIfNotPresent(shader);
174+
if (args.getAddInjectionSwitch()) {
175+
for (TranslationUnit shader : shaderJob.getShaders()) {
176+
addInjectionSwitchIfNotPresent(shader);
177+
}
178+
setInjectionSwitch(shaderJob.getUniformsInfo());
172179
}
173-
setInjectionSwitch(shaderJob.getUniformsInfo());
174180

175181
for (TranslationUnit tu : shaderJob.getShaders()) {
176182
result.append(transformShader(
@@ -215,8 +221,8 @@ private static StringBuilder transformShader(TranslationUnit shaderToTransform,
215221

216222
final GenerationParams generationParams =
217223
args.getSmall()
218-
? GenerationParams.small(shaderKind)
219-
: GenerationParams.normal(shaderKind);
224+
? GenerationParams.small(shaderKind, args.getAddInjectionSwitch())
225+
: GenerationParams.normal(shaderKind, args.getAddInjectionSwitch());
220226

221227
final TransformationProbabilities probabilities =
222228
createProbabilities(args, random);
@@ -296,7 +302,8 @@ public static void mainHelper(String[] args)
296302
ns.get("donors"),
297303
ns.get("generate_uniform_bindings"),
298304
ns.get("max_uniforms"),
299-
enabledTransformations));
305+
enabledTransformations,
306+
!ns.getBoolean("no_injection_switch")));
300307

301308
final File outputShaderJobFile = ns.get("output");
302309

generator/src/main/java/com/graphicsfuzz/generator/tool/GeneratorArguments.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class GeneratorArguments {
3232
private final boolean generateUniformBindings;
3333
private final int maxUniforms;
3434
private final EnabledTransformations enabledTransformations;
35+
private final boolean addInjectionSwitch;
3536

3637
public GeneratorArguments(
3738
ShadingLanguageVersion shadingLanguageVersion,
@@ -44,7 +45,8 @@ public GeneratorArguments(
4445
File donorsFolder,
4546
boolean generateUniformBindings,
4647
int maxUniforms,
47-
EnabledTransformations enabledTransformations) {
48+
EnabledTransformations enabledTransformations,
49+
boolean addInjectionSwitch) {
4850
this.shadingLanguageVersion = shadingLanguageVersion;
4951
this.seed = seed;
5052
this.small = small;
@@ -56,6 +58,7 @@ public GeneratorArguments(
5658
this.generateUniformBindings = generateUniformBindings;
5759
this.maxUniforms = maxUniforms;
5860
this.enabledTransformations = enabledTransformations;
61+
this.addInjectionSwitch = addInjectionSwitch;
5962
}
6063

6164
public ShadingLanguageVersion getShadingLanguageVersion() {
@@ -106,6 +109,10 @@ public EnabledTransformations getEnabledTransformations() {
106109
return enabledTransformations;
107110
}
108111

112+
public boolean getAddInjectionSwitch() {
113+
return addInjectionSwitch;
114+
}
115+
109116
@Override
110117
public final String toString() {
111118
final StringBuilder sb = new StringBuilder();
@@ -119,6 +126,7 @@ public final String toString() {
119126
sb.append("generateUniformBindings: " + generateUniformBindings + "\n");
120127
sb.append("maxUniforms: " + (limitUniforms() ? "-" : maxUniforms) + "\n");
121128
sb.append("enabledTransformations: " + enabledTransformations + "\n");
129+
sb.append("addInjectionSwitch: " + addInjectionSwitch + "\n");
122130
return sb.toString();
123131
}
124132

generator/src/main/java/com/graphicsfuzz/generator/transformation/OpaqueExpressionGenerator.java

+32-32
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public final class OpaqueExpressionGenerator {
5858
private final ShadingLanguageVersion shadingLanguageVersion;
5959

6060
public OpaqueExpressionGenerator(IRandom generator, GenerationParams generationParams,
61-
ShadingLanguageVersion shadingLanguageVersion) {
61+
ShadingLanguageVersion shadingLanguageVersion) {
6262
this.generator = generator;
6363
this.generationParams = generationParams;
6464
// TODO: there are many more identities that we can easily play with here, e.g. bitwise and 1
@@ -142,37 +142,31 @@ private Expr makeOpaqueZeroOrOne(boolean isZero, BasicType type, boolean constCo
142142
return makeRegularIntegerValuedLiteral(type, isZero ? "0" : "1");
143143
}
144144
final int newDepth = depth + 1;
145-
Expr result = null;
146-
while (result == null) {
145+
while (true) {
147146
final int numTypesOfOne = 2;
148147
switch (generator.nextInt(numTypesOfOne)) {
149148
case 0:
150149
// Make an opaque value recursively and apply an identity function to it
151-
result = applyIdentityFunction(makeOpaqueZeroOrOne(isZero, type, constContext,
150+
return applyIdentityFunction(makeOpaqueZeroOrOne(isZero, type, constContext,
152151
newDepth, fuzzer),
153152
type,
154153
constContext,
155154
newDepth,
156155
fuzzer);
157-
break;
158156
case 1:
159157
// injectionSwitch.x or injectionSwitch.y
160-
if (constContext) {
161-
result = null;
162-
} else {
163-
result = makeOpaqueZeroOrOneFromInjectionSwitch(isZero, type);
158+
if (constContext || !generationParams.getInjectionSwitchIsAvailable()) {
159+
continue;
164160
}
165-
break;
161+
return makeOpaqueZeroOrOneFromInjectionSwitch(isZero, type);
166162
default:
167163
throw new RuntimeException();
168164
}
169165
}
170-
//noinspection ConstantConditions
171-
assert result != null;
172-
return result;
173166
}
174167

175168
private Expr makeOpaqueZeroOrOneFromInjectionSwitch(boolean isZero, BasicType type) {
169+
assert generationParams.getInjectionSwitchIsAvailable();
176170
if (type == BasicType.FLOAT) {
177171
if (isZero) {
178172
return zeroConstructor(injectionSwitch("x"), type);
@@ -210,29 +204,34 @@ private Expr makeOpaqueBooleanScalar(boolean value, boolean constContext, final
210204
final int numTypesOfBool = generationParams.getShaderKind() == ShaderKind.FRAGMENT ? 4 : 2;
211205
final Function<Expr, Expr> constructorFunction =
212206
value ? this::trueConstructor : this::falseConstructor;
213-
switch (generator.nextInt(numTypesOfBool)) {
214-
case 0:
215-
// Make an opaque boolean value recursively and apply an identity function to it
216-
return recursivelyMakeOpaqueBooleanScalar(value, constContext, fuzzer, newDepth);
217-
case 1: {
218-
return makeOpaqueBooleanScalarFromExpr(value,
207+
while (true) {
208+
switch (generator.nextInt(numTypesOfBool)) {
209+
case 0:
210+
// Make an opaque boolean value recursively and apply an identity function to it
211+
return recursivelyMakeOpaqueBooleanScalar(value, constContext, fuzzer, newDepth);
212+
case 1: {
213+
if (!generationParams.getInjectionSwitchIsAvailable()) {
214+
continue;
215+
}
216+
return makeOpaqueBooleanScalarFromExpr(value,
219217
new BinaryExpr(injectionSwitch("x"), injectionSwitch("y"),
220-
value ? BinOp.LT : BinOp.GT));
221-
}
222-
case 2: {
223-
// gl_FragCoord.x [op] 0
224-
assert generationParams.getShaderKind() == ShaderKind.FRAGMENT;
225-
return makeOpaqueBooleanScalarFromExpr(value,
218+
value ? BinOp.LT : BinOp.GT));
219+
}
220+
case 2: {
221+
// gl_FragCoord.x [op] 0
222+
assert generationParams.getShaderKind() == ShaderKind.FRAGMENT;
223+
return makeOpaqueBooleanScalarFromExpr(value,
226224
compareWithGlFragCoord(value, constContext, fuzzer, newDepth, "x"));
227-
}
228-
case 3: {
229-
// gl_FragCoord.y [op] 0
230-
assert generationParams.getShaderKind() == ShaderKind.FRAGMENT;
231-
return makeOpaqueBooleanScalarFromExpr(value,
225+
}
226+
case 3: {
227+
// gl_FragCoord.y [op] 0
228+
assert generationParams.getShaderKind() == ShaderKind.FRAGMENT;
229+
return makeOpaqueBooleanScalarFromExpr(value,
232230
compareWithGlFragCoord(value, constContext, fuzzer, newDepth, "y"));
231+
}
232+
default:
233+
throw new RuntimeException();
233234
}
234-
default:
235-
throw new RuntimeException();
236235
}
237236
}
238237

@@ -282,6 +281,7 @@ public Expr makeDeadCondition(Fuzzer fuzzer) {
282281
}
283282

284283
private Expr injectionSwitch(String dimension) {
284+
assert generationParams.getInjectionSwitchIsAvailable();
285285
return new MemberLookupExpr(new VariableIdentifierExpr(Constants.INJECTION_SWITCH), dimension);
286286
}
287287

generator/src/main/java/com/graphicsfuzz/generator/util/GenerationParams.java

+15-7
Original file line numberDiff line numberDiff line change
@@ -24,36 +24,37 @@ public class GenerationParams {
2424
public static final boolean COMMA_OPERATOR_ENABLED = false;
2525
public static final boolean NON_SQUARE_MATRICES_ENABLED = true;
2626

27-
public static GenerationParams small(ShaderKind shaderKind) {
28-
GenerationParams result = new GenerationParams(shaderKind);
27+
public static GenerationParams small(ShaderKind shaderKind, boolean injectionSwitchAvailable) {
28+
GenerationParams result = new GenerationParams(shaderKind, injectionSwitchAvailable);
2929
result.maxDepthForGeneratedExpr = 2;
3030
result.maxStructNestingDepth = 1;
3131
result.maxStructFields = 3;
3232
result.maxDonors = 2;
3333
return result;
3434
}
3535

36-
public static GenerationParams normal(ShaderKind shaderKind) {
37-
GenerationParams result = new GenerationParams(shaderKind);
36+
public static GenerationParams normal(ShaderKind shaderKind, boolean injectionSwitchAvailable) {
37+
GenerationParams result = new GenerationParams(shaderKind, injectionSwitchAvailable);
3838
result.maxDepthForGeneratedExpr = 3;
3939
result.maxStructNestingDepth = 2;
4040
result.maxStructFields = 5;
4141
result.maxDonors = 4;
4242
return result;
4343
}
4444

45-
public static GenerationParams large(ShaderKind shaderKind) {
46-
GenerationParams result = new GenerationParams(shaderKind);
45+
public static GenerationParams large(ShaderKind shaderKind, boolean injectionSwitchAvailable) {
46+
GenerationParams result = new GenerationParams(shaderKind, injectionSwitchAvailable);
4747
result.maxDepthForGeneratedExpr = 5;
4848
result.maxStructNestingDepth = 4;
4949
result.maxStructFields = 7;
5050
result.maxDonors = 6;
5151
return result;
5252
}
5353

54-
private GenerationParams(ShaderKind shaderKind) {
54+
private GenerationParams(ShaderKind shaderKind, boolean injectionSwitchIsAvailable) {
5555
// Prevent external construction
5656
this.shaderKind = shaderKind;
57+
this.injectionSwitchIsAvailable = injectionSwitchIsAvailable;
5758
}
5859

5960
// What sort of shader are we generating?
@@ -69,6 +70,8 @@ private GenerationParams(ShaderKind shaderKind) {
6970
// Donors
7071
private int maxDonors = 5;
7172

73+
private final boolean injectionSwitchIsAvailable;
74+
7275
public int getMaxDepthForGeneratedExpr() {
7376
return maxDepthForGeneratedExpr;
7477
}
@@ -88,4 +91,9 @@ public int getMaxDonors() {
8891
public ShaderKind getShaderKind() {
8992
return shaderKind;
9093
}
94+
95+
public boolean getInjectionSwitchIsAvailable() {
96+
return injectionSwitchIsAvailable;
97+
}
98+
9199
}

generator/src/test/java/com/graphicsfuzz/generator/fuzzer/FuzzerTest.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.graphicsfuzz.common.ast.expr.TypeConstructorExpr;
2222
import com.graphicsfuzz.common.ast.expr.VariableIdentifierExpr;
2323
import com.graphicsfuzz.common.ast.type.StructNameType;
24-
import com.graphicsfuzz.common.ast.visitors.StandardVisitor;
2524
import com.graphicsfuzz.common.glslversion.ShadingLanguageVersion;
2625
import com.graphicsfuzz.common.typing.ScopeTreeBuilder;
2726
import com.graphicsfuzz.common.util.ParseHelper;
@@ -59,7 +58,7 @@ public void visitVariableIdentifierExpr(VariableIdentifierExpr variableIdentifie
5958
super.visitVariableIdentifierExpr(variableIdentifierExpr);
6059
if (variableIdentifierExpr.getName().equals("doitWhenYouReachMyUse")) {
6160
Expr expr = new Fuzzer(new FuzzingContext(currentScope), ShadingLanguageVersion.ESSL_100,
62-
new ZeroCannedRandom(), GenerationParams.normal(ShaderKind.FRAGMENT), "prefix")
61+
new ZeroCannedRandom(), GenerationParams.normal(ShaderKind.FRAGMENT, true), "prefix")
6362
.fuzzExpr(new StructNameType("B"), false, false, 0);
6463
assertTrue(expr instanceof TypeConstructorExpr);
6564
// Sanity check a few things about the result

0 commit comments

Comments
 (0)