src | 要从中读取的缓冲区切片。 |
dst | 应该将缓冲区内容写入到的 CPU 内存中的数组。在读取操作完成之前,该数组必须保持有效。相关内容:IDeviceContext.Wait。 |
id | 用于跟踪读取完成情况的事件 ID。 |
从上下文读取一个缓冲区的内容。
BufferSlice<T0> 指向的内存可被传输到 NativeArray<T0>。这是一个异步操作。如果需要,请传入使用 IDeviceContext.CreateEvent 创建的 EventID 来跟踪完成状态。此方法在将命令排队到上下文中后立即返回。
注意:EventID 是单用途的。将 EventID 传递到此函数后,不得将其传递到后续 IDeviceContext.WriteBuffer 或 IDeviceContext.ReadBuffer 调用。这样做将导致未定义的行为。
IDeviceContext ctx = new RadeonRaysContext(); ctx.Initialize(); uint length = 8; var input = new NativeArray<byte>((int)length, Allocator.Persistent); for (int i = 0; i < length; ++i) input[i] = (byte)i; var output = new NativeArray<byte>((int)length, Allocator.Persistent); BufferID id = ctx.CreateBuffer(8); var writeEvent = ctx.CreateEvent(); ctx.WriteBuffer(id.Slice<byte>(), input, writeEvent); var readEvent = ctx.CreateEvent(); ctx.ReadBuffer(id.Slice<byte>(), output, readEvent); bool flushOk = ctx.Flush(); Assert.IsTrue(flushOk); bool eventOk = ctx.Wait(writeEvent); Assert.IsTrue(eventOk);
// Contents of the buffer is now available in the CPU side memory array output.
input.Dispose(); Assert.IsTrue(ctx.IsCompleted(readEvent)); ctx.DestroyEvent(readEvent); ctx.DestroyEvent(writeEvent); ctx.DestroyBuffer(id); for (int i = 0; i < length; ++i) Assert.AreEqual((byte)i, output[i]); output.Dispose(); ctx.Dispose();
如何回读缓冲区。