// Copyright (c) 2012-2024 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(); } };