summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/glasm
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-05-20 17:28:09 -0300
committerGravatar ameerj2021-07-22 21:51:32 -0400
commit83cef0426b058014ad94dd687a29e7c31a1fbbef (patch)
tree54d1860cae0a8b1db6341b610d50aea15801ab13 /src/shader_recompiler/backend/glasm
parentglasm: Declare geometry program headers (diff)
downloadyuzu-83cef0426b058014ad94dd687a29e7c31a1fbbef.tar.gz
yuzu-83cef0426b058014ad94dd687a29e7c31a1fbbef.tar.xz
yuzu-83cef0426b058014ad94dd687a29e7c31a1fbbef.zip
glasm: Properly declare attributes on geometry programs
Diffstat (limited to 'src/shader_recompiler/backend/glasm')
-rw-r--r--src/shader_recompiler/backend/glasm/emit_context.cpp9
-rw-r--r--src/shader_recompiler/backend/glasm/emit_context.h1
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp10
3 files changed, 14 insertions, 6 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_context.cpp b/src/shader_recompiler/backend/glasm/emit_context.cpp
index 8f418936e..a9bbb680f 100644
--- a/src/shader_recompiler/backend/glasm/emit_context.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_context.cpp
@@ -47,24 +47,31 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile
47 case Stage::VertexA: 47 case Stage::VertexA:
48 case Stage::VertexB: 48 case Stage::VertexB:
49 stage_name = "vertex"; 49 stage_name = "vertex";
50 attrib_name = "vertex";
50 break; 51 break;
51 case Stage::TessellationControl: 52 case Stage::TessellationControl:
52 case Stage::TessellationEval: 53 case Stage::TessellationEval:
54 stage_name = "primitive";
55 attrib_name = "primitive";
56 break;
53 case Stage::Geometry: 57 case Stage::Geometry:
54 stage_name = "primitive"; 58 stage_name = "primitive";
59 attrib_name = "vertex";
55 break; 60 break;
56 case Stage::Fragment: 61 case Stage::Fragment:
57 stage_name = "fragment"; 62 stage_name = "fragment";
63 attrib_name = "fragment";
58 break; 64 break;
59 case Stage::Compute: 65 case Stage::Compute:
60 stage_name = "invocation"; 66 stage_name = "invocation";
61 break; 67 break;
62 } 68 }
69 const std::string_view attr_stage{stage == Stage::Fragment ? "fragment" : "vertex"};
63 for (size_t index = 0; index < program.info.input_generics.size(); ++index) { 70 for (size_t index = 0; index < program.info.input_generics.size(); ++index) {
64 const auto& generic{program.info.input_generics[index]}; 71 const auto& generic{program.info.input_generics[index]};
65 if (generic.used) { 72 if (generic.used) {
66 Add("{}ATTRIB in_attr{}[]={{{}.attrib[{}..{}]}};", 73 Add("{}ATTRIB in_attr{}[]={{{}.attrib[{}..{}]}};",
67 InterpDecorator(generic.interpolation), index, stage_name, index, index); 74 InterpDecorator(generic.interpolation), index, attr_stage, index, index);
68 } 75 }
69 } 76 }
70 for (size_t index = 0; index < program.info.stores_frag_color.size(); ++index) { 77 for (size_t index = 0; index < program.info.stores_frag_color.size(); ++index) {
diff --git a/src/shader_recompiler/backend/glasm/emit_context.h b/src/shader_recompiler/backend/glasm/emit_context.h
index d5bab48ea..e76ed1d7c 100644
--- a/src/shader_recompiler/backend/glasm/emit_context.h
+++ b/src/shader_recompiler/backend/glasm/emit_context.h
@@ -66,6 +66,7 @@ public:
66 66
67 Stage stage{}; 67 Stage stage{};
68 std::string_view stage_name = "invalid"; 68 std::string_view stage_name = "invalid";
69 std::string_view attrib_name = "invalid";
69}; 70};
70 71
71} // namespace Shader::Backend::GLASM 72} // namespace Shader::Backend::GLASM
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp
index 6484387bc..a81bd209b 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp
+++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp
@@ -64,20 +64,20 @@ void EmitGetAttribute(EmitContext& ctx, IR::Inst& inst, IR::Attribute attr,
64 case IR::Attribute::PositionY: 64 case IR::Attribute::PositionY:
65 case IR::Attribute::PositionZ: 65 case IR::Attribute::PositionZ:
66 case IR::Attribute::PositionW: 66 case IR::Attribute::PositionW:
67 ctx.Add("MOV.F {}.x,{}.position.{};", inst, ctx.stage_name, swizzle); 67 ctx.Add("MOV.F {}.x,{}.position.{};", inst, ctx.attrib_name, swizzle);
68 break; 68 break;
69 case IR::Attribute::PointSpriteS: 69 case IR::Attribute::PointSpriteS:
70 case IR::Attribute::PointSpriteT: 70 case IR::Attribute::PointSpriteT:
71 ctx.Add("MOV.F {}.x,{}.pointcoord.{};", inst, ctx.stage_name, swizzle); 71 ctx.Add("MOV.F {}.x,{}.pointcoord.{};", inst, ctx.attrib_name, swizzle);
72 break; 72 break;
73 case IR::Attribute::InstanceId: 73 case IR::Attribute::InstanceId:
74 ctx.Add("MOV.S {}.x,{}.instance;", inst, ctx.stage_name); 74 ctx.Add("MOV.S {}.x,{}.instance;", inst, ctx.attrib_name);
75 break; 75 break;
76 case IR::Attribute::VertexId: 76 case IR::Attribute::VertexId:
77 ctx.Add("MOV.S {}.x,{}.id;", inst, ctx.stage_name); 77 ctx.Add("MOV.S {}.x,{}.id;", inst, ctx.attrib_name);
78 break; 78 break;
79 case IR::Attribute::FrontFace: 79 case IR::Attribute::FrontFace:
80 ctx.Add("CMP.S {}.x,{}.facing.x,0,-1;", inst, ctx.stage_name); 80 ctx.Add("CMP.S {}.x,{}.facing.x,0,-1;", inst, ctx.attrib_name);
81 break; 81 break;
82 default: 82 default:
83 throw NotImplementedException("Get attribute {}", attr); 83 throw NotImplementedException("Get attribute {}", attr);