Files
2025-05-18 13:04:45 +08:00

44 lines
1.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "IdleService.h"
#include <unordered_map>
DECLARE_LOG_CATEGORY_EXTERN(LogTransfer_Svc, Log, Verbose);
class TEXTUREGRAPHENGINE_API DeviceTransferService : public IdleService
{
protected:
static constexpr int GMaxFlush = 32; /// Size is chosen so that TransferInfo
struct TransferInfo
{
Device* OwnerDevice = nullptr; /// The owner device at the time when this blob was market for collection
BlobPtr BlobObj; /// The blob that needs to be transferred
Device* TargetDevice = nullptr; /// The device that we're transferring this to
AccessInfo Access; /// This is a snapshot of the access info we save at the time the blob
/// is marked for collection. We then check it at the time of collection to
/// see whether the buffer is in same state. If it is, we go ahead with the
/// transfer, otherwise we abort it.
};
std::unordered_map<HashType, TransferInfo>
Transfers; /// The current transfers that we're working on
public:
DeviceTransferService();
virtual ~DeviceTransferService() override;
virtual AsyncJobResultPtr Tick() override;
virtual void Stop() override;
virtual bool ShouldRunDuringBusyUpdate() const override { return true; }
virtual void QueueTransfer(BlobPtr BlobObj, Device* TargetDevice);
virtual void AbortTransfer(HashType HashValue);
};
typedef std::shared_ptr<DeviceTransferService> DeviceTransferServicePtr;
typedef std::weak_ptr<DeviceTransferService> DeviceTransferServicePtrW;