# WriteBuffer

> Write data into the memory buffer allocated by the context.

## Definition

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

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

Write data into the memory buffer allocated by the context.

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

### Parameters

**** (\[BufferSlice\<T>]\(/engine/6000.6/script-reference/unityengine/lighttransport/bufferslice1)): The [BufferSlice](/engine/6000.6/script-reference/unityengine/lighttransport/bufferslice1.md) to write to.**** (\[NativeArray\<T>]\(/engine/6000.6/script-reference/unity/collections/nativearray1)): The array in the CPU memory that should be written to the buffer. The array must remain valid until the write operation is complete.

### Remarks

This is an asynchronous operation. Pass an [EventID](/engine/6000.6/script-reference/unityengine/lighttransport/eventid.md) created with [IDeviceContext.CreateEvent()](/engine/6000.6/script-reference/unityengine/lighttransport/idevicecontext/createevent.md) to track the completion status, if desired. The [RadeonRaysContext.WriteBuffer](/engine/6000.6/script-reference/unityengine/lighttransport/radeonrayscontext/writebuffer.md) method returns immediately after enqueuing the command in the context.

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

### Examples

```csharp
using Unity.Collections;
using UnityEngine;
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;
BufferID id = ctx.CreateBuffer(8);
var writeEvent = ctx.CreateEvent();
ctx.WriteBuffer(id.Slice<byte>(), input, writeEvent);
bool flushOk = ctx.Flush();
Assert.IsTrue(flushOk);
bool eventOk = ctx.Wait(writeEvent);
Assert.IsTrue(eventOk);
ctx.DestroyEvent(writeEvent);

// The contents of the input buffer has now been transferred into the buffer allocated by the context.

input.Dispose();
ctx.DestroyBuffer(id);
ctx.Dispose();
```

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

Write data into the memory buffer allocated by the context.

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

### Parameters

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

### Remarks

This is an asynchronous operation. Pass an [EventID](/engine/6000.6/script-reference/unityengine/lighttransport/eventid.md) created with [IDeviceContext.CreateEvent()](/engine/6000.6/script-reference/unityengine/lighttransport/idevicecontext/createevent.md) to track the completion status, if desired. The [RadeonRaysContext.WriteBuffer](/engine/6000.6/script-reference/unityengine/lighttransport/radeonrayscontext/writebuffer.md) method returns immediately after enqueuing the command in the context.

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

### Examples

```csharp
using Unity.Collections;
using UnityEngine;
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;
BufferID id = ctx.CreateBuffer(8);
var writeEvent = ctx.CreateEvent();
ctx.WriteBuffer(id.Slice<byte>(), input, writeEvent);
bool flushOk = ctx.Flush();
Assert.IsTrue(flushOk);
bool eventOk = ctx.Wait(writeEvent);
Assert.IsTrue(eventOk);
ctx.DestroyEvent(writeEvent);

// The contents of the input buffer has now been transferred into the buffer allocated by the context.

input.Dispose();
ctx.DestroyBuffer(id);
ctx.Dispose();
```
