shader: Refactor PTP and other minor changes
This commit is contained in:
		| @@ -169,7 +169,6 @@ void EmitContext::DefineCommonTypes(const Info& info) { | ||||
|         AddCapability(spv::Capability::Float64); | ||||
|         F64.Define(*this, TypeFloat(64), "f64"); | ||||
|     } | ||||
|     array_U32x2 = Name(TypeArray(U32[2], Constant(U32[1], 4U)), "array-u32x2"); | ||||
| } | ||||
|  | ||||
| void EmitContext::DefineCommonConstants() { | ||||
| @@ -352,20 +351,19 @@ void EmitContext::DefineOutputs(const Info& info) { | ||||
|         } | ||||
|     } | ||||
|     if (stage == Stage::Fragment) { | ||||
|         for (size_t i = 0; i < 8; ++i) { | ||||
|             if (!info.stores_frag_color[i]) { | ||||
|         for (u32 index = 0; index < 8; ++index) { | ||||
|             if (!info.stores_frag_color[index]) { | ||||
|                 continue; | ||||
|             } | ||||
|             frag_color[i] = DefineOutput(*this, F32[4]); | ||||
|             Decorate(frag_color[i], spv::Decoration::Location, static_cast<u32>(i)); | ||||
|             Name(frag_color[i], fmt::format("frag_color{}", i)); | ||||
|             frag_color[index] = DefineOutput(*this, F32[4]); | ||||
|             Decorate(frag_color[index], spv::Decoration::Location, index); | ||||
|             Name(frag_color[index], fmt::format("frag_color{}", index)); | ||||
|         } | ||||
|         if (!info.stores_frag_depth) { | ||||
|             return; | ||||
|         if (info.stores_frag_depth) { | ||||
|             frag_depth = DefineOutput(*this, F32[1]); | ||||
|             Decorate(frag_depth, spv::Decoration::BuiltIn, spv::BuiltIn::FragDepth); | ||||
|             Name(frag_depth, "frag_depth"); | ||||
|         } | ||||
|         frag_depth = DefineOutput(*this, F32[1]); | ||||
|         Decorate(frag_depth, spv::Decoration::BuiltIn, static_cast<u32>(spv::BuiltIn::FragDepth)); | ||||
|         Name(frag_depth, "frag_depth"); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -65,7 +65,6 @@ public: | ||||
|     VectorTypes U32; | ||||
|     VectorTypes F16; | ||||
|     VectorTypes F64; | ||||
|     Id array_U32x2; | ||||
|  | ||||
|     Id true_value{}; | ||||
|     Id false_value{}; | ||||
|   | ||||
| @@ -95,7 +95,7 @@ void EmitWriteStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Va | ||||
|                         Id value); | ||||
| void EmitWriteStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, | ||||
|                          Id value); | ||||
| Id EmitCompositeConstructU32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); | ||||
| Id EmitCompositeConstructU32x2(EmitContext& ctx, Id e1, Id e2); | ||||
| Id EmitCompositeConstructU32x3(EmitContext& ctx, Id e1, Id e2, Id e3); | ||||
| Id EmitCompositeConstructU32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4); | ||||
| Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index); | ||||
| @@ -104,7 +104,7 @@ Id EmitCompositeExtractU32x4(EmitContext& ctx, Id composite, u32 index); | ||||
| Id EmitCompositeInsertU32x2(EmitContext& ctx, Id composite, Id object, u32 index); | ||||
| Id EmitCompositeInsertU32x3(EmitContext& ctx, Id composite, Id object, u32 index); | ||||
| Id EmitCompositeInsertU32x4(EmitContext& ctx, Id composite, Id object, u32 index); | ||||
| Id EmitCompositeConstructF16x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); | ||||
| Id EmitCompositeConstructF16x2(EmitContext& ctx, Id e1, Id e2); | ||||
| Id EmitCompositeConstructF16x3(EmitContext& ctx, Id e1, Id e2, Id e3); | ||||
| Id EmitCompositeConstructF16x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4); | ||||
| Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index); | ||||
| @@ -113,7 +113,7 @@ Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index); | ||||
| Id EmitCompositeInsertF16x2(EmitContext& ctx, Id composite, Id object, u32 index); | ||||
| Id EmitCompositeInsertF16x3(EmitContext& ctx, Id composite, Id object, u32 index); | ||||
| Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index); | ||||
| Id EmitCompositeConstructF32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); | ||||
| Id EmitCompositeConstructF32x2(EmitContext& ctx, Id e1, Id e2); | ||||
| Id EmitCompositeConstructF32x3(EmitContext& ctx, Id e1, Id e2, Id e3); | ||||
| Id EmitCompositeConstructF32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4); | ||||
| Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index); | ||||
| @@ -122,7 +122,6 @@ Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index); | ||||
| Id EmitCompositeInsertF32x2(EmitContext& ctx, Id composite, Id object, u32 index); | ||||
| Id EmitCompositeInsertF32x3(EmitContext& ctx, Id composite, Id object, u32 index); | ||||
| Id EmitCompositeInsertF32x4(EmitContext& ctx, Id composite, Id object, u32 index); | ||||
| Id EmitCompositeConstructArrayU32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4); | ||||
| void EmitCompositeConstructF64x2(EmitContext& ctx); | ||||
| void EmitCompositeConstructF64x3(EmitContext& ctx); | ||||
| void EmitCompositeConstructF64x4(EmitContext& ctx); | ||||
| @@ -359,10 +358,10 @@ Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Va | ||||
|                                   Id coords, Id dref, Id bias_lc, Id offset); | ||||
| Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, | ||||
|                                   Id coords, Id dref, Id lod_lc, Id offset); | ||||
| Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, | ||||
|                    Id offset2); | ||||
| Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, | ||||
|                    const IR::Value& offset, const IR::Value& offset2); | ||||
| Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, | ||||
|                        Id offset, Id offset2, Id dref); | ||||
|                        const IR::Value& offset, const IR::Value& offset2, Id dref); | ||||
| Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, | ||||
|                   Id lod, Id ms); | ||||
| Id EmitVoteAll(EmitContext& ctx, Id pred); | ||||
|   | ||||
| @@ -7,11 +7,7 @@ | ||||
|  | ||||
| namespace Shader::Backend::SPIRV { | ||||
|  | ||||
| Id EmitCompositeConstructU32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) { | ||||
|     const auto info{inst->Flags<IR::CompositeDecoration>()}; | ||||
|     if (info.is_constant) { | ||||
|         return ctx.ConstantComposite(ctx.U32[2], e1, e2); | ||||
|     } | ||||
| Id EmitCompositeConstructU32x2(EmitContext& ctx, Id e1, Id e2) { | ||||
|     return ctx.OpCompositeConstruct(ctx.U32[2], e1, e2); | ||||
| } | ||||
|  | ||||
| @@ -47,12 +43,7 @@ Id EmitCompositeInsertU32x4(EmitContext& ctx, Id composite, Id object, u32 index | ||||
|     return ctx.OpCompositeInsert(ctx.U32[4], object, composite, index); | ||||
| } | ||||
|  | ||||
| Id EmitCompositeConstructF16x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) { | ||||
|  | ||||
|     const auto info{inst->Flags<IR::CompositeDecoration>()}; | ||||
|     if (info.is_constant) { | ||||
|         return ctx.ConstantComposite(ctx.F16[2], e1, e2); | ||||
|     } | ||||
| Id EmitCompositeConstructF16x2(EmitContext& ctx, Id e1, Id e2) { | ||||
|     return ctx.OpCompositeConstruct(ctx.F16[2], e1, e2); | ||||
| } | ||||
|  | ||||
| @@ -88,11 +79,7 @@ Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index | ||||
|     return ctx.OpCompositeInsert(ctx.F16[4], object, composite, index); | ||||
| } | ||||
|  | ||||
| Id EmitCompositeConstructF32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) { | ||||
|     const auto info{inst->Flags<IR::CompositeDecoration>()}; | ||||
|     if (info.is_constant) { | ||||
|         return ctx.ConstantComposite(ctx.F32[2], e1, e2); | ||||
|     } | ||||
| Id EmitCompositeConstructF32x2(EmitContext& ctx, Id e1, Id e2) { | ||||
|     return ctx.OpCompositeConstruct(ctx.F32[2], e1, e2); | ||||
| } | ||||
|  | ||||
| @@ -164,15 +151,4 @@ Id EmitCompositeInsertF64x4(EmitContext& ctx, Id composite, Id object, u32 index | ||||
|     return ctx.OpCompositeInsert(ctx.F64[4], object, composite, index); | ||||
| } | ||||
|  | ||||
| Id EmitCompositeConstructArrayU32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4) { | ||||
|     const auto info{inst->Flags<IR::CompositeDecoration>()}; | ||||
|     if (info.is_constant) { | ||||
|         return ctx.ConstantComposite(ctx.array_U32x2, e1, e2, e3, e4); | ||||
|     } | ||||
|     if (ctx.profile.support_variadic_ptp) { | ||||
|         return ctx.OpCompositeConstruct(ctx.array_U32x2, e1, e2, e3, e4); | ||||
|     } | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| } // namespace Shader::Backend::SPIRV | ||||
|   | ||||
| @@ -30,16 +30,34 @@ public: | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     explicit ImageOperands([[maybe_unused]] EmitContext& ctx, Id offset, Id offset2) { | ||||
|         if (Sirit::ValidId(offset)) { | ||||
|             Add(spv::ImageOperandsMask::Offset, offset); | ||||
|     explicit ImageOperands(EmitContext& ctx, const IR::Value& offset, const IR::Value& offset2) { | ||||
|         if (offset2.IsEmpty()) { | ||||
|             if (offset.IsEmpty()) { | ||||
|                 return; | ||||
|             } | ||||
|             Add(spv::ImageOperandsMask::Offset, ctx.Def(offset)); | ||||
|             return; | ||||
|         } | ||||
|         if (Sirit::ValidId(offset2)) { | ||||
|             Add(spv::ImageOperandsMask::ConstOffsets, offset2); | ||||
|         const std::array values{offset.InstRecursive(), offset2.InstRecursive()}; | ||||
|         if (!values[0]->AreAllArgsImmediates() || !values[1]->AreAllArgsImmediates()) { | ||||
|             throw NotImplementedException("Not all arguments in PTP are immediate"); | ||||
|         } | ||||
|         const IR::Opcode opcode{values[0]->Opcode()}; | ||||
|         if (opcode != values[1]->Opcode() || opcode != IR::Opcode::CompositeConstructU32x4) { | ||||
|             throw LogicError("Invalid PTP arguments"); | ||||
|         } | ||||
|         auto read{[&](int a, int b) { return ctx.Constant(ctx.U32[1], values[a]->Arg(b).U32()); }}; | ||||
|  | ||||
|         const Id offsets{ | ||||
|             ctx.ConstantComposite(ctx.TypeArray(ctx.U32[2], ctx.Constant(ctx.U32[1], 4)), | ||||
|                                   ctx.ConstantComposite(ctx.U32[2], read(0, 0), read(0, 1)), | ||||
|                                   ctx.ConstantComposite(ctx.U32[2], read(0, 2), read(0, 3)), | ||||
|                                   ctx.ConstantComposite(ctx.U32[2], read(1, 0), read(1, 1)), | ||||
|                                   ctx.ConstantComposite(ctx.U32[2], read(1, 2), read(1, 3)))}; | ||||
|         Add(spv::ImageOperandsMask::ConstOffsets, offsets); | ||||
|     } | ||||
|  | ||||
|     explicit ImageOperands([[maybe_unused]] EmitContext& ctx, Id offset, Id lod, Id ms) { | ||||
|     explicit ImageOperands(Id offset, Id lod, Id ms) { | ||||
|         if (Sirit::ValidId(lod)) { | ||||
|             Add(spv::ImageOperandsMask::Lod, lod); | ||||
|         } | ||||
| @@ -197,8 +215,8 @@ Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Va | ||||
|                 Texture(ctx, index), coords, dref, operands.Mask(), operands.Span()); | ||||
| } | ||||
|  | ||||
| Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, | ||||
|                    Id offset2) { | ||||
| Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, | ||||
|                    const IR::Value& offset, const IR::Value& offset2) { | ||||
|     const auto info{inst->Flags<IR::TextureInstInfo>()}; | ||||
|     const ImageOperands operands(ctx, offset, offset2); | ||||
|     return Emit(&EmitContext::OpImageSparseGather, &EmitContext::OpImageGather, ctx, inst, | ||||
| @@ -208,7 +226,7 @@ Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id | ||||
| } | ||||
|  | ||||
| Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, | ||||
|                        Id offset, Id offset2, Id dref) { | ||||
|                        const IR::Value& offset, const IR::Value& offset2, Id dref) { | ||||
|     const auto info{inst->Flags<IR::TextureInstInfo>()}; | ||||
|     const ImageOperands operands(ctx, offset, offset2); | ||||
|     return Emit(&EmitContext::OpImageSparseDrefGather, &EmitContext::OpImageDrefGather, ctx, inst, | ||||
| @@ -218,7 +236,7 @@ Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, | ||||
| Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, | ||||
|                   Id lod, Id ms) { | ||||
|     const auto info{inst->Flags<IR::TextureInstInfo>()}; | ||||
|     const ImageOperands operands(ctx, offset, lod, ms); | ||||
|     const ImageOperands operands(offset, lod, ms); | ||||
|     return Emit(&EmitContext::OpImageSparseFetch, &EmitContext::OpImageFetch, ctx, inst, ctx.F32[4], | ||||
|                 Texture(ctx, index), coords, operands.Mask(), operands.Span()); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user