mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	shader: Implement SampleMask
This commit is contained in:
		@@ -1179,7 +1179,10 @@ void EmitContext::DefineOutputs(const IR::Program& program) {
 | 
			
		||||
        if (info.stores_frag_depth) {
 | 
			
		||||
            frag_depth = DefineOutput(*this, F32[1], std::nullopt);
 | 
			
		||||
            Decorate(frag_depth, spv::Decoration::BuiltIn, spv::BuiltIn::FragDepth);
 | 
			
		||||
            Name(frag_depth, "frag_depth");
 | 
			
		||||
        }
 | 
			
		||||
        if (info.stores_sample_mask) {
 | 
			
		||||
            sample_mask = DefineOutput(*this, U32[1], std::nullopt);
 | 
			
		||||
            Decorate(sample_mask, spv::Decoration::BuiltIn, spv::BuiltIn::SampleMask);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
 
 | 
			
		||||
@@ -215,6 +215,7 @@ public:
 | 
			
		||||
    std::array<Id, 30> patches{};
 | 
			
		||||
 | 
			
		||||
    std::array<Id, 8> frag_color{};
 | 
			
		||||
    Id sample_mask{};
 | 
			
		||||
    Id frag_depth{};
 | 
			
		||||
 | 
			
		||||
    std::vector<Id> interfaces;
 | 
			
		||||
 
 | 
			
		||||
@@ -58,6 +58,7 @@ void EmitSetAttributeIndexed(EmitContext& ctx, Id offset, Id value, Id vertex);
 | 
			
		||||
Id EmitGetPatch(EmitContext& ctx, IR::Patch patch);
 | 
			
		||||
void EmitSetPatch(EmitContext& ctx, IR::Patch patch, Id value);
 | 
			
		||||
void EmitSetFragColor(EmitContext& ctx, u32 index, u32 component, Id value);
 | 
			
		||||
void EmitSetSampleMask(EmitContext& ctx, Id value);
 | 
			
		||||
void EmitSetFragDepth(EmitContext& ctx, Id value);
 | 
			
		||||
void EmitGetZFlag(EmitContext& ctx);
 | 
			
		||||
void EmitGetSFlag(EmitContext& ctx);
 | 
			
		||||
 
 | 
			
		||||
@@ -343,6 +343,10 @@ void EmitSetFragColor(EmitContext& ctx, u32 index, u32 component, Id value) {
 | 
			
		||||
    ctx.OpStore(pointer, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void EmitSetSampleMask(EmitContext& ctx, Id value) {
 | 
			
		||||
    ctx.OpStore(ctx.sample_mask, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void EmitSetFragDepth(EmitContext& ctx, Id value) {
 | 
			
		||||
    ctx.OpStore(ctx.frag_depth, value);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -343,6 +343,10 @@ void IREmitter::SetFragColor(u32 index, u32 component, const F32& value) {
 | 
			
		||||
    Inst(Opcode::SetFragColor, Imm32(index), Imm32(component), value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IREmitter::SetSampleMask(const U32& value) {
 | 
			
		||||
    Inst(Opcode::SetSampleMask, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IREmitter::SetFragDepth(const F32& value) {
 | 
			
		||||
    Inst(Opcode::SetFragDepth, value);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -88,6 +88,7 @@ public:
 | 
			
		||||
    void SetPatch(Patch patch, const F32& value);
 | 
			
		||||
 | 
			
		||||
    void SetFragColor(u32 index, u32 component, const F32& value);
 | 
			
		||||
    void SetSampleMask(const U32& value);
 | 
			
		||||
    void SetFragDepth(const F32& value);
 | 
			
		||||
 | 
			
		||||
    [[nodiscard]] U32 WorkgroupIdX();
 | 
			
		||||
 
 | 
			
		||||
@@ -75,6 +75,7 @@ bool Inst::MayHaveSideEffects() const noexcept {
 | 
			
		||||
    case Opcode::SetAttributeIndexed:
 | 
			
		||||
    case Opcode::SetPatch:
 | 
			
		||||
    case Opcode::SetFragColor:
 | 
			
		||||
    case Opcode::SetSampleMask:
 | 
			
		||||
    case Opcode::SetFragDepth:
 | 
			
		||||
    case Opcode::WriteGlobalU8:
 | 
			
		||||
    case Opcode::WriteGlobalS8:
 | 
			
		||||
 
 | 
			
		||||
@@ -51,6 +51,7 @@ OPCODE(SetAttributeIndexed,                                 Void,           U32,
 | 
			
		||||
OPCODE(GetPatch,                                            F32,            Patch,                                                                          )
 | 
			
		||||
OPCODE(SetPatch,                                            Void,           Patch,          F32,                                                            )
 | 
			
		||||
OPCODE(SetFragColor,                                        Void,           U32,            U32,            F32,                                            )
 | 
			
		||||
OPCODE(SetSampleMask,                                       Void,           U32,                                                                            )
 | 
			
		||||
OPCODE(SetFragDepth,                                        Void,           F32,                                                                            )
 | 
			
		||||
OPCODE(GetZFlag,                                            U1,             Void,                                                                           )
 | 
			
		||||
OPCODE(GetSFlag,                                            U1,             Void,                                                                           )
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ void ExitFragment(TranslatorVisitor& v) {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (sph.ps.omap.sample_mask != 0) {
 | 
			
		||||
        throw NotImplementedException("Sample mask");
 | 
			
		||||
        v.ir.SetSampleMask(v.X(src_reg));
 | 
			
		||||
    }
 | 
			
		||||
    if (sph.ps.omap.depth != 0) {
 | 
			
		||||
        v.ir.SetFragDepth(v.F(src_reg + 1));
 | 
			
		||||
 
 | 
			
		||||
@@ -403,6 +403,9 @@ void VisitUsages(Info& info, IR::Inst& inst) {
 | 
			
		||||
    case IR::Opcode::SetFragColor:
 | 
			
		||||
        info.stores_frag_color[inst.Arg(0).U32()] = true;
 | 
			
		||||
        break;
 | 
			
		||||
    case IR::Opcode::SetSampleMask:
 | 
			
		||||
        info.stores_sample_mask = true;
 | 
			
		||||
        break;
 | 
			
		||||
    case IR::Opcode::SetFragDepth:
 | 
			
		||||
        info.stores_frag_depth = true;
 | 
			
		||||
        break;
 | 
			
		||||
 
 | 
			
		||||
@@ -118,6 +118,7 @@ struct Info {
 | 
			
		||||
    bool loads_indexed_attributes{};
 | 
			
		||||
 | 
			
		||||
    std::array<bool, 8> stores_frag_color{};
 | 
			
		||||
    bool stores_sample_mask{};
 | 
			
		||||
    bool stores_frag_depth{};
 | 
			
		||||
    std::array<bool, 32> stores_generics{};
 | 
			
		||||
    bool stores_position{};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user