in benchmarks/JetStream2/WSL/SPIRVCodegen.js [108:175]
function doEmitTypes(type)
{
if (emittedTypes.has(type[0]))
return;
emittedTypes.add(type[0]);
if (typeof type[1] == "object") {
if (type[1].fieldTypes) {
for (let fieldType of type[1].fieldTypes) {
let key = reverseTypeMap.get(fieldType);
let value = typeMap.get(key);
doEmitTypes([key, value]);
}
switch (type[0]) {
case "struct vec2<> { int32 x; int32 y }":
case "struct vec2<> { uint32 x; uint32 y; }":
case "struct vec2<> { float32 x; float32 y; }":
case "struct vec2<> { float64 x; float64 y; }":
case "struct vec3<> { int32 x; int32 y; int32 z; }":
case "struct vec3<> { uint32 x; uint32 y; uint32 z; }":
case "struct vec3<> { float32 x; float32 y; float32 z; }":
case "struct vec3<> { float64 x; float64 y; float64 z; }":
case "struct vec4<> { int32 x; int32 y; int32 z; int32 w; }":
case "struct vec4<> { uint32 x; uint32 y; uint32 z; uint32 w; }":
case "struct vec4<> { float32 x; float32 y; float32 z; float32 w; }":
case "struct vec4<> { float64 x; float64 y; float64 z; float64 w; }":
assembler.append(new spirv.ops.TypeVector(type[1].id, type[1].fieldTypes[0], type[1].fieldTypes.length));
break;
default:
assembler.append(new spirv.ops.TypeStruct(type[1].id, ...type[1].fieldTypes));
break;
}
} else {
if (!type[1].elementType)
throw new Error("Unknown type!");
let elementType = type[1].elementType;
let key = reverseTypeMap.get(elementType);
let value = typeMap.get(key);
doEmitTypes([key, value]);
let id = currentId++;
assembler.append(new spirv.ops.Constant(typeMap.get(program.intrinsics.uint32), id, type[1].numElements));
assembler.append(new spirv.ops.TypeArray(type[1].id, elementType, id));
}
} else {
switch (type[0].name) {
case "void":
assembler.append(new spirv.ops.TypeVoid(type[1]));
break;
case "bool":
assembler.append(new spirv.ops.TypeBool(type[1]));
break;
case "int32":
assembler.append(new spirv.ops.TypeInt(type[1], 32, 1));
break;
case "uint32":
case "uint8":
assembler.append(new spirv.ops.TypeInt(type[1], 32, 0));
break;
case "float32":
assembler.append(new spirv.ops.TypeFloat(type[1], 32));
break;
case "float64":
assembler.append(new spirv.ops.TypeFloat(type[1], 64));
break;
}
}
}