diff options
| author | 2021-05-20 17:28:09 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:32 -0400 | |
| commit | 83cef0426b058014ad94dd687a29e7c31a1fbbef (patch) | |
| tree | 54d1860cae0a8b1db6341b610d50aea15801ab13 /src/shader_recompiler/backend/glasm | |
| parent | glasm: Declare geometry program headers (diff) | |
| download | yuzu-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')
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); |