diff options
| author | 2021-05-26 00:16:20 -0400 | |
|---|---|---|
| committer | 2021-07-22 21:51:36 -0400 | |
| commit | 3d086e6130a2c5f0546ccef3b234c65ef2f0c99b (patch) | |
| tree | eaddf938c32f9a077ff671db4e9ebe9634304033 /src/shader_recompiler/backend/glsl/emit_context.cpp | |
| parent | glsl: Track S32 atomics (diff) | |
| download | yuzu-3d086e6130a2c5f0546ccef3b234c65ef2f0c99b.tar.gz yuzu-3d086e6130a2c5f0546ccef3b234c65ef2f0c99b.tar.xz yuzu-3d086e6130a2c5f0546ccef3b234c65ef2f0c99b.zip | |
glsl: Implement some attribute getters and setters
Diffstat (limited to 'src/shader_recompiler/backend/glsl/emit_context.cpp')
| -rw-r--r-- | src/shader_recompiler/backend/glsl/emit_context.cpp | 52 |
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 | ||
| 30 | void EmitContext::SetupExtensions(std::string& header) { | 76 | void EmitContext::SetupExtensions(std::string& header) { |