Files
UnrealEngine/Engine/Source/Developer/Horde/Private/Compute/ComputeTransport.cpp
2025-05-18 13:04:45 +08:00

87 lines
1.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Compute/ComputeTransport.h"
#include <algorithm>
FComputeTransport::~FComputeTransport()
{
}
bool FComputeTransport::SendMessage(const void* Data, size_t Size)
{
const unsigned char* RemainingData = (const unsigned char*)Data;
for (size_t RemainingSize = Size; RemainingSize > 0; )
{
size_t SentSize = Send(RemainingData, RemainingSize);
if (SentSize == 0)
{
return false;
}
RemainingData += SentSize;
RemainingSize -= SentSize;
}
return true;
}
bool FComputeTransport::RecvMessage(void* Data, size_t Size)
{
unsigned char* RemainingData = (unsigned char*)Data;
for (size_t RemainingSize = Size; RemainingSize > 0; )
{
size_t RecvSize = Recv(RemainingData, RemainingSize);
if (RecvSize == 0)
{
return false;
}
RemainingData += RecvSize;
RemainingSize -= RecvSize;
}
return true;
}
///////////////////////////////////
FBufferTransport::FBufferTransport(FComputeBufferWriter InSendBufferWriter, FComputeBufferReader InRecvBufferReader)
: SendBufferWriter(std::move(InSendBufferWriter))
, RecvBufferReader(std::move(InRecvBufferReader))
{
}
bool FBufferTransport::IsValid() const
{
return SendBufferWriter.IsValid() && RecvBufferReader.IsValid();
}
size_t FBufferTransport::Send(const void* Data, size_t Size)
{
unsigned char* Buffer = SendBufferWriter.WaitToWrite(1);
size_t WriteSize = std::min(Size, SendBufferWriter.GetMaxWriteSize());
memcpy(Buffer, Data, WriteSize);
SendBufferWriter.AdvanceWritePosition(WriteSize);
return WriteSize;
}
size_t FBufferTransport::Recv(void* Data, size_t Size)
{
const unsigned char* Buffer = RecvBufferReader.WaitToRead(1);
size_t ReadSize = std::min(Size, RecvBufferReader.GetMaxReadSize());
memcpy(Data, Buffer, ReadSize);
RecvBufferReader.AdvanceReadPosition(ReadSize);
return ReadSize;
}
void FBufferTransport::MarkComplete()
{
SendBufferWriter.MarkComplete();
}
void FBufferTransport::Close()
{
RecvBufferReader.Detach();
}