// Copyright (c) Wojciech Figat. All rights reserved. #pragma once #include "../GPUTask.h" #include "../GPUTasksContext.h" #include "Engine/Graphics/GPUResourceProperty.h" /// /// GPU subresource copy task. /// class GPUCopySubresourceTask : public GPUTask { private: GPUResourceReference _srcResource; GPUResourceReference _dstResource; uint32 _srcSubresource, _dstSubresource; public: /// /// Init /// /// The source resource. /// The destination resource. /// The source subresource index. /// The destination subresource index. GPUCopySubresourceTask(GPUResource* src, GPUResource* dst, uint32 srcSubresource, uint32 dstSubresource) : GPUTask(Type::CopyResource) , _srcResource(src) , _dstResource(dst) , _srcSubresource(srcSubresource) , _dstSubresource(dstSubresource) { _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->CopySubresource(_dstResource, _dstSubresource, _srcResource, _srcSubresource); return Result::Ok; } void OnEnd() override { _srcResource.Unlink(); _dstResource.Unlink(); // Base GPUTask::OnEnd(); } };