Files
UnrealEngineUWP/Engine/Shaders/Private/GPUMessaging.ush
jon nabozny 305fde1710 GPU Messaging API
#rb ola.olsson
#preflight 613939522d09b900016845b9

#ROBOMERGE-OWNER: jon.nabozny
#ROBOMERGE-AUTHOR: zach.bethel
#ROBOMERGE-SOURCE: CL 17465657 via CL 17913847 via CL 18360942 via CL 18361199
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v895-18170469)

[CL 18361390 by jon nabozny in ue5-release-engine-test branch]
2021-12-02 18:23:59 -05:00

105 lines
2.8 KiB
Plaintext

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
// Buffer containing both headers, message payloads and the global offset in element 0.
RWStructuredBuffer<uint> GPUMessageDataBuffer;
uint GPUMessageDataBufferSize;
struct FGPUMessageWriter
{
bool bValid;
uint PayloadOffset;
uint PayloadNumUints;
uint CurrentWriteOffset;
};
FGPUMessageWriter GPUMessageBegin(uint ID, uint PayloadNumUints)
{
uint MessageStartOffset = 0U;
InterlockedAdd(GPUMessageDataBuffer[0], 2U + PayloadNumUints, MessageStartOffset);
// Always offset 1 for the GPUMessageDataBuffer[0] is used for the counter
MessageStartOffset += 1U;
FGPUMessageWriter GPUMessageWriter;
GPUMessageWriter.PayloadOffset = MessageStartOffset + 2U;
GPUMessageWriter.PayloadNumUints = PayloadNumUints;
GPUMessageWriter.bValid = MessageStartOffset + 2U + PayloadNumUints <= GPUMessageDataBufferSize;
GPUMessageWriter.CurrentWriteOffset = 0U;
if (GPUMessageWriter.bValid)
{
GPUMessageDataBuffer[MessageStartOffset] = ID;
GPUMessageDataBuffer[MessageStartOffset + 1] = PayloadNumUints;
}
return GPUMessageWriter;
}
void GPUMessageWriteItem(inout FGPUMessageWriter Mw, uint Value)
{
if (Mw.bValid && Mw.CurrentWriteOffset < Mw.PayloadNumUints)
{
GPUMessageDataBuffer[Mw.PayloadOffset + Mw.CurrentWriteOffset] = Value;
Mw.CurrentWriteOffset += 1U;
}
}
void GPUMessageWriteItem(inout FGPUMessageWriter Mw, uint2 Value)
{
GPUMessageWriteItem(Mw, Value.x);
GPUMessageWriteItem(Mw, Value.y);
}
void GPUMessageWriteItem(inout FGPUMessageWriter Mw, uint3 Value)
{
GPUMessageWriteItem(Mw, Value.x);
GPUMessageWriteItem(Mw, Value.y);
GPUMessageWriteItem(Mw, Value.z);
}
void GPUMessageWriteItem(inout FGPUMessageWriter Mw, uint4 Value)
{
GPUMessageWriteItem(Mw, Value.x);
GPUMessageWriteItem(Mw, Value.y);
GPUMessageWriteItem(Mw, Value.z);
GPUMessageWriteItem(Mw, Value.w);
}
void GPUMessageWriteItem(inout FGPUMessageWriter Mw, float Value)
{
GPUMessageWriteItem(Mw, asuint(Value));
}
void GPUMessageWriteItem(inout FGPUMessageWriter Mw, float2 Value)
{
GPUMessageWriteItem(Mw, Value.x);
GPUMessageWriteItem(Mw, Value.y);
}
void GPUMessageWriteItem(inout FGPUMessageWriter Mw, float3 Value)
{
GPUMessageWriteItem(Mw, Value.x);
GPUMessageWriteItem(Mw, Value.y);
GPUMessageWriteItem(Mw, Value.z);
}
void GPUMessageWriteItem(inout FGPUMessageWriter Mw, float4 Value)
{
GPUMessageWriteItem(Mw, Value.x);
GPUMessageWriteItem(Mw, Value.y);
GPUMessageWriteItem(Mw, Value.z);
GPUMessageWriteItem(Mw, Value.w);
}
void GPUMessagePost(uint ID, uint PayloadItem)
{
FGPUMessageWriter Mw = GPUMessageBegin(ID, 1);
GPUMessageWriteItem(Mw, PayloadItem);
}
void GPUMessagePost(uint ID, uint PayloadItem0, uint PayloadItem1)
{
FGPUMessageWriter Mw = GPUMessageBegin(ID, 2);
GPUMessageWriteItem(Mw, PayloadItem0);
GPUMessageWriteItem(Mw, PayloadItem1);
}