فهرست منبع

glsl: implement set clip distance

and missed a diff in emit_glsl relating to var alloc ref counting
ameerj 5 سال پیش
والد
کامیت
8ec0028e68

+ 3 - 0
src/shader_recompiler/backend/glsl/emit_glsl.cpp

@@ -112,6 +112,9 @@ void PrecolorInst(IR::Inst& phi) {
             ir.PhiMove(phi, IR::Value{arg.InstRecursive()});
         }
     }
+    for (size_t i = 0; i < num_args; ++i) {
+        IR::IREmitter{*phi.PhiBlock(i)}.Reference(IR::Value{&phi});
+    }
 }
 
 void Precolor(const IR::Program& program) {

+ 12 - 0
src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp

@@ -186,6 +186,18 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, std::string_view val
     case IR::Attribute::PositionW:
         ctx.Add("gl_Position.{}={};", swizzle, value);
         break;
+    case IR::Attribute::ClipDistance0:
+    case IR::Attribute::ClipDistance1:
+    case IR::Attribute::ClipDistance2:
+    case IR::Attribute::ClipDistance3:
+    case IR::Attribute::ClipDistance4:
+    case IR::Attribute::ClipDistance5:
+    case IR::Attribute::ClipDistance6:
+    case IR::Attribute::ClipDistance7: {
+        const u32 index{static_cast<u32>(attr) - static_cast<u32>(IR::Attribute::ClipDistance0)};
+        ctx.Add("gl_ClipDistance[{}]={};", index, value);
+        break;
+    }
     default:
         fmt::print("Set attribute {}", attr);
         throw NotImplementedException("Set attribute {}", attr);