ReinUsesLisp 5 лет назад
Родитель
Сommit
f0031babeb

+ 3 - 0
src/shader_recompiler/backend/spirv/emit_context.cpp

@@ -302,6 +302,9 @@ void EmitContext::DefineInputs(const Info& info) {
             base_vertex = DefineInput(*this, U32[1], spv::BuiltIn::BaseVertex);
         }
     }
+    if (info.loads_front_face) {
+        front_face = DefineInput(*this, U1, spv::BuiltIn::FrontFacing);
+    }
     for (size_t index = 0; index < info.loads_generics.size(); ++index) {
         if (!info.loads_generics[index]) {
             continue;

+ 1 - 0
src/shader_recompiler/backend/spirv/emit_context.h

@@ -94,6 +94,7 @@ public:
     Id vertex_id{};
     Id vertex_index{};
     Id base_vertex{};
+    Id front_face{};
 
     Id input_position{};
     std::array<Id, 32> input_generics{};

+ 4 - 0
src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp

@@ -156,6 +156,10 @@ Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr) {
             return ctx.OpISub(ctx.U32[1], ctx.OpLoad(ctx.U32[1], ctx.vertex_index),
                               ctx.OpLoad(ctx.U32[1], ctx.base_vertex));
         }
+    case IR::Attribute::FrontFace:
+        return ctx.OpSelect(ctx.U32[1], ctx.OpLoad(ctx.U1, ctx.front_face),
+                            ctx.Constant(ctx.U32[1], std::numeric_limits<u32>::max()),
+                            ctx.u32_zero_value);
     default:
         throw NotImplementedException("Read attribute {}", attr);
     }

+ 3 - 0
src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp

@@ -44,6 +44,9 @@ void GetAttribute(Info& info, IR::Attribute attribute) {
     case IR::Attribute::VertexId:
         info.loads_vertex_id = true;
         break;
+    case IR::Attribute::FrontFace:
+        info.loads_front_face = true;
+        break;
     default:
         throw NotImplementedException("Get attribute {}", attribute);
     }

+ 1 - 0
src/shader_recompiler/shader_info.h

@@ -62,6 +62,7 @@ struct Info {
     bool loads_position{};
     bool loads_instance_id{};
     bool loads_vertex_id{};
+    bool loads_front_face{};
 
     std::array<bool, 8> stores_frag_color{};
     bool stores_frag_depth{};