mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-12 12:45:56 +00:00
* Import memory * 64K pages and fix memory mapping * Queue coverage * Buffer syncing, faulted readback adn BDA in Buffer * Base DMA implementation * Preparations for implementing SPV DMA access * Base impl (pending 16K pages and getbuffersize) * 16K pages and stack overflow fix * clang-format * clang-format but for real this time * Try to fix macOS build * Correct decltype * Add testing log * Fix stride and patch phi node blocks * No need to check if it is a deleted buffer * Clang format once more * Offset in bytes * Removed host buffers (may do it in another PR) Also some random barrier fixes * Add IR dumping from my read-const branch * clang-format * Correct size insteed of end * Fix incorrect assert * Possible fix for NieR deadlock * Copy to avoid deadlock * Use 2 mutexes insteed of copy * Attempt to range sync error * Revert "Attempt to range sync error" This reverts commit dd287b48682b50f215680bb0956e39c2809bf3fe. * Fix size truncated when syncing range And memory barrier * Some fixes (and async testing (doesn't work)) * Use compute to parse fault buffer * Process faults on submit * Only sync in the first time we see a readconst Thsi is partialy wrong. We need to save the state into the submission context itself, not the rasterizer since we can yield and process another sumission (if im not understanding wrong). * Use spec const and 32 bit atomic * 32 bit counter * Fix store_index * Better sync (WIP, breaks PR now) * Fixes for better sync * Better sync * Remove memory coveragte logic * Point sirit to upstream * Less waiting and barriers * Correctly checkout moltenvk * Bring back applying pending operations in wait * Sync the whole buffer insteed of only the range * Implement recursive shared/scoped locks * Iterators * Faster syncing with ranges * Some alignment fixes * fixed clang format * Fix clang-format again * Port page_manager from readbacks-poc * clang-format * Defer memory protect * Remove RENDERER_TRACE * Experiment: only sync on first readconst * Added profiling (will be removed) * Don't sync entire buffers * Added logging for testing * Updated temporary workaround to use 4k pages * clang.-format * Cleanup part 1 * Make ReadConst a SPIR-V function --------- Co-authored-by: georgemoralis <giorgosmrls@gmail.com>
506 lines
29 KiB
C++
506 lines
29 KiB
C++
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <sirit/sirit.h>
|
|
#include "common/types.h"
|
|
|
|
namespace Shader::IR {
|
|
enum class Attribute : u64;
|
|
enum class ScalarReg : u32;
|
|
enum class Patch : u64;
|
|
class Inst;
|
|
class Value;
|
|
} // namespace Shader::IR
|
|
|
|
namespace Shader::Backend::SPIRV {
|
|
|
|
using Sirit::Id;
|
|
|
|
class EmitContext;
|
|
|
|
// Microinstruction emitters
|
|
Id EmitPhi(EmitContext& ctx, IR::Inst* inst);
|
|
void EmitVoid(EmitContext& ctx);
|
|
Id EmitIdentity(EmitContext& ctx, const IR::Value& value);
|
|
Id EmitConditionRef(EmitContext& ctx, const IR::Value& value);
|
|
void EmitReference(EmitContext&);
|
|
void EmitPhiMove(EmitContext&);
|
|
void EmitJoin(EmitContext& ctx);
|
|
void EmitGetScc(EmitContext& ctx);
|
|
void EmitGetExec(EmitContext& ctx);
|
|
void EmitGetVcc(EmitContext& ctx);
|
|
void EmitGetSccLo(EmitContext& ctx);
|
|
void EmitGetVccLo(EmitContext& ctx);
|
|
void EmitGetVccHi(EmitContext& ctx);
|
|
void EmitGetM0(EmitContext& ctx);
|
|
void EmitSetScc(EmitContext& ctx);
|
|
void EmitSetExec(EmitContext& ctx);
|
|
void EmitSetVcc(EmitContext& ctx);
|
|
void EmitSetSccLo(EmitContext& ctx);
|
|
void EmitSetVccLo(EmitContext& ctx);
|
|
void EmitSetVccHi(EmitContext& ctx);
|
|
void EmitSetM0(EmitContext& ctx);
|
|
void EmitFPCmpClass32(EmitContext& ctx);
|
|
void EmitPrologue(EmitContext& ctx);
|
|
void EmitEpilogue(EmitContext& ctx);
|
|
void EmitDiscard(EmitContext& ctx);
|
|
void EmitDiscardCond(EmitContext& ctx, Id condition);
|
|
void EmitDebugPrint(EmitContext& ctx, IR::Inst* inst, Id arg0, Id arg1, Id arg2, Id arg3, Id arg4);
|
|
void EmitBarrier(EmitContext& ctx);
|
|
void EmitWorkgroupMemoryBarrier(EmitContext& ctx);
|
|
void EmitDeviceMemoryBarrier(EmitContext& ctx);
|
|
Id EmitGetUserData(EmitContext& ctx, IR::ScalarReg reg);
|
|
void EmitGetThreadBitScalarReg(EmitContext& ctx);
|
|
void EmitSetThreadBitScalarReg(EmitContext& ctx);
|
|
void EmitGetScalarRegister(EmitContext& ctx);
|
|
void EmitSetScalarRegister(EmitContext& ctx);
|
|
void EmitGetVectorRegister(EmitContext& ctx);
|
|
void EmitSetVectorRegister(EmitContext& ctx);
|
|
void EmitSetGotoVariable(EmitContext& ctx);
|
|
void EmitGetGotoVariable(EmitContext& ctx);
|
|
void EmitSetScc(EmitContext& ctx);
|
|
Id EmitReadConst(EmitContext& ctx, IR::Inst* inst, Id addr, Id offset);
|
|
Id EmitReadConstBuffer(EmitContext& ctx, u32 handle, Id index);
|
|
Id EmitLoadBufferU8(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
Id EmitLoadBufferU16(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
Id EmitLoadBufferU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
Id EmitLoadBufferU32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
Id EmitLoadBufferU32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
Id EmitLoadBufferU32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
Id EmitLoadBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
Id EmitLoadBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
Id EmitLoadBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
Id EmitLoadBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
Id EmitLoadBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address);
|
|
void EmitStoreBufferU8(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
void EmitStoreBufferU16(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
void EmitStoreBufferU32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
void EmitStoreBufferU32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
void EmitStoreBufferU32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
void EmitStoreBufferU32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
void EmitStoreBufferF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
void EmitStoreBufferF32x2(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
void EmitStoreBufferF32x3(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
void EmitStoreBufferF32x4(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
void EmitStoreBufferFormatF32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicIAdd32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicSMin32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicUMin32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicSMax32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicUMax32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicInc32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicDec32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicAnd32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicOr32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicXor32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitBufferAtomicSwap32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address, Id value);
|
|
Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, u32 comp, Id index);
|
|
Id EmitGetAttributeU32(EmitContext& ctx, IR::Attribute attr, u32 comp);
|
|
void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, u32 comp);
|
|
Id EmitGetTessGenericAttribute(EmitContext& ctx, Id vertex_index, Id attr_index, Id comp_index);
|
|
void EmitSetTcsGenericAttribute(EmitContext& ctx, Id value, Id attr_index, Id comp_index);
|
|
Id EmitReadTcsGenericOuputAttribute(EmitContext& ctx, Id vertex_index, Id attr_index,
|
|
Id comp_index);
|
|
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);
|
|
Id EmitWorkgroupId(EmitContext& ctx);
|
|
Id EmitLocalInvocationId(EmitContext& ctx);
|
|
Id EmitInvocationId(EmitContext& ctx);
|
|
Id EmitInvocationInfo(EmitContext& ctx);
|
|
Id EmitSampleId(EmitContext& ctx);
|
|
Id EmitUndefU1(EmitContext& ctx);
|
|
Id EmitUndefU8(EmitContext& ctx);
|
|
Id EmitUndefU16(EmitContext& ctx);
|
|
Id EmitUndefU32(EmitContext& ctx);
|
|
Id EmitUndefU64(EmitContext& ctx);
|
|
Id EmitLoadSharedU32(EmitContext& ctx, Id offset);
|
|
Id EmitLoadSharedU64(EmitContext& ctx, Id offset);
|
|
void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value);
|
|
void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value);
|
|
Id EmitSharedAtomicIAdd32(EmitContext& ctx, Id offset, Id value);
|
|
Id EmitSharedAtomicUMax32(EmitContext& ctx, Id offset, Id value);
|
|
Id EmitSharedAtomicSMax32(EmitContext& ctx, Id offset, Id value);
|
|
Id EmitSharedAtomicUMin32(EmitContext& ctx, Id offset, Id value);
|
|
Id EmitSharedAtomicSMin32(EmitContext& ctx, Id offset, Id value);
|
|
Id EmitSharedAtomicAnd32(EmitContext& ctx, Id offset, Id value);
|
|
Id EmitSharedAtomicOr32(EmitContext& ctx, Id offset, Id value);
|
|
Id EmitSharedAtomicXor32(EmitContext& ctx, Id offset, Id value);
|
|
Id EmitSharedAtomicIIncrement32(EmitContext& ctx, Id offset);
|
|
Id EmitSharedAtomicIDecrement32(EmitContext& ctx, Id offset);
|
|
Id EmitSharedAtomicISub32(EmitContext& ctx, Id offset, Id value);
|
|
|
|
Id EmitCompositeConstructU32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2);
|
|
Id EmitCompositeConstructU32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3);
|
|
Id EmitCompositeConstructU32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4);
|
|
Id EmitCompositeConstructU32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2);
|
|
Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index);
|
|
Id EmitCompositeExtractU32x3(EmitContext& ctx, Id composite, u32 index);
|
|
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 EmitCompositeShuffleU32x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1);
|
|
Id EmitCompositeShuffleU32x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
|
|
u32 comp2);
|
|
Id EmitCompositeShuffleU32x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
|
|
u32 comp2, u32 comp3);
|
|
Id EmitCompositeConstructF16x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2);
|
|
Id EmitCompositeConstructF16x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3);
|
|
Id EmitCompositeConstructF16x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4);
|
|
Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index);
|
|
Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index);
|
|
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 EmitCompositeShuffleF16x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1);
|
|
Id EmitCompositeShuffleF16x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
|
|
u32 comp2);
|
|
Id EmitCompositeShuffleF16x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
|
|
u32 comp2, u32 comp3);
|
|
Id EmitCompositeConstructF32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2);
|
|
Id EmitCompositeConstructF32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3);
|
|
Id EmitCompositeConstructF32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4);
|
|
Id EmitCompositeConstructF32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2);
|
|
Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index);
|
|
Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index);
|
|
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 EmitCompositeShuffleF32x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1);
|
|
Id EmitCompositeShuffleF32x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
|
|
u32 comp2);
|
|
Id EmitCompositeShuffleF32x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
|
|
u32 comp2, u32 comp3);
|
|
void EmitCompositeConstructF64x2(EmitContext& ctx);
|
|
void EmitCompositeConstructF64x3(EmitContext& ctx);
|
|
void EmitCompositeConstructF64x4(EmitContext& ctx);
|
|
void EmitCompositeExtractF64x2(EmitContext& ctx);
|
|
void EmitCompositeExtractF64x3(EmitContext& ctx);
|
|
void EmitCompositeExtractF64x4(EmitContext& ctx);
|
|
Id EmitCompositeInsertF64x2(EmitContext& ctx, Id composite, Id object, u32 index);
|
|
Id EmitCompositeInsertF64x3(EmitContext& ctx, Id composite, Id object, u32 index);
|
|
Id EmitCompositeInsertF64x4(EmitContext& ctx, Id composite, Id object, u32 index);
|
|
Id EmitCompositeShuffleF64x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1);
|
|
Id EmitCompositeShuffleF64x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
|
|
u32 comp2);
|
|
Id EmitCompositeShuffleF64x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
|
|
u32 comp2, u32 comp3);
|
|
Id EmitSelectU1(EmitContext& ctx, Id cond, Id true_value, Id false_value);
|
|
Id EmitSelectU8(EmitContext& ctx, Id cond, Id true_value, Id false_value);
|
|
Id EmitSelectU16(EmitContext& ctx, Id cond, Id true_value, Id false_value);
|
|
Id EmitSelectU32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
|
|
Id EmitSelectU64(EmitContext& ctx, Id cond, Id true_value, Id false_value);
|
|
Id EmitSelectF16(EmitContext& ctx, Id cond, Id true_value, Id false_value);
|
|
Id EmitSelectF32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
|
|
Id EmitSelectF64(EmitContext& ctx, Id cond, Id true_value, Id false_value);
|
|
Id EmitBitCastU16F16(EmitContext& ctx, Id value);
|
|
Id EmitBitCastU32F32(EmitContext& ctx, Id value);
|
|
Id EmitBitCastF16U16(EmitContext& ctx, Id value);
|
|
Id EmitBitCastF32U32(EmitContext& ctx, Id value);
|
|
Id EmitPackUint2x32(EmitContext& ctx, Id value);
|
|
Id EmitUnpackUint2x32(EmitContext& ctx, Id value);
|
|
Id EmitPackDouble2x32(EmitContext& ctx, Id value);
|
|
Id EmitUnpackDouble2x32(EmitContext& ctx, Id value);
|
|
Id EmitPackUnorm2x16(EmitContext& ctx, Id value);
|
|
Id EmitUnpackUnorm2x16(EmitContext& ctx, Id value);
|
|
Id EmitPackSnorm2x16(EmitContext& ctx, Id value);
|
|
Id EmitUnpackSnorm2x16(EmitContext& ctx, Id value);
|
|
Id EmitPackUint2x16(EmitContext& ctx, Id value);
|
|
Id EmitUnpackUint2x16(EmitContext& ctx, Id value);
|
|
Id EmitPackSint2x16(EmitContext& ctx, Id value);
|
|
Id EmitUnpackSint2x16(EmitContext& ctx, Id value);
|
|
Id EmitPackHalf2x16(EmitContext& ctx, Id value);
|
|
Id EmitUnpackHalf2x16(EmitContext& ctx, Id value);
|
|
Id EmitPackUnorm4x8(EmitContext& ctx, Id value);
|
|
Id EmitUnpackUnorm4x8(EmitContext& ctx, Id value);
|
|
Id EmitPackSnorm4x8(EmitContext& ctx, Id value);
|
|
Id EmitUnpackSnorm4x8(EmitContext& ctx, Id value);
|
|
Id EmitPackUint4x8(EmitContext& ctx, Id value);
|
|
Id EmitUnpackUint4x8(EmitContext& ctx, Id value);
|
|
Id EmitPackSint4x8(EmitContext& ctx, Id value);
|
|
Id EmitUnpackSint4x8(EmitContext& ctx, Id value);
|
|
Id EmitPackUfloat10_11_11(EmitContext& ctx, Id value);
|
|
Id EmitUnpackUfloat10_11_11(EmitContext& ctx, Id value);
|
|
Id EmitPackUnorm2_10_10_10(EmitContext& ctx, Id value);
|
|
Id EmitUnpackUnorm2_10_10_10(EmitContext& ctx, Id value);
|
|
Id EmitPackSnorm2_10_10_10(EmitContext& ctx, Id value);
|
|
Id EmitUnpackSnorm2_10_10_10(EmitContext& ctx, Id value);
|
|
Id EmitPackUint2_10_10_10(EmitContext& ctx, Id value);
|
|
Id EmitUnpackUint2_10_10_10(EmitContext& ctx, Id value);
|
|
Id EmitPackSint2_10_10_10(EmitContext& ctx, Id value);
|
|
Id EmitUnpackSint2_10_10_10(EmitContext& ctx, Id value);
|
|
Id EmitFPAbs16(EmitContext& ctx, Id value);
|
|
Id EmitFPAbs32(EmitContext& ctx, Id value);
|
|
Id EmitFPAbs64(EmitContext& ctx, Id value);
|
|
Id EmitFPAdd16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitFPAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitFPAdd64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitFPSub32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitFPFma16(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
|
|
Id EmitFPFma32(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
|
|
Id EmitFPFma64(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
|
|
Id EmitFPMax32(EmitContext& ctx, Id a, Id b, bool is_legacy = false);
|
|
Id EmitFPMax64(EmitContext& ctx, Id a, Id b);
|
|
Id EmitFPMin32(EmitContext& ctx, Id a, Id b, bool is_legacy = false);
|
|
Id EmitFPMin64(EmitContext& ctx, Id a, Id b);
|
|
Id EmitFPMinTri32(EmitContext& ctx, Id a, Id b, Id c);
|
|
Id EmitFPMaxTri32(EmitContext& ctx, Id a, Id b, Id c);
|
|
Id EmitFPMedTri32(EmitContext& ctx, Id a, Id b, Id c);
|
|
Id EmitFPMul16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitFPMul32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitFPMul64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitFPDiv32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitFPDiv64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitFPNeg16(EmitContext& ctx, Id value);
|
|
Id EmitFPNeg32(EmitContext& ctx, Id value);
|
|
Id EmitFPNeg64(EmitContext& ctx, Id value);
|
|
Id EmitFPSin(EmitContext& ctx, Id value);
|
|
Id EmitFPCos(EmitContext& ctx, Id value);
|
|
Id EmitFPExp2(EmitContext& ctx, Id value);
|
|
Id EmitFPLdexp(EmitContext& ctx, Id value, Id exp);
|
|
Id EmitFPLog2(EmitContext& ctx, Id value);
|
|
Id EmitFPRecip32(EmitContext& ctx, Id value);
|
|
Id EmitFPRecip64(EmitContext& ctx, Id value);
|
|
Id EmitFPRecipSqrt32(EmitContext& ctx, Id value);
|
|
Id EmitFPRecipSqrt64(EmitContext& ctx, Id value);
|
|
Id EmitFPSqrt(EmitContext& ctx, Id value);
|
|
Id EmitFPSaturate16(EmitContext& ctx, Id value);
|
|
Id EmitFPSaturate32(EmitContext& ctx, Id value);
|
|
Id EmitFPSaturate64(EmitContext& ctx, Id value);
|
|
Id EmitFPClamp16(EmitContext& ctx, Id value, Id min_value, Id max_value);
|
|
Id EmitFPClamp32(EmitContext& ctx, Id value, Id min_value, Id max_value);
|
|
Id EmitFPClamp64(EmitContext& ctx, Id value, Id min_value, Id max_value);
|
|
Id EmitFPRoundEven16(EmitContext& ctx, Id value);
|
|
Id EmitFPRoundEven32(EmitContext& ctx, Id value);
|
|
Id EmitFPRoundEven64(EmitContext& ctx, Id value);
|
|
Id EmitFPFloor16(EmitContext& ctx, Id value);
|
|
Id EmitFPFloor32(EmitContext& ctx, Id value);
|
|
Id EmitFPFloor64(EmitContext& ctx, Id value);
|
|
Id EmitFPCeil16(EmitContext& ctx, Id value);
|
|
Id EmitFPCeil32(EmitContext& ctx, Id value);
|
|
Id EmitFPCeil64(EmitContext& ctx, Id value);
|
|
Id EmitFPTrunc16(EmitContext& ctx, Id value);
|
|
Id EmitFPTrunc32(EmitContext& ctx, Id value);
|
|
Id EmitFPTrunc64(EmitContext& ctx, Id value);
|
|
Id EmitFPFract32(EmitContext& ctx, Id value);
|
|
Id EmitFPFract64(EmitContext& ctx, Id value);
|
|
Id EmitFPFrexpSig32(EmitContext& ctx, Id value);
|
|
Id EmitFPFrexpSig64(EmitContext& ctx, Id value);
|
|
Id EmitFPFrexpExp32(EmitContext& ctx, Id value);
|
|
Id EmitFPFrexpExp64(EmitContext& ctx, Id value);
|
|
Id EmitFPOrdEqual16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdEqual32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdEqual64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordEqual16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordEqual32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordEqual64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdNotEqual16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdNotEqual32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdNotEqual64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordNotEqual16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordNotEqual32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordNotEqual64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdLessThan16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdLessThan32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdLessThan64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordLessThan16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordLessThan32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordLessThan64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdGreaterThan16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdGreaterThan32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdGreaterThan64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordGreaterThan16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordGreaterThan32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordGreaterThan64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPOrdGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPUnordGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitFPIsNan16(EmitContext& ctx, Id value);
|
|
Id EmitFPIsNan32(EmitContext& ctx, Id value);
|
|
Id EmitFPIsNan64(EmitContext& ctx, Id value);
|
|
Id EmitFPIsInf32(EmitContext& ctx, Id value);
|
|
Id EmitFPIsInf64(EmitContext& ctx, Id value);
|
|
Id EmitIAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitIAdd64(EmitContext& ctx, Id a, Id b);
|
|
Id EmitIAddCary32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitISub32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitISub64(EmitContext& ctx, Id a, Id b);
|
|
Id EmitSMulHi(EmitContext& ctx, Id a, Id b);
|
|
Id EmitUMulHi(EmitContext& ctx, Id a, Id b);
|
|
Id EmitIMul32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitIMul64(EmitContext& ctx, Id a, Id b);
|
|
Id EmitSDiv32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitUDiv32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitSMod32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitUMod32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitINeg32(EmitContext& ctx, Id value);
|
|
Id EmitINeg64(EmitContext& ctx, Id value);
|
|
Id EmitIAbs32(EmitContext& ctx, Id value);
|
|
Id EmitShiftLeftLogical32(EmitContext& ctx, Id base, Id shift);
|
|
Id EmitShiftLeftLogical64(EmitContext& ctx, Id base, Id shift);
|
|
Id EmitShiftRightLogical32(EmitContext& ctx, Id base, Id shift);
|
|
Id EmitShiftRightLogical64(EmitContext& ctx, Id base, Id shift);
|
|
Id EmitShiftRightArithmetic32(EmitContext& ctx, Id base, Id shift);
|
|
Id EmitShiftRightArithmetic64(EmitContext& ctx, Id base, Id shift);
|
|
Id EmitBitwiseAnd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitBitwiseAnd64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitBitwiseOr32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitBitwiseOr64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitBitwiseXor32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
|
|
Id EmitBitFieldInsert(EmitContext& ctx, Id base, Id insert, Id offset, Id count);
|
|
Id EmitBitFieldSExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
|
|
Id EmitBitFieldUExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
|
|
Id EmitBitReverse32(EmitContext& ctx, Id value);
|
|
Id EmitBitCount32(EmitContext& ctx, Id value);
|
|
Id EmitBitCount64(EmitContext& ctx, Id value);
|
|
Id EmitBitwiseNot32(EmitContext& ctx, Id value);
|
|
Id EmitFindSMsb32(EmitContext& ctx, Id value);
|
|
Id EmitFindUMsb32(EmitContext& ctx, Id value);
|
|
Id EmitFindILsb32(EmitContext& ctx, Id value);
|
|
Id EmitFindILsb64(EmitContext& ctx, Id value);
|
|
Id EmitSMin32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitUMin32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitSMax32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitUMax32(EmitContext& ctx, Id a, Id b);
|
|
Id EmitSMinTri32(EmitContext& ctx, Id a, Id b, Id c);
|
|
Id EmitUMinTri32(EmitContext& ctx, Id a, Id b, Id c);
|
|
Id EmitSMaxTri32(EmitContext& ctx, Id a, Id b, Id c);
|
|
Id EmitUMaxTri32(EmitContext& ctx, Id a, Id b, Id c);
|
|
Id EmitSMedTri32(EmitContext& ctx, Id a, Id b, Id c);
|
|
Id EmitUMedTri32(EmitContext& ctx, Id a, Id b, Id c);
|
|
Id EmitSClamp32(EmitContext& ctx, IR::Inst* inst, Id value, Id min, Id max);
|
|
Id EmitUClamp32(EmitContext& ctx, IR::Inst* inst, Id value, Id min, Id max);
|
|
Id EmitSLessThan32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitSLessThan64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitULessThan32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitULessThan64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitIEqual32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitIEqual64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitSLessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitULessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitSGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitUGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitINotEqual32(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitINotEqual64(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitSGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitUGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
|
|
Id EmitLogicalOr(EmitContext& ctx, Id a, Id b);
|
|
Id EmitLogicalAnd(EmitContext& ctx, Id a, Id b);
|
|
Id EmitLogicalXor(EmitContext& ctx, Id a, Id b);
|
|
Id EmitLogicalNot(EmitContext& ctx, Id value);
|
|
Id EmitConvertS16F16(EmitContext& ctx, Id value);
|
|
Id EmitConvertS16F32(EmitContext& ctx, Id value);
|
|
Id EmitConvertS16F64(EmitContext& ctx, Id value);
|
|
Id EmitConvertS32F16(EmitContext& ctx, Id value);
|
|
Id EmitConvertS32F32(EmitContext& ctx, Id value);
|
|
Id EmitConvertS32F64(EmitContext& ctx, Id value);
|
|
Id EmitConvertS64F16(EmitContext& ctx, Id value);
|
|
Id EmitConvertS64F32(EmitContext& ctx, Id value);
|
|
Id EmitConvertS64F64(EmitContext& ctx, Id value);
|
|
Id EmitConvertU16F16(EmitContext& ctx, Id value);
|
|
Id EmitConvertU16F32(EmitContext& ctx, Id value);
|
|
Id EmitConvertU16F64(EmitContext& ctx, Id value);
|
|
Id EmitConvertU32F16(EmitContext& ctx, Id value);
|
|
Id EmitConvertU32F32(EmitContext& ctx, Id value);
|
|
Id EmitConvertU32F64(EmitContext& ctx, Id value);
|
|
Id EmitConvertU64F16(EmitContext& ctx, Id value);
|
|
Id EmitConvertU64F32(EmitContext& ctx, Id value);
|
|
Id EmitConvertU64F64(EmitContext& ctx, Id value);
|
|
Id EmitConvertU64U32(EmitContext& ctx, Id value);
|
|
Id EmitConvertU32U64(EmitContext& ctx, Id value);
|
|
Id EmitConvertF16F32(EmitContext& ctx, Id value);
|
|
Id EmitConvertF32F16(EmitContext& ctx, Id value);
|
|
Id EmitConvertF32F64(EmitContext& ctx, Id value);
|
|
Id EmitConvertF64F32(EmitContext& ctx, Id value);
|
|
Id EmitConvertF16S8(EmitContext& ctx, Id value);
|
|
Id EmitConvertF16S16(EmitContext& ctx, Id value);
|
|
Id EmitConvertF16S32(EmitContext& ctx, Id value);
|
|
Id EmitConvertF16S64(EmitContext& ctx, Id value);
|
|
Id EmitConvertF16U8(EmitContext& ctx, Id value);
|
|
Id EmitConvertF16U16(EmitContext& ctx, Id value);
|
|
Id EmitConvertF16U32(EmitContext& ctx, Id value);
|
|
Id EmitConvertF16U64(EmitContext& ctx, Id value);
|
|
Id EmitConvertF32S8(EmitContext& ctx, Id value);
|
|
Id EmitConvertF32S16(EmitContext& ctx, Id value);
|
|
Id EmitConvertF32S32(EmitContext& ctx, Id value);
|
|
Id EmitConvertF32S64(EmitContext& ctx, Id value);
|
|
Id EmitConvertF32U8(EmitContext& ctx, Id value);
|
|
Id EmitConvertF32U16(EmitContext& ctx, Id value);
|
|
Id EmitConvertF32U32(EmitContext& ctx, Id value);
|
|
Id EmitConvertF32U64(EmitContext& ctx, Id value);
|
|
Id EmitConvertF64S8(EmitContext& ctx, Id value);
|
|
Id EmitConvertF64S16(EmitContext& ctx, Id value);
|
|
Id EmitConvertF64S32(EmitContext& ctx, Id value);
|
|
Id EmitConvertF64S64(EmitContext& ctx, Id value);
|
|
Id EmitConvertF64U8(EmitContext& ctx, Id value);
|
|
Id EmitConvertF64U16(EmitContext& ctx, Id value);
|
|
Id EmitConvertF64U32(EmitContext& ctx, Id value);
|
|
Id EmitConvertF64U64(EmitContext& ctx, Id value);
|
|
Id EmitConvertU16U32(EmitContext& ctx, Id value);
|
|
Id EmitConvertU32U16(EmitContext& ctx, Id value);
|
|
|
|
Id EmitImageSampleRaw(EmitContext& ctx, IR::Inst* inst, u32 handle, Id address1, Id address2,
|
|
Id address3, Id address4);
|
|
Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id bias,
|
|
const IR::Value& offset);
|
|
Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id lod,
|
|
const IR::Value& offset);
|
|
Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id dref,
|
|
Id bias, const IR::Value& offset);
|
|
Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id dref,
|
|
Id lod, const IR::Value& offset);
|
|
Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords,
|
|
const IR::Value& offset);
|
|
Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords,
|
|
const IR::Value& offset, Id dref);
|
|
Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, u32 handle, Id lod, bool skip_mips);
|
|
Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords);
|
|
Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id derivatives_dx,
|
|
Id derivatives_dy, const IR::Value& offset, const IR::Value& lod_clamp);
|
|
Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id lod, Id ms);
|
|
void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id lod, Id ms,
|
|
Id color);
|
|
|
|
Id EmitImageAtomicIAdd32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicSMin32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicUMin32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicSMax32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicUMax32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicFMax32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicFMin32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicInc32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicDec32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicAnd32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicOr32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicXor32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitImageAtomicExchange32(EmitContext& ctx, IR::Inst* inst, u32 handle, Id coords, Id value);
|
|
Id EmitCubeFaceIndex(EmitContext& ctx, IR::Inst* inst, Id cube_coords);
|
|
Id EmitLaneId(EmitContext& ctx);
|
|
Id EmitWarpId(EmitContext& ctx);
|
|
Id EmitQuadShuffle(EmitContext& ctx, Id value, Id index);
|
|
Id EmitReadFirstLane(EmitContext& ctx, Id value);
|
|
Id EmitReadLane(EmitContext& ctx, Id value, u32 lane);
|
|
Id EmitWriteLane(EmitContext& ctx, Id value, Id write_value, u32 lane);
|
|
Id EmitDataAppend(EmitContext& ctx, u32 gds_addr, u32 binding);
|
|
Id EmitDataConsume(EmitContext& ctx, u32 gds_addr, u32 binding);
|
|
|
|
void EmitEmitVertex(EmitContext& ctx);
|
|
void EmitEmitPrimitive(EmitContext& ctx);
|
|
|
|
} // namespace Shader::Backend::SPIRV
|