diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2021-05-21 02:56:59 -0300 | 
|---|---|---|
| committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-07-22 21:51:33 -0400 | 
| commit | b382f57b286f72f89cff4e710ba6e6b34d22035d (patch) | |
| tree | 78fea5da1865ba99ac1bd4c0ce7afbb8a1faae05 | |
| parent | c07cc9d6a560d14e25ec59974ae5a15a7842d779 (diff) | |
glasm: Fix output patch reads
With this, Luigi's Mansion's sand renders properly.
| -rw-r--r-- | src/shader_recompiler/backend/glasm/emit_context.cpp | 12 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp | 23 | 
2 files changed, 22 insertions, 13 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_context.cpp b/src/shader_recompiler/backend/glasm/emit_context.cpp index 659ff6d17..0f7d79843 100644 --- a/src/shader_recompiler/backend/glasm/emit_context.cpp +++ b/src/shader_recompiler/backend/glasm/emit_context.cpp @@ -21,6 +21,11 @@ std::string_view InterpDecorator(Interpolation interp) {      }      throw InvalidArgument("Invalid interpolation {}", interp);  } + +bool IsInputArray(Stage stage) { +    return stage == Stage::Geometry || stage == Stage::TessellationControl || +           stage == Stage::TessellationEval; +}  } // Anonymous namespace  EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile& profile_, @@ -76,7 +81,7 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile                  InterpDecorator(generic.interpolation), index, attr_stage, index, index);          }      } -    if (stage == Stage::Geometry && info.loads_position) { +    if (IsInputArray(stage) && info.loads_position) {          Add("ATTRIB vertex_position=vertex.position;");      }      if (info.uses_invocation_id) { @@ -96,8 +101,9 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile              continue;          }          if (stage == Stage::TessellationControl) { -            Add("OUTPUT result_patch_attrib{}[]={{result.patch.attrib[{}..{}]}};", index, index, -                index); +            Add("OUTPUT result_patch_attrib{}[]={{result.patch.attrib[{}..{}]}};" +                "ATTRIB primitive_out_patch_attrib{}[]={{primitive.out.patch.attrib[{}..{}]}};", +                index, index, index, index, index, index);          } else {              Add("ATTRIB primitive_patch_attrib{}[]={{primitive.patch.attrib[{}..{}]}};", index,                  index, index); 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 34669160a..97b0e7409 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 @@ -20,15 +20,13 @@ void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, ScalarU      ctx.Add("LDC.{} {},c{}[{}];", size, ret, binding.U32(), offset);  } +bool IsInputArray(Stage stage) { +    return stage == Stage::Geometry || stage == Stage::TessellationControl || +           stage == Stage::TessellationEval; +} +  std::string VertexIndex(EmitContext& ctx, ScalarU32 vertex) { -    switch (ctx.stage) { -    case Stage::TessellationControl: -    case Stage::TessellationEval: -    case Stage::Geometry: -        return fmt::format("[{}]", vertex); -    default: -        return ""; -    } +    return IsInputArray(ctx.stage) ? fmt::format("[{}]", vertex) : "";  }  } // Anonymous namespace @@ -77,7 +75,7 @@ void EmitGetAttribute(EmitContext& ctx, IR::Inst& inst, IR::Attribute attr, Scal      case IR::Attribute::PositionY:      case IR::Attribute::PositionZ:      case IR::Attribute::PositionW: -        if (ctx.stage == Stage::Geometry) { +        if (IsInputArray(ctx.stage)) {              ctx.Add("MOV.F {}.x,vertex_position{}.{};", inst, VertexIndex(ctx, vertex), swizzle);          } else {              ctx.Add("MOV.F {}.x,{}.position.{};", inst, ctx.attrib_name, swizzle); @@ -164,7 +162,12 @@ void EmitGetPatch(EmitContext& ctx, IR::Inst& inst, IR::Patch patch) {      }      const u32 index{IR::GenericPatchIndex(patch)};      const u32 element{IR::GenericPatchElement(patch)}; -    ctx.Add("MOV.F {},result.patch.attrib[{}].{};", inst, index, "xyzw"[element]); +    const char swizzle{"xyzw"[element]}; +    if (ctx.stage == Stage::TessellationControl) { +        ctx.Add("MOV.F {},primitive.out.patch.attrib[{}].{};", inst, index, swizzle); +    } else { +        ctx.Add("MOV.F {},primitive.patch.attrib[{}].{};", inst, index, swizzle); +    }  }  void EmitSetPatch(EmitContext& ctx, IR::Patch patch, ScalarF32 value) {  | 
