2023-07-22 14:17:04 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "ComputeBuffer.h"
|
|
|
|
|
#include "ComputeSocket.h"
|
2023-07-28 13:25:31 -04:00
|
|
|
#include "ComputePlatform.h"
|
2023-07-22 14:17:04 -04:00
|
|
|
#include <assert.h>
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
|
|
void RunTests()
|
|
|
|
|
{
|
|
|
|
|
void ComputeBufferTest();
|
|
|
|
|
ComputeBufferTest();
|
2023-07-27 11:14:50 -04:00
|
|
|
std::cout << "ComputeBufferTest ok" << std::endl;
|
2023-07-22 14:17:04 -04:00
|
|
|
|
|
|
|
|
void ComputeSocketTest();
|
|
|
|
|
ComputeSocketTest();
|
2023-07-27 11:14:50 -04:00
|
|
|
std::cout << "ComputeSocketTest ok" << std::endl;
|
2023-07-22 14:17:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ComputeBufferTest()
|
|
|
|
|
{
|
|
|
|
|
char TestData[] = "hello world!";
|
|
|
|
|
|
|
|
|
|
FComputeBuffer Buffer;
|
2023-07-28 13:25:31 -04:00
|
|
|
UE_COMPUTE_VERIFY(Buffer.CreateNew(FComputeBuffer::FParams()));
|
2023-07-22 14:17:04 -04:00
|
|
|
|
2023-07-28 11:51:34 -04:00
|
|
|
FComputeBufferWriter Writer = Buffer.CreateWriter();
|
2023-07-22 14:17:04 -04:00
|
|
|
unsigned char* WriteBuffer = Writer.WaitToWrite(sizeof(TestData));
|
|
|
|
|
memcpy(WriteBuffer, TestData, sizeof(TestData));
|
|
|
|
|
Writer.AdvanceWritePosition(sizeof(TestData));
|
|
|
|
|
|
2023-07-24 17:25:42 -04:00
|
|
|
FComputeBufferReader Reader = Buffer.CreateReader();
|
2023-07-22 14:17:04 -04:00
|
|
|
const unsigned char* ReadBuffer = Reader.WaitToRead(sizeof(TestData));
|
2023-07-28 13:25:31 -04:00
|
|
|
UE_COMPUTE_ASSERT(memcmp(ReadBuffer, TestData, sizeof(TestData)) == 0);
|
|
|
|
|
UE_COMPUTE_ASSERT(!Reader.IsComplete());
|
2023-07-28 11:51:34 -04:00
|
|
|
|
|
|
|
|
Reader.AdvanceReadPosition(sizeof(TestData));
|
2023-07-28 13:25:31 -04:00
|
|
|
UE_COMPUTE_ASSERT(!Reader.IsComplete());
|
2023-07-28 11:51:34 -04:00
|
|
|
|
|
|
|
|
Writer.MarkComplete();
|
2023-07-28 13:25:31 -04:00
|
|
|
UE_COMPUTE_ASSERT(Reader.IsComplete());
|
2023-07-22 14:17:04 -04:00
|
|
|
}
|
|
|
|
|
|
2023-09-07 13:34:00 -04:00
|
|
|
template<size_t TestDataSize> void CheckChannelSendRecv(std::shared_ptr<FComputeChannel>& SendChannel, std::shared_ptr<FComputeChannel>& RecvChannel, const char(&TestData)[TestDataSize])
|
2023-07-22 14:17:04 -04:00
|
|
|
{
|
2023-09-07 13:34:00 -04:00
|
|
|
SendChannel->Send(TestData, TestDataSize);
|
2023-07-22 14:17:04 -04:00
|
|
|
|
|
|
|
|
char RecvTestData[TestDataSize];
|
2023-09-07 13:34:00 -04:00
|
|
|
UE_COMPUTE_VERIFY(RecvChannel->Recv(RecvTestData, TestDataSize) == TestDataSize);
|
2023-07-22 14:17:04 -04:00
|
|
|
|
2023-07-28 13:25:31 -04:00
|
|
|
UE_COMPUTE_VERIFY(memcmp(TestData, RecvTestData, TestDataSize) == 0);
|
2023-07-22 14:17:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ComputeSocketTest()
|
|
|
|
|
{
|
|
|
|
|
// Buffers for transferring between client and server
|
|
|
|
|
FComputeBuffer ClientToServerBuffer;
|
2023-07-28 13:25:31 -04:00
|
|
|
UE_COMPUTE_VERIFY(ClientToServerBuffer.CreateNew(FComputeBuffer::FParams()));
|
2023-07-22 14:17:04 -04:00
|
|
|
|
|
|
|
|
FComputeBuffer ServerToClientBuffer;
|
2023-07-28 13:25:31 -04:00
|
|
|
UE_COMPUTE_VERIFY(ServerToClientBuffer.CreateNew(FComputeBuffer::FParams()));
|
2023-07-22 14:17:04 -04:00
|
|
|
|
|
|
|
|
// Client transport
|
2023-07-28 11:51:34 -04:00
|
|
|
std::unique_ptr<FComputeSocket> ClientSocket = CreateComputeSocket(std::make_unique<FBufferTransport>(ClientToServerBuffer.CreateWriter(), ServerToClientBuffer.CreateReader()), EComputeSocketEndpoint::Local);
|
2023-09-07 13:34:00 -04:00
|
|
|
std::shared_ptr<FComputeChannel> ClientChannel1 = ClientSocket->CreateChannel(1);
|
|
|
|
|
std::shared_ptr<FComputeChannel> ClientChannel2 = ClientSocket->CreateChannel(2);
|
2023-07-22 14:17:04 -04:00
|
|
|
|
|
|
|
|
// Server socket
|
2023-07-28 11:51:34 -04:00
|
|
|
std::unique_ptr<FComputeSocket> ServerSocket = CreateComputeSocket(std::make_unique<FBufferTransport>(ServerToClientBuffer.CreateWriter(), ClientToServerBuffer.CreateReader()), EComputeSocketEndpoint::Remote);
|
2023-09-07 13:34:00 -04:00
|
|
|
std::shared_ptr<FComputeChannel> ServerChannel1 = ServerSocket->CreateChannel(1);
|
|
|
|
|
std::shared_ptr<FComputeChannel> ServerChannel2 = ServerSocket->CreateChannel(2);
|
2023-07-22 14:17:04 -04:00
|
|
|
|
2023-07-28 11:51:34 -04:00
|
|
|
// Close the original buffers now that the sockets are set up
|
|
|
|
|
ClientToServerBuffer.Close();
|
|
|
|
|
ServerToClientBuffer.Close();
|
|
|
|
|
|
2023-07-22 14:17:04 -04:00
|
|
|
// Send data over channel 1
|
|
|
|
|
CheckChannelSendRecv(ClientChannel1, ServerChannel1, "Channel 1: Client -> Server");
|
|
|
|
|
|
|
|
|
|
CheckChannelSendRecv(ServerChannel2, ClientChannel2, "Channel 2: Server -> Client");
|
|
|
|
|
CheckChannelSendRecv(ClientChannel2, ServerChannel2, "Channel 2: Client -> Server");
|
|
|
|
|
|
|
|
|
|
// Send data over channel 1 again
|
|
|
|
|
CheckChannelSendRecv(ClientChannel1, ServerChannel1, "Channel 1: Client -> Server (2)");
|
|
|
|
|
CheckChannelSendRecv(ServerChannel1, ClientChannel1, "Channel 1: Server -> Client (2)");
|
|
|
|
|
}
|