public void Process(CommandList context) { Span <float> inputBuffer = context.GetBuffer((int)InputBufferIndex); Span <float> outputBuffer = context.GetBuffer((int)OutputBufferIndex); if (IsEffectEnabled) { Span <int> inputBufferInt = MemoryMarshal.Cast <float, int>(inputBuffer); Span <int> outputBufferInt = MemoryMarshal.Cast <float, int>(outputBuffer); // Convert input data to the target format for user (int) DataSourceHelper.ToInt(inputBufferInt, inputBuffer, inputBuffer.Length); // Send the input to the user Write(context.MemoryManager, OutputBuffer, CountMax, inputBufferInt, context.SampleCount, WriteOffset, UpdateCount); // Convert back to float just in case it's reused DataSourceHelper.ToFloat(inputBuffer, inputBufferInt, inputBuffer.Length); // Retrieve the input from user uint readResult = Read(context.MemoryManager, InputBuffer, CountMax, outputBufferInt, context.SampleCount, WriteOffset, UpdateCount); // Convert the outputBuffer back to the target format of the renderer (float) DataSourceHelper.ToFloat(outputBuffer, outputBufferInt, outputBuffer.Length); if (readResult != context.SampleCount) { outputBuffer.Slice((int)readResult, (int)context.SampleCount - (int)readResult).Fill(0); } } else { AuxiliaryBufferInfo.Reset(context.MemoryManager, BufferInfo.SendBufferInfo); AuxiliaryBufferInfo.Reset(context.MemoryManager, BufferInfo.ReturnBufferInfo); if (InputBufferIndex != OutputBufferIndex) { inputBuffer.CopyTo(outputBuffer); } } }
public void Process(CommandList context) { Span <float> inputBuffer = context.GetBuffer((int)InputBufferIndex); if (IsEffectEnabled) { Span <int> inputBufferInt = MemoryMarshal.Cast <float, int>(inputBuffer); // Convert input data to the target format for user (int) DataSourceHelper.ToInt(inputBufferInt, inputBuffer, inputBuffer.Length); // Send the input to the user Write(context.MemoryManager, OutputBuffer, CountMax, inputBufferInt, context.SampleCount, WriteOffset, UpdateCount); // Convert back to float DataSourceHelper.ToFloat(inputBuffer, inputBufferInt, inputBuffer.Length); } else { AuxiliaryBufferInfo.Reset(context.MemoryManager, DspBufferInfoAddress); } }
private uint Read(IVirtualMemoryManager memoryManager, ulong bufferAddress, uint countMax, Span <int> outBuffer, uint count, uint readOffset, uint updateCount) { if (countMax == 0 || bufferAddress == 0) { return(0); } uint targetReadOffset = readOffset + AuxiliaryBufferInfo.GetReadOffset(memoryManager, BufferInfo.ReturnBufferInfo); if (targetReadOffset > countMax) { return(0); } uint remaining = count; uint outBufferOffset = 0; while (remaining != 0) { uint countToWrite = Math.Min(countMax - targetReadOffset, remaining); memoryManager.Read(bufferAddress + targetReadOffset * sizeof(int), MemoryMarshal.Cast <int, byte>(outBuffer.Slice((int)outBufferOffset, (int)countToWrite))); targetReadOffset = (targetReadOffset + countToWrite) % countMax; remaining -= countToWrite; outBufferOffset += countToWrite; } if (updateCount != 0) { uint newReadOffset = (AuxiliaryBufferInfo.GetReadOffset(memoryManager, BufferInfo.ReturnBufferInfo) + updateCount) % countMax; AuxiliaryBufferInfo.SetReadOffset(memoryManager, BufferInfo.ReturnBufferInfo, newReadOffset); } return(count); }
private uint Write(MemoryManager memoryManager, ulong outBufferAddress, uint countMax, ReadOnlySpan <int> buffer, uint count, uint writeOffset, uint updateCount) { if (countMax == 0 || outBufferAddress == 0) { return(0); } uint targetWriteOffset = writeOffset + AuxiliaryBufferInfo.GetWriteOffset(memoryManager, BufferInfo.SendBufferInfo); if (targetWriteOffset > countMax) { return(0); } uint remaining = count; uint inBufferOffset = 0; while (remaining != 0) { uint countToWrite = Math.Min(countMax - targetWriteOffset, remaining); memoryManager.Write(outBufferAddress + targetWriteOffset * sizeof(int), MemoryMarshal.Cast <int, byte>(buffer.Slice((int)inBufferOffset, (int)countToWrite))); targetWriteOffset = (targetWriteOffset + countToWrite) % countMax; remaining -= countToWrite; inBufferOffset += countToWrite; } if (updateCount != 0) { uint newWriteOffset = (AuxiliaryBufferInfo.GetWriteOffset(memoryManager, BufferInfo.SendBufferInfo) + updateCount) % countMax; AuxiliaryBufferInfo.SetWriteOffset(memoryManager, BufferInfo.SendBufferInfo, newWriteOffset); } return(count); }
private uint Write(IVirtualMemoryManager memoryManager, ulong outBufferAddress, uint countMax, ReadOnlySpan <int> buffer, uint count, uint writeOffset, uint updateCount) { if (countMax == 0 || outBufferAddress == 0) { return(0); } uint targetWriteOffset = writeOffset + AuxiliaryBufferInfo.GetWriteOffset(memoryManager, DspBufferInfoAddress); if (targetWriteOffset > countMax) { return(0); } uint remaining = count; uint inBufferOffset = 0; while (remaining != 0) { uint countToWrite = Math.Min(countMax - targetWriteOffset, remaining); memoryManager.Write(outBufferAddress + targetWriteOffset * sizeof(int), MemoryMarshal.Cast <int, byte>(buffer.Slice((int)inBufferOffset, (int)countToWrite))); targetWriteOffset = (targetWriteOffset + countToWrite) % countMax; remaining -= countToWrite; inBufferOffset += countToWrite; } if (updateCount != 0) { uint dspTotalSampleCount = AuxiliaryBufferInfo.GetTotalSampleCount(memoryManager, DspBufferInfoAddress); uint cpuTotalSampleCount = AuxiliaryBufferInfo.GetTotalSampleCount(memoryManager, CpuBufferInfoAddress); uint totalSampleCountDiff = dspTotalSampleCount - cpuTotalSampleCount; if (totalSampleCountDiff >= countMax) { uint dspLostSampleCount = AuxiliaryBufferInfo.GetLostSampleCount(memoryManager, DspBufferInfoAddress); uint cpuLostSampleCount = AuxiliaryBufferInfo.GetLostSampleCount(memoryManager, CpuBufferInfoAddress); uint lostSampleCountDiff = dspLostSampleCount - cpuLostSampleCount; uint newLostSampleCount = lostSampleCountDiff + updateCount; if (lostSampleCountDiff > newLostSampleCount) { newLostSampleCount = cpuLostSampleCount - 1; } AuxiliaryBufferInfo.SetLostSampleCount(memoryManager, DspBufferInfoAddress, newLostSampleCount); } uint newWriteOffset = (AuxiliaryBufferInfo.GetWriteOffset(memoryManager, DspBufferInfoAddress) + updateCount) % countMax; AuxiliaryBufferInfo.SetWriteOffset(memoryManager, DspBufferInfoAddress, newWriteOffset); uint newTotalSampleCount = totalSampleCountDiff + newWriteOffset; AuxiliaryBufferInfo.SetTotalSampleCount(memoryManager, DspBufferInfoAddress, newTotalSampleCount); } return(count); }