shader: Implement TLD4.PTP
This commit is contained in:
		| @@ -169,6 +169,7 @@ 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() { | ||||
|   | ||||
| @@ -65,6 +65,7 @@ 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, Id e1, Id e2); | ||||
| Id EmitCompositeConstructU32x2(EmitContext& ctx, IR::Inst* inst, 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, Id e1, Id e2); | ||||
| Id EmitCompositeConstructF16x2(EmitContext& ctx, IR::Inst* inst, 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, Id e1, Id e2); | ||||
| Id EmitCompositeConstructF32x2(EmitContext& ctx, IR::Inst* inst, 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,6 +122,7 @@ 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); | ||||
|   | ||||
| @@ -3,10 +3,15 @@ | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #include "shader_recompiler/backend/spirv/emit_spirv.h" | ||||
| #include "shader_recompiler/frontend/ir/modifiers.h" | ||||
|  | ||||
| namespace Shader::Backend::SPIRV { | ||||
|  | ||||
| Id EmitCompositeConstructU32x2(EmitContext& ctx, Id e1, Id e2) { | ||||
| 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); | ||||
|     } | ||||
|     return ctx.OpCompositeConstruct(ctx.U32[2], e1, e2); | ||||
| } | ||||
|  | ||||
| @@ -42,7 +47,12 @@ Id EmitCompositeInsertU32x4(EmitContext& ctx, Id composite, Id object, u32 index | ||||
|     return ctx.OpCompositeInsert(ctx.U32[4], object, composite, index); | ||||
| } | ||||
|  | ||||
| Id EmitCompositeConstructF16x2(EmitContext& ctx, Id e1, Id e2) { | ||||
| 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); | ||||
|     } | ||||
|     return ctx.OpCompositeConstruct(ctx.F16[2], e1, e2); | ||||
| } | ||||
|  | ||||
| @@ -78,7 +88,11 @@ Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index | ||||
|     return ctx.OpCompositeInsert(ctx.F16[4], object, composite, index); | ||||
| } | ||||
|  | ||||
| Id EmitCompositeConstructF32x2(EmitContext& ctx, Id e1, Id e2) { | ||||
| 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); | ||||
|     } | ||||
|     return ctx.OpCompositeConstruct(ctx.F32[2], e1, e2); | ||||
| } | ||||
|  | ||||
| @@ -150,4 +164,15 @@ 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 OpCompositeConstruct(ctx.array_U32x2, e1, e2, e3, e4); | ||||
|     } | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| } // namespace Shader::Backend::SPIRV | ||||
|   | ||||
| @@ -30,10 +30,13 @@ public: | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     explicit ImageOperands([[maybe_unused]] EmitContext& ctx, Id offset) { | ||||
|     explicit ImageOperands([[maybe_unused]] EmitContext& ctx, Id offset, Id offset2) { | ||||
|         if (Sirit::ValidId(offset)) { | ||||
|             Add(spv::ImageOperandsMask::Offset, offset); | ||||
|         } | ||||
|         if (Sirit::ValidId(offset2)) { | ||||
|             Add(spv::ImageOperandsMask::ConstOffsets, offset2); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void Add(spv::ImageOperandsMask new_mask, Id value) { | ||||
| @@ -177,7 +180,7 @@ Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Va | ||||
| Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, | ||||
|                    [[maybe_unused]] Id offset2) { | ||||
|     const auto info{inst->Flags<IR::TextureInstInfo>()}; | ||||
|     const ImageOperands operands(ctx, offset); | ||||
|     const ImageOperands operands(ctx, offset, offset2); | ||||
|     return Emit(&EmitContext::OpImageSparseGather, &EmitContext::OpImageGather, ctx, inst, | ||||
|                 ctx.F32[4], Texture(ctx, index), coords, | ||||
|                 ctx.Constant(ctx.U32[1], info.gather_component.Value()), operands.Mask(), | ||||
| @@ -187,7 +190,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, [[maybe_unused]] Id offset2, Id dref) { | ||||
|     const auto info{inst->Flags<IR::TextureInstInfo>()}; | ||||
|     const ImageOperands operands(ctx, offset); | ||||
|     const ImageOperands operands(ctx, offset, offset2); | ||||
|     return Emit(&EmitContext::OpImageSparseDrefGather, &EmitContext::OpImageDrefGather, ctx, inst, | ||||
|                 ctx.F32[4], Texture(ctx, index), coords, dref, operands.Mask(), operands.Span()); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user