|
|
|
@ -304,6 +304,9 @@ void SetupOptions(const IR::Program& program, const Profile& profile, |
|
|
|
header += "OPTION NV_viewport_array2;"; |
|
|
|
} |
|
|
|
} |
|
|
|
if (program.is_geometry_passthrough && profile.support_geometry_shader_passthrough) { |
|
|
|
header += "OPTION NV_geometry_shader_passthrough;"; |
|
|
|
} |
|
|
|
if (info.uses_typeless_image_reads && profile.support_typeless_image_loads) { |
|
|
|
header += "OPTION EXT_shader_image_load_formatted;"; |
|
|
|
} |
|
|
|
@ -410,11 +413,26 @@ std::string EmitGLASM(const Profile& profile, const RuntimeInfo& runtime_info, I |
|
|
|
runtime_info.tess_clockwise ? "CW" : "CCW"); |
|
|
|
break; |
|
|
|
case Stage::Geometry: |
|
|
|
header += fmt::format("PRIMITIVE_IN {};" |
|
|
|
"PRIMITIVE_OUT {};" |
|
|
|
"VERTICES_OUT {};", |
|
|
|
InputPrimitive(runtime_info.input_topology), |
|
|
|
OutputPrimitive(program.output_topology), program.output_vertices); |
|
|
|
header += fmt::format("PRIMITIVE_IN {};", InputPrimitive(runtime_info.input_topology)); |
|
|
|
if (program.is_geometry_passthrough) { |
|
|
|
if (profile.support_geometry_shader_passthrough) { |
|
|
|
for (size_t index = 0; index < IR::NUM_GENERICS; ++index) { |
|
|
|
if (program.info.passthrough.Generic(index)) { |
|
|
|
header += fmt::format("PASSTHROUGH result.attrib[{}];", index); |
|
|
|
} |
|
|
|
} |
|
|
|
if (program.info.passthrough.AnyComponent(IR::Attribute::PositionX)) { |
|
|
|
header += "PASSTHROUGH result.position;"; |
|
|
|
} |
|
|
|
} else { |
|
|
|
LOG_WARNING(Shader_GLASM, "Passthrough geometry program used but not supported"); |
|
|
|
} |
|
|
|
} else { |
|
|
|
header += |
|
|
|
fmt::format("VERTICES_OUT {};" |
|
|
|
"PRIMITIVE_OUT {};", |
|
|
|
program.output_vertices, OutputPrimitive(program.output_topology)); |
|
|
|
} |
|
|
|
break; |
|
|
|
case Stage::Compute: |
|
|
|
header += fmt::format("GROUP_SIZE {} {} {};", program.workgroup_size[0], |
|
|
|
|