shader_recompiler: remove legacy SPIR-V emitter

This commit is contained in:
nmzik
2026-08-17 14:35:28 +02:00
parent 24b40d4c03
commit 5970c4ef95
19 changed files with 1112 additions and 7171 deletions
@@ -599,28 +599,6 @@ struct F32Class {
uint32_t quiet_bits = 0;
};
struct CubeF32Values {
uint32_t x = 0;
uint32_t y = 0;
uint32_t z = 0;
uint32_t nx = 0;
uint32_t ny = 0;
uint32_t nz = 0;
uint32_t z_face = 0;
uint32_t y_face = 0;
uint32_t x_neg = 0;
uint32_t y_neg = 0;
uint32_t z_neg = 0;
};
struct F16Class {
uint32_t bits = 0;
uint32_t nan = 0;
uint32_t snan = 0;
uint32_t zero = 0;
uint32_t quiet_bits = 0;
};
uint32_t PixelParameterMappedLocation(const EmitterState& state, uint32_t attr);
uint32_t PixelParameterLocation(const EmitterState& state, uint32_t attr);
@@ -645,18 +623,8 @@ void SetError(std::string* error, const char* message);
void CollectRegister(std::vector<RegisterBinding>& registers, IR::Register reg);
IR::Operand MakeRegisterOperand(IR::RegisterFile file, uint32_t index);
IR::Register SccRegister();
IR::Operand SccOperand();
bool IsInactiveWave32ExecHigh(const EmitterState& state, IR::Register reg);
bool IsMaskRegisterFile(IR::RegisterFile file);
bool IsSccOperand(const IR::Operand& operand);
bool HasOutput(const std::vector<OutputBinding>& outputs, IR::StageOutputKind kind, uint32_t index);
void CopyProgramInputsAndOutputs(EmitterState& state, const IR::Program& program);
@@ -681,12 +649,8 @@ uint32_t PointerForRegister(const EmitterState& state, IR::Register reg);
uint32_t ConstantU32(EmitterState& state, uint32_t value);
void EmitStoreU32(EmitterState& state, const IR::Operand& dst, uint32_t value);
uint32_t EmitSubgroupLocalInvocationId(EmitterState& state);
uint32_t EmitLaneIndexActiveBool(EmitterState& state, uint32_t lane);
[[noreturn]] void ExitDescriptorBindingFailure(const EmitterState& state,
IR::DescriptorBindingKind kind, uint32_t resource,
const char* reason);
@@ -768,10 +732,6 @@ void AllocateRegisterVariables(EmitterState& state);
void AllocateDescriptorVariables(EmitterState& state);
bool SdwaSelectorOffsetWidth(uint32_t sel, uint32_t& offset, uint32_t& width);
uint32_t EmitSdwaExtractU32(EmitterState& state, const IR::Operand& operand, uint32_t value);
uint32_t EmitTrueBool(EmitterState& state);
DppTargetLane EmitDppQuadPermTargetLane(EmitterState& state, uint32_t subid, uint32_t control);
@@ -785,34 +745,10 @@ DppTargetLane EmitDppMirrorTargetLane(EmitterState& state, uint32_t subid, bool
DppTargetLane EmitDppTargetLane(EmitterState& state, uint32_t control);
uint32_t EmitDppValueU32(EmitterState& state, const IR::Operand& operand, uint32_t value);
uint32_t EmitValueLoad(EmitterState& state, const IR::Operand& operand);
uint32_t EmitRegisterLoad(EmitterState& state, IR::Register reg);
uint32_t WaveMaskHighLoad(EmitterState& state, IR::RegisterFile file);
uint32_t EmitLaneMaskPartU32(EmitterState& state, uint32_t part);
uint32_t EmitThreadMaskBelowPartU32(EmitterState& state, uint32_t part);
uint32_t EmitMaskActiveBool(EmitterState& state, IR::RegisterFile file);
uint32_t EmitMaskZeroBool(EmitterState& state, IR::RegisterFile file, bool zero);
uint32_t EmitMaskSummaryZeroBool(EmitterState& state, IR::RegisterFile file, bool zero);
uint32_t EmitExecActiveBool(EmitterState& state);
uint32_t EmitConditionBool(EmitterState& state, const IR::Operand& operand);
uint32_t EmitSubgroupLocalInvocationId(EmitterState& state);
uint32_t InputVariableForKind(const EmitterState& state, IR::StageInputKind kind);
uint32_t InputVariableForParameter(const EmitterState& state, uint32_t location);
const InputBinding* InputBindingForParameter(const EmitterState& state, uint32_t location);
uint32_t EmitVertexParameterComponentU32(EmitterState& state, const InputBinding& input,
@@ -822,141 +758,26 @@ uint32_t EmitInputComponentU32(EmitterState& state, IR::StageInputKind kind, uin
uint32_t EmitLocalInvocationIndex(EmitterState& state);
void EmitLoadInputF32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitSccBool(EmitterState& state, bool non_zero);
uint32_t EmitFloatLoad(EmitterState& state, const IR::Operand& operand);
uint32_t ApplyResultModifiersF32(EmitterState& state, uint32_t value, const IR::Operand& dst);
uint32_t EmitMixF32Load(EmitterState& state, const IR::Operand& operand);
IR::Operand OffsetRegisterOperand(const IR::Operand& operand, uint32_t offset);
uint32_t EmitLaneMaskOperandActiveBool(EmitterState& state, const IR::Operand& operand);
uint32_t EmitBallotLaneActiveBool(EmitterState& state, uint32_t ballot, uint32_t lane);
uint32_t EmitLaneIndexActiveBool(EmitterState& state, uint32_t lane);
uint32_t EmitSubgroupLaneActiveBool(EmitterState& state, uint32_t lane);
uint32_t EmitSequentialValueLoad(EmitterState& state, const IR::Operand& operand, uint32_t offset);
uint32_t EmitSequentialFloatLoad(EmitterState& state, const IR::Operand& operand, uint32_t offset);
uint32_t ImageAddressHalfComponent(const IR::Instruction& inst, uint32_t component);
IR::Operand ImageAddressOperand(const IR::Instruction& inst, const IR::Operand& base,
uint32_t component);
uint32_t EmitImageAddressValueLoad(EmitterState& state, const IR::Instruction& inst,
const IR::Operand& base, uint32_t component);
uint32_t EmitImageAddressFloatLoad(EmitterState& state, const IR::Instruction& inst,
const IR::Operand& base, uint32_t component);
uint32_t EmitZeroF32(EmitterState& state);
bool HasImageSampleFlag(const IR::Instruction& inst, uint32_t flag);
ImageSampleLayout MakeImageSampleLayout(const IR::Instruction& inst, ImageViewKind view);
uint32_t EmitImageCoordF32(EmitterState& state, const IR::Instruction& inst,
const ImageSampleLayout& layout, ImageViewKind view);
uint32_t EmitImageLodF32(EmitterState& state, const IR::Instruction& inst,
const ImageSampleLayout& layout);
uint32_t EmitImageDrefF32(EmitterState& state, const IR::Instruction& inst,
const ImageSampleLayout& layout);
uint32_t EmitImageBiasF32(EmitterState& state, const IR::Instruction& inst,
const ImageSampleLayout& layout);
uint32_t EmitImageGradientF32(EmitterState& state, const IR::Instruction& inst,
uint32_t first_component, ImageViewKind view);
uint32_t EmitImagePackedOffsetI32(EmitterState& state, const IR::Instruction& inst,
const ImageSampleLayout& layout, ImageViewKind view);
uint32_t EmitImageCoordU32(EmitterState& state, const IR::Instruction& inst,
ImageViewKind view = ImageViewKind::Dim2D);
uint32_t EmitImageLoadCoordU32(EmitterState& state, const IR::Instruction& inst,
ImageViewKind view);
uint32_t EmitImageMipLodU32(EmitterState& state, const IR::Instruction& inst,
const IR::Operand& address, ImageViewKind view);
uint32_t EmitImageQueryCoordF32(EmitterState& state, const IR::Instruction& inst,
ImageViewKind view);
uint32_t DmaskComponentIndex(uint32_t dmask, uint32_t component);
uint32_t EmitImageStoreComponentF32(EmitterState& state, const IR::Instruction& inst,
uint32_t component);
uint32_t EmitImageStoreTexelF32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitImageStoreTexelU32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitDppWriteActiveBool(EmitterState& state, const IR::Operand& dst);
uint32_t EmitSdwaDestinationMerge(EmitterState& state, uint32_t pointer, const IR::Operand& dst,
uint32_t value);
void EmitStoreU32(EmitterState& state, const IR::Operand& dst, uint32_t value);
uint32_t EmitAddU32(EmitterState& state, uint32_t lhs, uint32_t rhs);
uint32_t EmitBinaryU32(EmitterState& state, uint32_t opcode, uint32_t lhs, uint32_t rhs);
uint32_t EmitNotEqualZeroBool(EmitterState& state, uint32_t value);
uint32_t EmitSelectU32Value(EmitterState& state, uint32_t condition, uint32_t true_value,
uint32_t false_value);
uint32_t EmitShaderDataDwordLoad(EmitterState& state, uint32_t dword_index);
bool UserDataDwordIndex(const EmitterState& state, IR::Register reg, uint32_t& dword_index);
uint32_t EmitByteAddress(EmitterState& state, const IR::Instruction& inst, uint32_t first_src,
uint32_t src_count);
uint32_t StorageBufferPackedStride(const EmitterState& state, const IR::MemoryInfo& mem,
uint32_t use_pc);
Prospero::BufferFormat StorageBufferFormat(const EmitterState& state, const IR::MemoryInfo& mem,
uint32_t use_pc);
bool ShouldApplyBufferAddTid(const IR::Instruction& inst);
uint32_t EmitBufferIndexWithAddTid(EmitterState& state, const IR::Instruction& inst, uint32_t index,
uint32_t packed);
uint32_t EmitOptionalLogicalAndBool(EmitterState& state, uint32_t lhs, uint32_t rhs);
bool IsStorageBufferMemoryKind(IR::ResourceKind kind);
void EmitStorageBufferOffsets(EmitterState& state);
uint32_t EmitBufferAddressFromParts(EmitterState& state, const IR::Instruction& inst,
uint32_t index, uint32_t offset, uint32_t soffset);
uint32_t EmitBufferByteAddress(EmitterState& state, const IR::Instruction& inst, uint32_t first_src,
uint32_t src_count);
uint32_t EmitMemoryByteAddress(EmitterState& state, const IR::Instruction& inst,
const IR::MemoryInfo& mem, uint32_t first_src, uint32_t src_count);
uint32_t EmitDwordIndex(EmitterState& state, const IR::Instruction& inst, uint32_t first_src,
uint32_t src_count);
uint32_t EmitMemoryDwordIndex(EmitterState& state, const IR::Instruction& inst,
const IR::MemoryInfo& mem, uint32_t first_src, uint32_t src_count);
DescriptorResourceBinding StorageBufferBindingForMemory(EmitterState& state,
const IR::MemoryInfo& mem, uint32_t use_pc);
@@ -982,37 +803,6 @@ uint32_t EmitGdsElementPointer(EmitterState& state, uint32_t index);
uint32_t EmitMemoryElementPointer(EmitterState& state, const IR::MemoryInfo& mem, uint32_t index,
uint32_t use_pc);
uint32_t EmitMemoryLoadDwordValueU32(EmitterState& state, const IR::Instruction& inst,
IR::ResourceKind kind, uint32_t first_src, uint32_t src_count);
void EmitMemoryLoadU32(EmitterState& state, const IR::Instruction& inst, IR::ResourceKind kind,
uint32_t first_src, uint32_t src_count);
uint32_t EmitMemoryLoadSubDwordValueU32(EmitterState& state, const IR::Instruction& inst,
IR::ResourceKind kind, uint32_t first_src,
uint32_t src_count, uint32_t data_bits, bool sign_extend);
void EmitMemoryLoadSubDwordU32(EmitterState& state, const IR::Instruction& inst,
IR::ResourceKind kind, uint32_t first_src, uint32_t src_count,
uint32_t data_bits, bool sign_extend);
void EmitMemoryStoreU32(EmitterState& state, const IR::Instruction& inst, IR::ResourceKind kind,
uint32_t first_src, uint32_t src_count);
void EmitMemoryStoreSubDwordU32(EmitterState& state, const IR::Instruction& inst,
IR::ResourceKind kind, uint32_t first_src, uint32_t src_count,
uint32_t data_bits);
uint32_t AddressSourceCount(const IR::Instruction& inst, uint32_t first_src);
bool IsFormattedBufferComponent(const IR::Instruction& inst);
Prospero::BufferFormat FormattedBufferFormat(const EmitterState& state,
const IR::Instruction& inst);
IR::Instruction WithFormatComponentByteOffset(const IR::Instruction& inst,
Prospero::BufferFormat format);
uint32_t EmitTBufferBitcastF32ToU32(EmitterState& state, uint32_t value);
uint32_t EmitTBufferBitcastU32ToF32(EmitterState& state, uint32_t value);
@@ -1027,307 +817,37 @@ uint32_t EmitTBufferSelectF32(EmitterState& state, uint32_t condition, uint32_t
bool IsSignedFormatComponent(Format::ComponentType type);
uint32_t EmitExtractFormatFieldU32(EmitterState& state, uint32_t raw_word, uint32_t offset,
uint32_t bits, bool sign_extend);
uint32_t EmitHalfToF32Bits(EmitterState& state, uint32_t raw);
uint32_t EmitUFloatToF32Bits(EmitterState& state, uint32_t raw, uint32_t bits);
uint32_t EmitFormatRawComponent(EmitterState& state, const IR::Instruction& inst,
const Format::BufferFormatInfo& info);
uint32_t NormalizeFormatComponent(EmitterState& state, const Format::BufferFormatInfo& info,
uint32_t component, uint32_t raw);
uint32_t UnpackTBufferFormat(EmitterState& state, const IR::Instruction& inst,
const Format::BufferFormatInfo& info);
uint32_t FormattedBufferDwordStoreComponentCount(Prospero::BufferFormat format,
uint32_t opcode_components);
bool EmitBufferIntegerFormatStore(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitAtomicPointer(EmitterState& state, const IR::Instruction& inst);
void EmitDeviceAtomicMemoryBarrier(EmitterState& state);
void EmitAtomicU32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitAtomicFMinF32(EmitterState& state, const IR::Instruction& inst);
void EmitAtomicFMaxF32(EmitterState& state, const IR::Instruction& inst);
void EmitSLoadDword(EmitterState& state, const IR::Instruction& inst);
void EmitLoadSrtDword(EmitterState& state, const IR::Instruction& inst);
void EmitBufferLoadUbyte(EmitterState& state, const IR::Instruction& inst);
void EmitBufferLoadSbyte(EmitterState& state, const IR::Instruction& inst);
void EmitBufferLoadUshort(EmitterState& state, const IR::Instruction& inst);
void EmitBufferLoadSshort(EmitterState& state, const IR::Instruction& inst);
void EmitBufferLoadDword(EmitterState& state, const IR::Instruction& inst);
void EmitBufferLoadDwordGroup(EmitterState& state, const IR::Instruction* instructions,
uint32_t count);
void EmitBufferStoreDword(EmitterState& state, const IR::Instruction& inst);
void EmitFlatLoadUbyte(EmitterState& state, const IR::Instruction& inst);
void EmitFlatLoadSbyte(EmitterState& state, const IR::Instruction& inst);
void EmitFlatLoadUshort(EmitterState& state, const IR::Instruction& inst);
void EmitFlatLoadSshort(EmitterState& state, const IR::Instruction& inst);
void EmitFlatLoadDword(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitDsAddtidDwordIndex(EmitterState& state, const IR::Instruction& inst,
uint32_t m0_src_index);
void EmitDsWriteAddtidB32(EmitterState& state, const IR::Instruction& inst);
void EmitDsReadAddtidB32(EmitterState& state, const IR::Instruction& inst);
void EmitDsAppendConsume(EmitterState& state, const IR::Instruction& inst, uint32_t atomic_opcode);
void EmitDsFloatMinMaxF32(EmitterState& state, const IR::Instruction& inst, bool max_value);
uint32_t EmitDsSwizzleTargetLane(EmitterState& state, uint32_t subid, uint32_t control);
void EmitDsSwizzleB32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitImageGetResinfoComponent(EmitterState& state, uint32_t image, uint32_t size,
uint32_t component_index);
void EmitImageGetResinfo(EmitterState& state, const IR::Instruction& inst);
void EmitImageGetLod(EmitterState& state, const IR::Instruction& inst);
void EmitImageLoad(EmitterState& state, const IR::Instruction& inst);
void EmitImageStore(EmitterState& state, const IR::Instruction& inst);
void EmitImageSampleResult(EmitterState& state, const IR::Instruction& inst, uint32_t sample,
bool dref);
bool ImageSampleNeedsExplicitLod(const EmitterState& state, const IR::Instruction& inst);
void AddImageSampleOperands(EmitterState& state, const IR::Instruction& inst,
const ImageSampleLayout& layout, bool explicit_lod,
std::vector<uint32_t>& words);
uint32_t ImageSampleOpcode(const EmitterState& state, const IR::Instruction& inst);
void EmitImageSample(EmitterState& state, const IR::Instruction& inst);
uint32_t ImageGatherComponent(uint32_t dmask);
void EmitImageGather4(EmitterState& state, const IR::Instruction& inst);
void EmitMoveU32(EmitterState& state, const IR::Instruction& inst);
void EmitMoveF32Bits(EmitterState& state, const IR::Instruction& inst);
uint32_t MoveRelRegisterLimit(const EmitterState& state, IR::Register base);
void EmitMoveRelSourceU32(EmitterState& state, const IR::Instruction& inst);
void EmitMoveRelDestU32(EmitterState& state, const IR::Instruction& inst);
void EmitMoveU64(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitWqmLaneU32(EmitterState& state, uint32_t src);
void EmitWqmB64(EmitterState& state, const IR::Instruction& inst);
void EmitSaveexecB32(EmitterState& state, const IR::Instruction& inst);
void EmitSaveexecB64(EmitterState& state, const IR::Instruction& inst);
void EmitReadFirstLaneU32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitLaneIndex(EmitterState& state, const IR::Operand& operand);
void EmitReadLaneU32(EmitterState& state, const IR::Instruction& inst);
void EmitWriteLaneU32(EmitterState& state, const IR::Instruction& inst);
void EmitPermlaneB32(EmitterState& state, const IR::Instruction& inst, bool x16);
void EmitControlNop(EmitterState& state, const IR::Instruction& inst);
void EmitWaitcnt(EmitterState& state, const IR::Instruction& inst);
void EmitBarrier(EmitterState& state, const IR::Instruction& inst);
void EmitAbsI32(EmitterState& state, const IR::Instruction& inst);
void EmitUnaryU32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitUnaryU64(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitFindLsbU32(EmitterState& state, const IR::Instruction& inst);
void EmitFindMsbFromHighU32(EmitterState& state, const IR::Instruction& inst);
void EmitFindMsbFromHighU64(EmitterState& state, const IR::Instruction& inst);
void EmitBitCountU64(EmitterState& state, const IR::Instruction& inst);
void EmitBitCountU32(EmitterState& state, const IR::Instruction& inst);
void EmitBitCountAddU32(EmitterState& state, const IR::Instruction& inst);
void EmitBinaryU32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitBinaryNotRhsU32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitBinaryThenNotU32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitMaskedBitCountU32(EmitterState& state, const IR::Instruction& inst, uint32_t exec_index);
uint32_t EmitMask5U32(EmitterState& state, uint32_t value);
void EmitChainedBinaryU32(EmitterState& state, const IR::Instruction& inst, uint32_t first_op,
uint32_t second_op, bool mask_first_rhs = false,
bool mask_second_rhs = false);
void EmitBinaryU64(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitBinaryNotRhsU64(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitBinaryThenNotU64(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitSelectU64(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitSelectValueU32(EmitterState& state, uint32_t cond, uint32_t true_value,
uint32_t false_value);
void EmitStoreSccBool(EmitterState& state, uint32_t cond);
uint32_t EmitAndConstant(EmitterState& state, uint32_t value, uint32_t mask);
void EmitShiftLeftLogicalU64Values(EmitterState& state, uint32_t low, uint32_t high, uint32_t shift,
uint32_t& out_low, uint32_t& out_high);
void EmitShiftLeftLogicalU64(EmitterState& state, const IR::Instruction& inst);
void EmitShiftRightLogicalU64Values(EmitterState& state, uint32_t low, uint32_t high,
uint32_t shift, uint32_t& out_low, uint32_t& out_high);
void EmitShiftRightLogicalU64(EmitterState& state, const IR::Instruction& inst);
void EmitAdd3U32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitAndConstant(EmitterState& state, uint32_t value, uint32_t mask);
void EmitShiftU32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
uint32_t EmitU16LaneBits(EmitterState& state, const IR::Operand& operand, bool high_lane,
bool sign_extend = false);
void EmitShiftU16(EmitterState& state, const IR::Instruction& inst, uint32_t opcode,
bool arithmetic);
void EmitBinaryU16(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitMinMaxU16(EmitterState& state, const IR::Instruction& inst, bool signed_value,
bool max_value);
uint32_t EmitXorConstant(EmitterState& state, uint32_t value, uint32_t mask);
AddCarryResult EmitAddCarryValues(EmitterState& state, uint32_t lhs, uint32_t rhs,
uint32_t carry_in);
void EmitLaneMaskPairFromBool(EmitterState& state, const IR::Operand& dst, uint32_t value_bool);
void EmitPerInvocationMask(EmitterState& state, const IR::Operand& dst, uint32_t value_bool);
void EmitIAddCarryU32(EmitterState& state, const IR::Instruction& inst);
void EmitISubBorrowU32(EmitterState& state, const IR::Instruction& inst);
void EmitScalarAddCarryU32(EmitterState& state, const IR::Instruction& inst);
void EmitScalarSubBorrowU32(EmitterState& state, const IR::Instruction& inst);
void EmitScalarSubBorrowCarryU32(EmitterState& state, const IR::Instruction& inst);
void EmitBitClearU32(EmitterState& state, const IR::Instruction& inst);
void EmitBitSetU32(EmitterState& state, const IR::Instruction& inst);
void EmitUMadU64U32(EmitterState& state, const IR::Instruction& inst);
void EmitScalarSignedOverflowI32(EmitterState& state, const IR::Instruction& inst, bool subtract);
void EmitScalarShiftLeftAddCarryU32(EmitterState& state, const IR::Instruction& inst);
void EmitMulU24U32(EmitterState& state, const IR::Instruction& inst);
void EmitMulI24U32(EmitterState& state, const IR::Instruction& inst);
void EmitMulHighU32(EmitterState& state, const IR::Instruction& inst);
void EmitMulHighI32(EmitterState& state, const IR::Instruction& inst);
void EmitMadU32U24(EmitterState& state, const IR::Instruction& inst);
void EmitMadI32I24(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitShiftLeftConstant(EmitterState& state, uint32_t value, uint32_t shift);
uint32_t EmitShiftRightConstant(EmitterState& state, uint32_t value, uint32_t shift);
uint32_t EmitOrU32(EmitterState& state, uint32_t lhs, uint32_t rhs);
uint32_t EmitBitReplicateHalfU32(EmitterState& state, uint32_t value);
void EmitBitReplicateB64B32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitBitFieldExtractConstant(EmitterState& state, uint32_t value, uint32_t offset,
uint32_t count);
uint32_t EmitRightAlignedMaskU32(EmitterState& state, uint32_t count);
void EmitBitFieldMaskU32(EmitterState& state, const IR::Instruction& inst);
void EmitRightAlignedMaskU64(EmitterState& state, uint32_t count, uint32_t& out_low,
uint32_t& out_high);
void EmitBitFieldMaskU64(EmitterState& state, const IR::Instruction& inst);
void EmitBitFieldExtractU64(EmitterState& state, const IR::Instruction& inst);
void EmitBitFieldExtractU32(EmitterState& state, const IR::Instruction& inst);
void EmitBitFieldExtract3U32(EmitterState& state, const IR::Instruction& inst, bool signed_value);
void EmitBitFieldInsertSelectU32(EmitterState& state, const IR::Instruction& inst);
void EmitAlignBitU32(EmitterState& state, const IR::Instruction& inst);
void EmitSelectU32(EmitterState& state, const IR::Instruction& inst);
void EmitSelectMaskU32(EmitterState& state, const IR::Instruction& inst);
void EmitSelectF32Bits(EmitterState& state, const IR::Instruction& inst);
void EmitSelectMaskF32Bits(EmitterState& state, const IR::Instruction& inst);
void EmitPackU16(EmitterState& state, const IR::Instruction& inst, bool high_src0, bool high_src1);
void EmitPackU8F32(EmitterState& state, const IR::Instruction& inst);
void EmitBinaryF32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitLdexpF32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitCompareU32Constant(EmitterState& state, uint32_t opcode, uint32_t value,
uint32_t constant);
@@ -1335,25 +855,10 @@ uint32_t EmitSubConstantMinusU32(EmitterState& state, uint32_t constant, uint32_
uint32_t EmitF32ToF16RtzBits(EmitterState& state, uint32_t f32);
void EmitPackF32ToF16Rtz(EmitterState& state, const IR::Instruction& inst);
void EmitPackNormalizedF32(EmitterState& state, const IR::Instruction& inst, uint32_t ext_inst);
uint32_t EmitMinMaxU32Value(EmitterState& state, uint32_t lhs, uint32_t rhs, bool max_value);
void EmitMinMaxU32(EmitterState& state, const IR::Instruction& inst, bool max_value);
void EmitSadU32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitMinMaxI32Value(EmitterState& state, uint32_t lhs, uint32_t rhs, bool max_value);
void EmitMinMaxI32(EmitterState& state, const IR::Instruction& inst, bool max_value);
void EmitMinMax3U32(EmitterState& state, const IR::Instruction& inst, bool signed_value,
bool max_value);
void EmitMed3U32(EmitterState& state, const IR::Instruction& inst, bool signed_value);
uint32_t EmitBitcastF32ToU32(EmitterState& state, uint32_t value);
uint32_t EmitBitcastU32ToF32(EmitterState& state, uint32_t value);
@@ -1375,181 +880,18 @@ uint32_t EmitClassMaskF32(EmitterState& state, uint32_t value, uint32_t mask);
uint32_t EmitMinMaxF32Value(EmitterState& state, uint32_t lhs, uint32_t rhs, bool max_value);
void EmitMinMaxF32(EmitterState& state, const IR::Instruction& inst, bool max_value);
void EmitCompareResult(EmitterState& state, const IR::Operand& dst, uint32_t cond);
void EmitCompareU32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitCompareU16(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitCompareI16(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitBitCompareB32(EmitterState& state, const IR::Instruction& inst, bool bit_set);
void EmitCompareU64(EmitterState& state, const IR::Instruction& inst);
void EmitCompareConstant(EmitterState& state, const IR::Instruction& inst, bool value);
void EmitCompareMaskU32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitCompareF32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitCompareOrderedF32(EmitterState& state, const IR::Instruction& inst, bool ordered);
void EmitCompareClassF32(EmitterState& state, const IR::Instruction& inst);
void EmitCompareMaskF32(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitConvertU32ToF32(EmitterState& state, const IR::Instruction& inst);
void EmitConvertI32ToF32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitTruncF32Value(EmitterState& state, uint32_t value);
void EmitConvertF32ToU32(EmitterState& state, const IR::Instruction& inst);
void EmitConvertF32ToI32(EmitterState& state, const IR::Instruction& inst);
void EmitConvertF32ToF16(EmitterState& state, const IR::Instruction& inst);
void EmitConvertF16ToF32(EmitterState& state, const IR::Instruction& inst);
void EmitConvertU16ToF16(EmitterState& state, const IR::Instruction& inst);
void EmitConvertF16ToU16(EmitterState& state, const IR::Instruction& inst);
void EmitConvertI16ToF16(EmitterState& state, const IR::Instruction& inst);
void EmitConvertF16ToI16(EmitterState& state, const IR::Instruction& inst);
void EmitConvertRoundPlusInfF32ToI32(EmitterState& state, const IR::Instruction& inst);
void EmitConvertFloorF32ToI32(EmitterState& state, const IR::Instruction& inst);
void EmitConvertI4ToOffsetF32(EmitterState& state, const IR::Instruction& inst);
void EmitConvertByteU32ToF32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitFlushF32DenormToSignedZero(EmitterState& state, uint32_t value);
void EmitRcpF32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitTrigCycleF32(EmitterState& state, uint32_t src, bool preserve_signed_zero);
void EmitFloatExtInst(EmitterState& state, const IR::Instruction& inst, uint32_t ext_inst,
bool scale_by_two_pi = false, bool flush_denorm = false);
void EmitMadF32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitFNegateValue(EmitterState& state, uint32_t value);
uint32_t EmitFAbsValue(EmitterState& state, uint32_t value);
uint32_t EmitFCompareValue(EmitterState& state, uint32_t opcode, uint32_t lhs, uint32_t rhs);
uint32_t EmitLogicalAndValue(EmitterState& state, uint32_t lhs, uint32_t rhs);
uint32_t EmitFSelectValue(EmitterState& state, uint32_t cond, uint32_t true_value,
uint32_t false_value);
uint32_t EmitFMulConstant(EmitterState& state, uint32_t value, uint32_t bits);
CubeF32Values EmitCubeF32Values(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitCubeIdF32(EmitterState& state, const CubeF32Values& cube);
uint32_t EmitCubeScF32(EmitterState& state, const CubeF32Values& cube);
uint32_t EmitCubeTcF32(EmitterState& state, const CubeF32Values& cube);
uint32_t EmitCubeMaF32(EmitterState& state, const CubeF32Values& cube);
void EmitCubeF32(EmitterState& state, const IR::Instruction& inst);
void EmitDot2AccF32F16(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitPackedF16Lane(EmitterState& state, const IR::Operand& operand, bool high_lane);
void EmitCompareF16(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
uint32_t EmitPackedF16LaneBits(EmitterState& state, const IR::Operand& operand, bool high_lane);
uint32_t EmitF16BitsToF32(EmitterState& state, uint32_t bits);
uint32_t EmitPackLowF32ToF16Bits(EmitterState& state, uint32_t value);
void EmitPackB32F16(EmitterState& state, const IR::Instruction& inst);
F16Class EmitClassifyF16Bits(EmitterState& state, uint32_t value);
uint32_t EmitNegativeNumericF16Bool(EmitterState& state, const F16Class& cls);
uint32_t EmitRcpF16Bits(EmitterState& state, uint32_t bits);
uint32_t EmitSqrtF16Bits(EmitterState& state, uint32_t bits);
uint32_t EmitRsqF16Bits(EmitterState& state, uint32_t bits);
uint32_t EmitLog2F16Bits(EmitterState& state, uint32_t bits);
uint32_t EmitExp2F16Bits(EmitterState& state, uint32_t bits);
void EmitSpecialF16(EmitterState& state, const IR::Instruction& inst);
void EmitBinaryF16(EmitterState& state, const IR::Instruction& inst, uint32_t opcode);
void EmitFmaF16(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitMinMaxF16Bits(EmitterState& state, uint32_t lhs, uint32_t rhs, bool max_value);
void EmitMinMaxF16(EmitterState& state, const IR::Instruction& inst, bool max_value);
uint32_t EmitMinMax3F16Bits(EmitterState& state, uint32_t src0, uint32_t src1, uint32_t src2,
bool max_value);
void EmitMinMax3F16(EmitterState& state, const IR::Instruction& inst, bool max_value);
uint32_t EmitF16BitsEqualBool(EmitterState& state, uint32_t lhs, uint32_t rhs);
uint32_t EmitAnyNanF16Bool(EmitterState& state, uint32_t src0, uint32_t src1, uint32_t src2);
void EmitMed3F16(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitPackedMinMaxF16(EmitterState& state, const IR::Instruction& inst, bool max_value);
uint32_t EmitPackedF16BinaryLane(EmitterState& state, const IR::Instruction& inst, bool high_lane,
uint32_t opcode);
uint32_t EmitPackedF16FmaLane(EmitterState& state, const IR::Instruction& inst, bool high_lane);
void EmitPackedF16(EmitterState& state, const IR::Instruction& inst);
void EmitPackedInteger16(EmitterState& state, const IR::Instruction& inst);
void EmitMadMixF16(EmitterState& state, const IR::Instruction& inst);
void EmitMinMax3F32(EmitterState& state, const IR::Instruction& inst, bool max_value);
void EmitMed3F32(EmitterState& state, const IR::Instruction& inst);
uint32_t EmitExportComponentF32(EmitterState& state, const IR::Instruction& inst,
uint32_t component);
uint32_t EmitExportVec4F32(EmitterState& state, const IR::Instruction& inst);
bool ExportWritesData(const IR::Instruction& inst);
void EmitExport(EmitterState& state, const IR::Instruction& inst);
bool ExportUsesPixelValidMask(const EmitterState& state, const IR::Instruction& inst);
void EmitKillIfBoolFalse(EmitterState& state, uint32_t active);
void EmitUpdatePixelValidMask(EmitterState& state);
void EmitKillIfPixelValidMaskInactive(EmitterState& state);
uint32_t InitialRegisterValue(const EmitterState& state, IR::Register reg);
bool EmitValueAlu(ValueEmitContext& ctx, const IR::Inst& inst);
@@ -1613,19 +955,6 @@ uint32_t EmitValueOrZeroIfCondition(EmitterState& state, uint32_t condition, Fn&
std::forward<Fn>(fn));
}
template <typename Fn>
void EmitGuardedByExec(EmitterState& state, Fn&& fn) {
const auto then_label = state.builder.AllocateId();
const auto merge_label = state.builder.AllocateId();
const auto condition = EmitExecActiveBool(state);
state.builder.AddFunction({OpSelectionMerge, merge_label, SelectionControlNone});
state.builder.AddFunction({OpBranchConditional, condition, then_label, merge_label});
state.builder.AddFunction({OpLabel, then_label});
fn();
state.builder.AddFunction({OpBranch, merge_label});
state.builder.AddFunction({OpLabel, merge_label});
}
} // namespace Libs::Graphics::ShaderRecompiler::Spirv::Emitter
#endif /* EMULATOR_INCLUDE_EMULATOR_GRAPHICS_SHADER_RECOMPILER_SPIRVEMITTER_INTERNAL_H_ */