summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/glsl/emit_context.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend/glsl/emit_context.cpp')
-rw-r--r--src/shader_recompiler/backend/glsl/emit_context.cpp52
1 files changed, 49 insertions, 3 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp
index 7b6c6d22b..8e5983909 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_context.cpp
@@ -14,17 +14,63 @@ EmitContext::EmitContext(IR::Program& program, [[maybe_unused]] Bindings& bindin
14 : info{program.info}, profile{profile_} { 14 : info{program.info}, profile{profile_} {
15 std::string header = "#version 450\n"; 15 std::string header = "#version 450\n";
16 SetupExtensions(header); 16 SetupExtensions(header);
17 if (program.stage == Stage::Compute) { 17 stage = program.stage;
18 switch (program.stage) {
19 case Stage::VertexA:
20 case Stage::VertexB:
21 stage_name = "vertex";
22 attrib_name = "vertex";
23 // TODO: add only what's used by the shader
24 header +=
25 "out gl_PerVertex {vec4 gl_Position;float gl_PointSize;float gl_ClipDistance[];};";
26 break;
27 case Stage::TessellationControl:
28 case Stage::TessellationEval:
29 stage_name = "primitive";
30 attrib_name = "primitive";
31 break;
32 case Stage::Geometry:
33 stage_name = "primitive";
34 attrib_name = "vertex";
35 break;
36 case Stage::Fragment:
37 stage_name = "fragment";
38 attrib_name = "fragment";
39 break;
40 case Stage::Compute:
41 stage_name = "invocation";
18 header += fmt::format("layout(local_size_x={},local_size_y={},local_size_z={}) in;\n", 42 header += fmt::format("layout(local_size_x={},local_size_y={},local_size_z={}) in;\n",
19 program.workgroup_size[0], program.workgroup_size[1], 43 program.workgroup_size[0], program.workgroup_size[1],
20 program.workgroup_size[2]); 44 program.workgroup_size[2]);
45 break;
21 } 46 }
22 code += header; 47 code += header;
23 48 const std::string_view attr_stage{stage == Stage::Fragment ? "fragment" : "vertex"};
49 for (size_t index = 0; index < info.input_generics.size(); ++index) {
50 const auto& generic{info.input_generics[index]};
51 if (generic.used) {
52 Add("layout(location={})in vec4 in_attr{};", index, index);
53 }
54 }
55 for (size_t index = 0; index < info.stores_frag_color.size(); ++index) {
56 if (!info.stores_frag_color[index]) {
57 continue;
58 }
59 Add("layout(location={})out vec4 frag_color{};", index, index);
60 }
61 for (size_t index = 0; index < info.stores_generics.size(); ++index) {
62 if (info.stores_generics[index]) {
63 Add("layout(location={}) out vec4 out_attr{};", index, index);
64 }
65 }
24 DefineConstantBuffers(); 66 DefineConstantBuffers();
25 DefineStorageBuffers(); 67 DefineStorageBuffers();
26 DefineHelperFunctions(); 68 DefineHelperFunctions();
27 code += "void main(){\n"; 69 Add("void main(){{");
70
71 if (stage == Stage::VertexA || stage == Stage::VertexB) {
72 Add("gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);");
73 }
28} 74}
29 75
30void EmitContext::SetupExtensions(std::string& header) { 76void EmitContext::SetupExtensions(std::string& header) {