# ReadBuffer

> Read contents of a buffer from the context.

## Definition

* **Type:** Method
* **Namespace:** [UnityEngine.LightTransport](/engine/6000.5/script-reference/unityengine/lighttransport.md)
* **Assembly:** UnityEditor.CoreModule

## ReadBuffer\<T>(BufferSlice\<T>, NativeArray\<T>)

Read contents of a buffer from the context.

```csharp
public void ReadBuffer<T>(BufferSlice<T> src, NativeArray<T> dst) where T : struct
```

### Parameters

**** (\[BufferSlice\<T>]\(/engine/6000.5/script-reference/unityengine/lighttransport/bufferslice1)): The [BufferSlice](/engine/6000.5/script-reference/unityengine/lighttransport/bufferslice1.md) to read from.**** (\[NativeArray\<T>]\(/engine/6000.5/script-reference/unity/collections/nativearray1)): The array in the CPU memory that the contents of the buffer should be written to. The array must remain valid until the read operation is complete. Related content: [IDeviceContext.Wait](/engine/6000.5/script-reference/unityengine/lighttransport/idevicecontext/wait.md).

### Remarks

The memory that the [BufferSlice\<T>](/engine/6000.5/script-reference/unityengine/lighttransport/bufferslice1.md) points to can be transferred into a [NativeArray\<T>](/engine/6000.5/script-reference/unity/collections/nativearray1.md). This is an asynchronous operation. Pass an [EventID](/engine/6000.5/script-reference/unityengine/lighttransport/eventid.md) created with [IDeviceContext.CreateEvent()](/engine/6000.5/script-reference/unityengine/lighttransport/idevicecontext/createevent.md) to track the completion status, if desired. This method returns immediately after enqueuing the command in the context.

**Note:** [EventID](/engine/6000.5/script-reference/unityengine/lighttransport/eventid.md) is single-use. Once an [EventID](/engine/6000.5/script-reference/unityengine/lighttransport/eventid.md) has been passed to this function, it may not be passed to subsequent [IDeviceContext.WriteBuffer](/engine/6000.5/script-reference/unityengine/lighttransport/idevicecontext/writebuffer.md) or [IDeviceContext.ReadBuffer](/engine/6000.5/script-reference/unityengine/lighttransport/idevicecontext/readbuffer.md) calls. Doing so will result in undefined behavior.

```csharp
using Unity.Collections;
using UnityEngine.LightTransport;

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();
```

How to read back a buffer.

## ReadBuffer\<T>(BufferSlice\<T>, NativeArray\<T>, EventID)

Read contents of a buffer from the context.

```csharp
public void ReadBuffer<T>(BufferSlice<T> src, NativeArray<T> dst, EventID id) where T : struct
```

### Parameters

**** (\[BufferSlice\<T>]\(/engine/6000.5/script-reference/unityengine/lighttransport/bufferslice1)): The [BufferSlice](/engine/6000.5/script-reference/unityengine/lighttransport/bufferslice1.md) to read from.**** (\[NativeArray\<T>]\(/engine/6000.5/script-reference/unity/collections/nativearray1)): The array in the CPU memory that the contents of the buffer should be written to. The array must remain valid until the read operation is complete. Related content: [IDeviceContext.Wait](/engine/6000.5/script-reference/unityengine/lighttransport/idevicecontext/wait.md).**** (\[EventID]\(/engine/6000.5/script-reference/unityengine/lighttransport/eventid)): The ID of the event to use to track completion of the read.

### Remarks

The memory that the [BufferSlice\<T>](/engine/6000.5/script-reference/unityengine/lighttransport/bufferslice1.md) points to can be transferred into a [NativeArray\<T>](/engine/6000.5/script-reference/unity/collections/nativearray1.md). This is an asynchronous operation. Pass an [EventID](/engine/6000.5/script-reference/unityengine/lighttransport/eventid.md) created with [IDeviceContext.CreateEvent()](/engine/6000.5/script-reference/unityengine/lighttransport/idevicecontext/createevent.md) to track the completion status, if desired. This method returns immediately after enqueuing the command in the context.

**Note:** [EventID](/engine/6000.5/script-reference/unityengine/lighttransport/eventid.md) is single-use. Once an [EventID](/engine/6000.5/script-reference/unityengine/lighttransport/eventid.md) has been passed to this function, it may not be passed to subsequent [IDeviceContext.WriteBuffer](/engine/6000.5/script-reference/unityengine/lighttransport/idevicecontext/writebuffer.md) or [IDeviceContext.ReadBuffer](/engine/6000.5/script-reference/unityengine/lighttransport/idevicecontext/readbuffer.md) calls. Doing so will result in undefined behavior.

```csharp
using Unity.Collections;
using UnityEngine.LightTransport;

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();
```

How to read back a buffer.
