// Copyright (c) Wojciech Figat. All rights reserved.
#pragma once
#include "../GPUTask.h"
#include "../GPUTasksContext.h"
#include "Engine/Graphics/GPUResourceProperty.h"
///
/// GPU resource copy task.
///
class GPUCopyResourceTask : public GPUTask
{
private:
GPUResourceReference _srcResource;
GPUResourceReference _dstResource;
public:
///
/// Initializes a new instance of the class.
///
/// The source resource.
/// The destination resource.
GPUCopyResourceTask(GPUResource* src, GPUResource* dst)
: GPUTask(Type::CopyResource)
, _srcResource(src)
, _dstResource(dst)
{
_srcResource.Released.Bind(this);
_dstResource.Released.Bind(this);
}
private:
void OnResourceReleased()
{
Cancel();
}
public:
// [GPUTask]
bool HasReference(Object* resource) const override
{
return _srcResource == resource || _dstResource == resource;
}
protected:
// [GPUTask]
Result run(GPUTasksContext* context) override
{
if (!_srcResource || !_dstResource)
return Result::MissingResources;
context->GPU->CopyResource(_dstResource, _srcResource);
return Result::Ok;
}
void OnEnd() override
{
_srcResource.Unlink();
_dstResource.Unlink();
// Base
GPUTask::OnEnd();
}
};