private static int GetComponentSizeInBytesLog2(SuatomSize size) { return(size switch { SuatomSize.U32 => 2, SuatomSize.S32 => 2, SuatomSize.U64 => 3, SuatomSize.F32FtzRn => 2, SuatomSize.F16x2FtzRn => 2, SuatomSize.S64 => 3, SuatomSize.Sd32 => 2, SuatomSize.Sd64 => 3, _ => 2 });
private static void EmitSured( EmitterContext context, SuDim dimensions, RedOp atomicOp, SuatomSize size, int imm, int srcA, int srcB, int srcC, bool byteAddress, bool isBindless) { SamplerType type = ConvertSamplerType(dimensions); if (type == SamplerType.None) { context.Config.GpuAccessor.Log("Invalid image reduction sampler type."); return; } Operand Ra() { if (srcA > RegisterConsts.RegisterZeroIndex) { return(Const(0)); } return(context.Copy(Register(srcA++, RegisterType.Gpr))); } Operand Rb() { if (srcB > RegisterConsts.RegisterZeroIndex) { return(Const(0)); } return(context.Copy(Register(srcB++, RegisterType.Gpr))); } List <Operand> sourcesList = new List <Operand>(); if (isBindless) { sourcesList.Add(context.Copy(GetSrcReg(context, srcC))); } int coordsCount = type.GetDimensions(); for (int index = 0; index < coordsCount; index++) { sourcesList.Add(Ra()); } if (Sample1DAs2D && (type & SamplerType.Mask) == SamplerType.Texture1D) { sourcesList.Add(Const(0)); type &= ~SamplerType.Mask; type |= SamplerType.Texture2D; } if (type.HasFlag(SamplerType.Array)) { sourcesList.Add(Ra()); type |= SamplerType.Array; } if (byteAddress) { int xIndex = isBindless ? 1 : 0; sourcesList[xIndex] = context.ShiftRightS32(sourcesList[xIndex], Const(GetComponentSizeInBytesLog2(size))); } // TODO: FP and 64-bit formats. TextureFormat format = size == SuatomSize.Sd32 || size == SuatomSize.Sd64 ? (isBindless ? TextureFormat.Unknown : context.Config.GetTextureFormatAtomic(imm)) : GetTextureFormat(size); sourcesList.Add(Rb()); Operand[] sources = sourcesList.ToArray(); TextureFlags flags = GetAtomicOpFlags((SuatomOp)atomicOp); if (isBindless) { flags |= TextureFlags.Bindless; } TextureOperation operation = context.CreateTextureOperation( Instruction.ImageAtomic, type, format, flags, imm, 0, null, sources); context.Add(operation); }