summaryrefslogtreecommitdiffstats
path: root/src/shader_recompiler/backend/glsl/emit_context.cpp
diff options
context:
space:
mode:
authorameerj <52414509+ameerj@users.noreply.github.com>2021-05-26 06:16:20 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:36 +0200
commit3d086e6130a2c5f0546ccef3b234c65ef2f0c99b (patch)
treeeaddf938c32f9a077ff671db4e9ebe9634304033 /src/shader_recompiler/backend/glsl/emit_context.cpp
parentglsl: Track S32 atomics (diff)
downloadyuzu-3d086e6130a2c5f0546ccef3b234c65ef2f0c99b.tar
yuzu-3d086e6130a2c5f0546ccef3b234c65ef2f0c99b.tar.gz
yuzu-3d086e6130a2c5f0546ccef3b234c65ef2f0c99b.tar.bz2
yuzu-3d086e6130a2c5f0546ccef3b234c65ef2f0c99b.tar.lz
yuzu-3d086e6130a2c5f0546ccef3b234c65ef2f0c99b.tar.xz
yuzu-3d086e6130a2c5f0546ccef3b234c65ef2f0c99b.tar.zst
yuzu-3d086e6130a2c5f0546ccef3b234c65ef2f0c99b.zip
Diffstat (limited to '')
-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
: info{program.info}, profile{profile_} {
std::string header = "#version 450\n";
SetupExtensions(header);
- if (program.stage == Stage::Compute) {
+ stage = program.stage;
+ switch (program.stage) {
+ case Stage::VertexA:
+ case Stage::VertexB:
+ stage_name = "vertex";
+ attrib_name = "vertex";
+ // TODO: add only what's used by the shader
+ header +=
+ "out gl_PerVertex {vec4 gl_Position;float gl_PointSize;float gl_ClipDistance[];};";
+ break;
+ case Stage::TessellationControl:
+ case Stage::TessellationEval:
+ stage_name = "primitive";
+ attrib_name = "primitive";
+ break;
+ case Stage::Geometry:
+ stage_name = "primitive";
+ attrib_name = "vertex";
+ break;
+ case Stage::Fragment:
+ stage_name = "fragment";
+ attrib_name = "fragment";
+ break;
+ case Stage::Compute:
+ stage_name = "invocation";
header += fmt::format("layout(local_size_x={},local_size_y={},local_size_z={}) in;\n",
program.workgroup_size[0], program.workgroup_size[1],
program.workgroup_size[2]);
+ break;
}
code += header;
-
+ const std::string_view attr_stage{stage == Stage::Fragment ? "fragment" : "vertex"};
+ for (size_t index = 0; index < info.input_generics.size(); ++index) {
+ const auto& generic{info.input_generics[index]};
+ if (generic.used) {
+ Add("layout(location={})in vec4 in_attr{};", index, index);
+ }
+ }
+ for (size_t index = 0; index < info.stores_frag_color.size(); ++index) {
+ if (!info.stores_frag_color[index]) {
+ continue;
+ }
+ Add("layout(location={})out vec4 frag_color{};", index, index);
+ }
+ for (size_t index = 0; index < info.stores_generics.size(); ++index) {
+ if (info.stores_generics[index]) {
+ Add("layout(location={}) out vec4 out_attr{};", index, index);
+ }
+ }
DefineConstantBuffers();
DefineStorageBuffers();
DefineHelperFunctions();
- code += "void main(){\n";
+ Add("void main(){{");
+
+ if (stage == Stage::VertexA || stage == Stage::VertexB) {
+ Add("gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);");
+ }
}
void EmitContext::SetupExtensions(std::string& header) {