mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-28 13:56:59 +01:00
shader: reuse native emitters and simplify memory dispatch
This commit is contained in:
@@ -3,13 +3,8 @@
|
||||
#include "graphics/shader/recompiler/backend/spirv/spirvEmitterInternal.h"
|
||||
|
||||
namespace Libs::Graphics::ShaderRecompiler::Spirv::Emitter {
|
||||
// Direct SPIR-V operations share emission as well as argument/result marshalling.
|
||||
template <spv::Op opcode, IR::Type type, typename... Args>
|
||||
uint32_t EmitNative(ValueEmitContext& ctx, Args... args) {
|
||||
const auto result = ctx.state.builder.AllocateId();
|
||||
ctx.state.builder.AddFunction({opcode, ctx.TypeId(type), result, args...});
|
||||
return result;
|
||||
}
|
||||
// Operand signatures distinguish SPIR-V IDs (uint32_t), raw literals/values
|
||||
// (IR::Value), and instructions whose metadata or operand loads must stay lazy.
|
||||
#define EMIT_NATIVE(name, opcode, type, ...) \
|
||||
inline constexpr auto Emit##name = EmitNative<spv::opcode, IR::Type::type, __VA_ARGS__>;
|
||||
EMIT_NATIVE(BitCastU16F16, OpBitcast, U32, uint32_t)
|
||||
@@ -18,13 +13,13 @@ inline constexpr auto EmitConvertU32U16 = EmitBitCastU16F16;
|
||||
inline constexpr auto EmitConvertU32U8 = EmitBitCastU16F16;
|
||||
inline constexpr auto EmitBitCastU32F32 = EmitBitCastU16F16;
|
||||
EMIT_NATIVE(BitCastF32U32, OpBitcast, F32, uint32_t)
|
||||
uint32_t EmitConvertU16U32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitConvertU8U32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitConvertF16F32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitConvertF32F16(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitConvertS32F32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitConvertU32F32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitConvertF32S32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitConvertU16U32(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitConvertU8U32(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitConvertF16F32(EmitterState& state, uint32_t arg0);
|
||||
inline constexpr auto EmitConvertF32F16 = EmitF16BitsToF32;
|
||||
uint32_t EmitConvertS32F32(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitConvertU32F32(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitConvertF32S32(EmitterState& state, uint32_t arg0);
|
||||
EMIT_NATIVE(ConvertF32U32, OpConvertUToF, F32, uint32_t)
|
||||
EMIT_NATIVE(CompositeConstructU64, OpCompositeConstruct, U64, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(CompositeConstructU32x2, OpCompositeConstruct, U32x2, uint32_t, uint32_t)
|
||||
@@ -32,17 +27,19 @@ EMIT_NATIVE(CompositeConstructU32x3, OpCompositeConstruct, U32x3, uint32_t, uint
|
||||
EMIT_NATIVE(CompositeConstructF32x2, OpCompositeConstruct, F32x2, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(CompositeConstructU32x4, OpCompositeConstruct, U32x4, uint32_t, uint32_t, uint32_t,
|
||||
uint32_t)
|
||||
uint32_t EmitCompositeExtractU64(ValueEmitContext& ctx, uint32_t arg0, IR::Value arg1);
|
||||
uint32_t EmitCompositeExtractU64(EmitterState& state, uint32_t arg0, IR::Value arg1);
|
||||
inline constexpr auto EmitCompositeExtractU32x2 = EmitCompositeExtractU64;
|
||||
inline constexpr auto EmitCompositeExtractU32x3 = EmitCompositeExtractU64;
|
||||
inline constexpr auto EmitCompositeExtractU32x4 = EmitCompositeExtractU64;
|
||||
uint32_t EmitPackHalf2x16(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitPackSnorm2x16(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitPackUnorm2x16(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitPackFloat2x16Rtz(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitFPAbs32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPNeg32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPSaturate32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
inline constexpr auto EmitPackHalf2x16 = EmitGlsl<GLSLstd450PackHalf2x16, IR::Type::U32, uint32_t>;
|
||||
inline constexpr auto EmitPackSnorm2x16 =
|
||||
EmitGlsl<GLSLstd450PackSnorm2x16, IR::Type::U32, uint32_t>;
|
||||
inline constexpr auto EmitPackUnorm2x16 =
|
||||
EmitGlsl<GLSLstd450PackUnorm2x16, IR::Type::U32, uint32_t>;
|
||||
uint32_t EmitPackFloat2x16Rtz(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
inline constexpr auto EmitFPAbs32 = EmitFAbsValue;
|
||||
inline constexpr auto EmitFPNeg32 = EmitFNegateValue;
|
||||
uint32_t EmitFPSaturate32(EmitterState& state, uint32_t arg0);
|
||||
EMIT_NATIVE(BitFieldInsert, OpBitFieldInsert, U32, uint32_t, uint32_t, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(BitFieldUExtract, OpBitFieldUExtract, U32, uint32_t, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(BitFieldSExtract, OpBitFieldSExtract, U32, uint32_t, uint32_t, uint32_t)
|
||||
@@ -53,13 +50,13 @@ EMIT_NATIVE(IAdd32, OpIAdd, U32, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(ISub32, OpISub, U32, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(IMul32, OpIMul, U32, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(UDiv32, OpUDiv, U32, uint32_t, uint32_t)
|
||||
uint32_t EmitIAdd64(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitISub64(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitIMul64(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitIAdd64(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitISub64(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitIMul64(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
EMIT_NATIVE(IAddCarry32, OpIAddCarry, U32x2, uint32_t, uint32_t)
|
||||
uint32_t EmitSMulHi(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitUMulHi(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitIAbs32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitSMulHi(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitUMulHi(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitIAbs32(EmitterState& state, uint32_t arg0);
|
||||
EMIT_NATIVE(ShiftLeftLogical32, OpShiftLeftLogical, U32, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(ShiftRightLogical32, OpShiftRightLogical, U32, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(ShiftRightArithmetic32, OpShiftRightArithmetic, U32, uint32_t, uint32_t)
|
||||
@@ -70,23 +67,23 @@ EMIT_NATIVE(BitwiseAnd32, OpBitwiseAnd, U32, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(BitwiseOr32, OpBitwiseOr, U32, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(BitwiseXor32, OpBitwiseXor, U32, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(BitwiseNot32, OpNot, U32, uint32_t)
|
||||
uint32_t EmitBitwiseAnd64(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitBitwiseAnd64(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
EMIT_NATIVE(BitReverse32, OpBitReverse, U32, uint32_t)
|
||||
EMIT_NATIVE(BitCount32, OpBitCount, U32, uint32_t)
|
||||
uint32_t EmitBitCount64(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFindILsb32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFindUMsb32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFindUMsb64(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitSMin32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitSMax32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitUMin32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitUMax32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitSMinTri32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitSMaxTri32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitUMinTri32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitUMaxTri32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitSMedTri32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitUMedTri32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitBitCount64(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitFindILsb32(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitFindUMsb32(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitFindUMsb64(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitSMin32(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitSMax32(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitUMin32(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitUMax32(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitSMinTri32(EmitterState& state, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitSMaxTri32(EmitterState& state, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitUMinTri32(EmitterState& state, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitUMaxTri32(EmitterState& state, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitSMedTri32(EmitterState& state, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitUMedTri32(EmitterState& state, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
EMIT_NATIVE(SLessThan32, OpSLessThan, U1, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(ULessThan32, OpULessThan, U1, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(IEqual32, OpIEqual, U1, uint32_t, uint32_t)
|
||||
@@ -97,11 +94,11 @@ EMIT_NATIVE(UGreaterThan32, OpUGreaterThan, U1, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(INotEqual32, OpINotEqual, U1, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(SGreaterThanEqual32, OpSGreaterThanEqual, U1, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(UGreaterThanEqual32, OpUGreaterThanEqual, U1, uint32_t, uint32_t)
|
||||
uint32_t EmitIEqual64(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitINotEqual64(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitULessThan64(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitSLessThan64(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitUGreaterThan64(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitIEqual64(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitINotEqual64(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitULessThan64(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitSLessThan64(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitUGreaterThan64(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
EMIT_NATIVE(LogicalOr, OpLogicalOr, U1, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(LogicalAnd, OpLogicalAnd, U1, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(LogicalXor, OpLogicalNotEqual, U1, uint32_t, uint32_t)
|
||||
@@ -118,31 +115,32 @@ EMIT_NATIVE(FPOrdLessThanEqual32, OpFOrdLessThanEqual, U1, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(FPUnordLessThanEqual32, OpFUnordLessThanEqual, U1, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(FPOrdGreaterThanEqual32, OpFOrdGreaterThanEqual, U1, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(FPUnordGreaterThanEqual32, OpFUnordGreaterThanEqual, U1, uint32_t, uint32_t)
|
||||
uint32_t EmitFPIsNan32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPCmpClass32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitFPIsNan32(EmitterState& state, uint32_t arg0);
|
||||
inline constexpr auto EmitFPCmpClass32 = EmitClassMaskF32;
|
||||
EMIT_NATIVE(FPAdd32, OpFAdd, F32, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(FPSub32, OpFSub, F32, uint32_t, uint32_t)
|
||||
EMIT_NATIVE(FPMul32, OpFMul, F32, uint32_t, uint32_t)
|
||||
uint32_t EmitFPFma32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitFPMin32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitFPMax32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitFPMinTri32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitFPMaxTri32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitFPMedTri32(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitFPRecip32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPRecipIFlag32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPRecipSqrt32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPSqrt(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPExp2(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPLog2(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPLdexp(ValueEmitContext& ctx, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitFPRoundEven32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPFloor32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPCeil32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPTrunc32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPFract32(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPSin(ValueEmitContext& ctx, uint32_t arg0);
|
||||
uint32_t EmitFPCos(ValueEmitContext& ctx, uint32_t arg0);
|
||||
inline constexpr auto EmitFPFma32 =
|
||||
EmitGlsl<GLSLstd450Fma, IR::Type::F32, uint32_t, uint32_t, uint32_t>;
|
||||
uint32_t EmitFPMin32(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitFPMax32(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
uint32_t EmitFPMinTri32(EmitterState& state, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitFPMaxTri32(EmitterState& state, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitFPMedTri32(EmitterState& state, uint32_t arg0, uint32_t arg1, uint32_t arg2);
|
||||
uint32_t EmitFPRecip32(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitFPRecipIFlag32(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitFPRecipSqrt32(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitFPSqrt(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitFPExp2(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitFPLog2(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitFPLdexp(EmitterState& state, uint32_t arg0, uint32_t arg1);
|
||||
inline constexpr auto EmitFPRoundEven32 = EmitGlsl<GLSLstd450RoundEven, IR::Type::F32, uint32_t>;
|
||||
inline constexpr auto EmitFPFloor32 = EmitGlsl<GLSLstd450Floor, IR::Type::F32, uint32_t>;
|
||||
inline constexpr auto EmitFPCeil32 = EmitGlsl<GLSLstd450Ceil, IR::Type::F32, uint32_t>;
|
||||
inline constexpr auto EmitFPTrunc32 = EmitGlsl<GLSLstd450Trunc, IR::Type::F32, uint32_t>;
|
||||
inline constexpr auto EmitFPFract32 = EmitGlsl<GLSLstd450Fract, IR::Type::F32, uint32_t>;
|
||||
uint32_t EmitFPSin(EmitterState& state, uint32_t arg0);
|
||||
uint32_t EmitFPCos(EmitterState& state, uint32_t arg0);
|
||||
#undef EMIT_NATIVE
|
||||
|
||||
uint32_t EmitIdentity(ValueEmitContext& ctx, uint32_t value);
|
||||
@@ -154,20 +152,20 @@ inline constexpr auto EmitWaitcnt = EmitVoid;
|
||||
inline constexpr auto EmitSendmsg = EmitVoid;
|
||||
inline constexpr auto EmitTtraceData = EmitVoid;
|
||||
inline constexpr auto EmitInstPrefetch = EmitVoid;
|
||||
void EmitBarrier(ValueEmitContext& ctx);
|
||||
void EmitBarrier(EmitterState& state);
|
||||
void EmitMeshAllocate(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitMeshDrawParameter(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitGetUserData(ValueEmitContext& ctx, IR::ScalarReg reg);
|
||||
uint32_t EmitGetUserData(EmitterState& state, IR::ScalarReg reg);
|
||||
uint32_t EmitGetBuiltin(ValueEmitContext& ctx, IR::Value kind, IR::Value index);
|
||||
uint32_t EmitUndefU1(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitUndefU1(EmitterState& state, const IR::Inst& inst);
|
||||
inline constexpr auto EmitUndefU8 = EmitUndefU1;
|
||||
inline constexpr auto EmitUndefU16 = EmitUndefU1;
|
||||
inline constexpr auto EmitUndefU32 = EmitUndefU1;
|
||||
inline constexpr auto EmitUndefU64 = EmitUndefU1;
|
||||
uint32_t EmitDppMoveU32(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitDppUpdateU32(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitWqmU64(ValueEmitContext& ctx, uint32_t value);
|
||||
uint32_t EmitLaneId(ValueEmitContext& ctx);
|
||||
uint32_t EmitWqmU64(EmitterState& state, uint32_t value);
|
||||
inline constexpr auto EmitLaneId = EmitSubgroupLocalInvocationId;
|
||||
uint32_t EmitBallot(ValueEmitContext& ctx, IR::Value predicate);
|
||||
uint32_t EmitReadFirstLane(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitReadLane(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
@@ -184,72 +182,79 @@ inline constexpr auto EmitGetScratchResource = EmitGetSrtResource;
|
||||
inline constexpr auto EmitGetImageResource = EmitGetSrtResource;
|
||||
inline constexpr auto EmitGetSamplerResource = EmitGetSrtResource;
|
||||
inline constexpr auto EmitMakeImageAddress = EmitGetSrtResource;
|
||||
void EmitMemory(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
inline constexpr auto EmitBpermuteU32 = EmitMemory;
|
||||
inline constexpr auto EmitReadConst = EmitMemory;
|
||||
inline constexpr auto EmitReadConstBuffer = EmitMemory;
|
||||
inline constexpr auto EmitLoadAddressU8 = EmitMemory;
|
||||
inline constexpr auto EmitLoadAddressU16 = EmitMemory;
|
||||
inline constexpr auto EmitLoadAddressU32 = EmitMemory;
|
||||
inline constexpr auto EmitStoreAddressU8 = EmitMemory;
|
||||
inline constexpr auto EmitStoreAddressU16 = EmitMemory;
|
||||
inline constexpr auto EmitStoreAddressU32 = EmitMemory;
|
||||
inline constexpr auto EmitLoadBufferU8 = EmitMemory;
|
||||
inline constexpr auto EmitLoadBufferU16 = EmitMemory;
|
||||
inline constexpr auto EmitLoadBufferU32 = EmitMemory;
|
||||
inline constexpr auto EmitLoadBufferU32x2 = EmitMemory;
|
||||
inline constexpr auto EmitLoadBufferU32x3 = EmitMemory;
|
||||
inline constexpr auto EmitLoadBufferU32x4 = EmitMemory;
|
||||
inline constexpr auto EmitStoreBufferU8 = EmitMemory;
|
||||
inline constexpr auto EmitStoreBufferU16 = EmitMemory;
|
||||
inline constexpr auto EmitStoreBufferU32 = EmitMemory;
|
||||
inline constexpr auto EmitStoreBufferU32x2 = EmitMemory;
|
||||
inline constexpr auto EmitStoreBufferU32x3 = EmitMemory;
|
||||
inline constexpr auto EmitStoreBufferU32x4 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicSwap32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicCmpSwap32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicSwap64 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicIAdd32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicISub32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicSMin32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicUMin32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicSMax32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicUMax32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicAnd32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicOr32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicOr64 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicXor32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicFMin32 = EmitMemory;
|
||||
inline constexpr auto EmitBufferAtomicFMax32 = EmitMemory;
|
||||
inline constexpr auto EmitLoadSharedU8 = EmitMemory;
|
||||
inline constexpr auto EmitLoadSharedU16 = EmitMemory;
|
||||
inline constexpr auto EmitLoadSharedU32 = EmitMemory;
|
||||
inline constexpr auto EmitLoadSharedU32x2 = EmitMemory;
|
||||
inline constexpr auto EmitLoadSharedU32x3 = EmitMemory;
|
||||
inline constexpr auto EmitLoadSharedU32x4 = EmitMemory;
|
||||
inline constexpr auto EmitWriteSharedU8 = EmitMemory;
|
||||
inline constexpr auto EmitWriteSharedU16 = EmitMemory;
|
||||
inline constexpr auto EmitWriteSharedU32 = EmitMemory;
|
||||
inline constexpr auto EmitWriteSharedU32x2 = EmitMemory;
|
||||
inline constexpr auto EmitWriteSharedU32x3 = EmitMemory;
|
||||
inline constexpr auto EmitWriteSharedU32x4 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicFMin32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicFMax32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicSwap32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicIAdd32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicISub32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicInc32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicDec32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicSMin32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicUMin32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicSMax32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicUMax32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicAnd32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicOr32 = EmitMemory;
|
||||
inline constexpr auto EmitSharedAtomicXor32 = EmitMemory;
|
||||
inline constexpr auto EmitDataAppend = EmitMemory;
|
||||
inline constexpr auto EmitDataConsume = EmitMemory;
|
||||
inline constexpr auto EmitSwizzleU32 = EmitMemory;
|
||||
void EmitLoadMemory(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
void EmitStoreMemory(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitAtomic32(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitBufferAtomic64(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitBufferFloatAtomic(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
void EmitSharedFloatAtomic(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitSharedIncDec(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitAppendConsume(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitBpermuteU32(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
uint32_t EmitReadConst(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
void EmitReadConstBuffer(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
inline constexpr auto EmitLoadAddressU8 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadAddressU16 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadAddressU32 = EmitLoadMemory;
|
||||
inline constexpr auto EmitStoreAddressU8 = EmitStoreMemory;
|
||||
inline constexpr auto EmitStoreAddressU16 = EmitStoreMemory;
|
||||
inline constexpr auto EmitStoreAddressU32 = EmitStoreMemory;
|
||||
inline constexpr auto EmitLoadBufferU8 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadBufferU16 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadBufferU32 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadBufferU32x2 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadBufferU32x3 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadBufferU32x4 = EmitLoadMemory;
|
||||
inline constexpr auto EmitStoreBufferU8 = EmitStoreMemory;
|
||||
inline constexpr auto EmitStoreBufferU16 = EmitStoreMemory;
|
||||
inline constexpr auto EmitStoreBufferU32 = EmitStoreMemory;
|
||||
inline constexpr auto EmitStoreBufferU32x2 = EmitStoreMemory;
|
||||
inline constexpr auto EmitStoreBufferU32x3 = EmitStoreMemory;
|
||||
inline constexpr auto EmitStoreBufferU32x4 = EmitStoreMemory;
|
||||
inline constexpr auto EmitBufferAtomicSwap32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicCmpSwap32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicSwap64 = EmitBufferAtomic64;
|
||||
inline constexpr auto EmitBufferAtomicIAdd32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicISub32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicSMin32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicUMin32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicSMax32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicUMax32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicAnd32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicOr32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicOr64 = EmitBufferAtomic64;
|
||||
inline constexpr auto EmitBufferAtomicXor32 = EmitAtomic32;
|
||||
inline constexpr auto EmitBufferAtomicFMin32 = EmitBufferFloatAtomic;
|
||||
inline constexpr auto EmitBufferAtomicFMax32 = EmitBufferFloatAtomic;
|
||||
inline constexpr auto EmitLoadSharedU8 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadSharedU16 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadSharedU32 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadSharedU32x2 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadSharedU32x3 = EmitLoadMemory;
|
||||
inline constexpr auto EmitLoadSharedU32x4 = EmitLoadMemory;
|
||||
inline constexpr auto EmitWriteSharedU8 = EmitStoreMemory;
|
||||
inline constexpr auto EmitWriteSharedU16 = EmitStoreMemory;
|
||||
inline constexpr auto EmitWriteSharedU32 = EmitStoreMemory;
|
||||
inline constexpr auto EmitWriteSharedU32x2 = EmitStoreMemory;
|
||||
inline constexpr auto EmitWriteSharedU32x3 = EmitStoreMemory;
|
||||
inline constexpr auto EmitWriteSharedU32x4 = EmitStoreMemory;
|
||||
inline constexpr auto EmitSharedAtomicFMin32 = EmitSharedFloatAtomic;
|
||||
inline constexpr auto EmitSharedAtomicFMax32 = EmitSharedFloatAtomic;
|
||||
inline constexpr auto EmitSharedAtomicSwap32 = EmitAtomic32;
|
||||
inline constexpr auto EmitSharedAtomicIAdd32 = EmitAtomic32;
|
||||
inline constexpr auto EmitSharedAtomicISub32 = EmitAtomic32;
|
||||
inline constexpr auto EmitSharedAtomicInc32 = EmitSharedIncDec;
|
||||
inline constexpr auto EmitSharedAtomicDec32 = EmitSharedIncDec;
|
||||
inline constexpr auto EmitSharedAtomicSMin32 = EmitAtomic32;
|
||||
inline constexpr auto EmitSharedAtomicUMin32 = EmitAtomic32;
|
||||
inline constexpr auto EmitSharedAtomicSMax32 = EmitAtomic32;
|
||||
inline constexpr auto EmitSharedAtomicUMax32 = EmitAtomic32;
|
||||
inline constexpr auto EmitSharedAtomicAnd32 = EmitAtomic32;
|
||||
inline constexpr auto EmitSharedAtomicOr32 = EmitAtomic32;
|
||||
inline constexpr auto EmitSharedAtomicXor32 = EmitAtomic32;
|
||||
inline constexpr auto EmitDataAppend = EmitAppendConsume;
|
||||
inline constexpr auto EmitDataConsume = EmitAppendConsume;
|
||||
uint32_t EmitSwizzleU32(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
void EmitImage(ValueEmitContext& ctx, const IR::Inst& inst);
|
||||
inline constexpr auto EmitImageQueryDimensions = EmitImage;
|
||||
inline constexpr auto EmitImageQueryLod = EmitImage;
|
||||
|
||||
Reference in New Issue
Block a user