blob: 0804f4f1172b5d6f02246ad8788d857407dddd8f [file] [log] [blame]
/*
* Copyright 2022 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_UploadTask_DEFINED
#define skgpu_UploadTask_DEFINED
#include "experimental/graphite/src/Task.h"
#include <vector>
#include "include/core/SkImageInfo.h"
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
namespace skgpu {
class Buffer;
struct BufferTextureCopyData;
class CommandBuffer;
class Recorder;
class ResourceProvider;
class TextureProxy;
struct MipLevel {
const void* fPixels = nullptr;
size_t fRowBytes = 0;
};
/**
* An UploadCommand represents a single set of uploads from a buffer to texture that
* can be processed in a single command.
*/
struct UploadCommand {
void addCommand(ResourceProvider*, CommandBuffer*) const;
sk_sp<Buffer> fBuffer;
sk_sp<TextureProxy> fTextureProxy;
std::vector<BufferTextureCopyData> fCopyData;
};
/**
* An UploadList is a mutable collection of UploadCommands.
*
* Currently commands are accumulated in order and processed in the same order. Dependency
* management is expected to be handled by the TaskGraph.
*
* When an upload is appended to the list its data will be copied to a Buffer in
* preparation for a deferred upload.
*/
class UploadList {
public:
bool appendUpload(Recorder*,
sk_sp<TextureProxy> targetProxy,
SkColorType colorType,
const std::vector<MipLevel>& levels,
const SkIRect& dstRect);
private:
friend class UploadTask;
std::vector<UploadCommand> fCommands;
};
/*
* An UploadTask is a immutable collection of UploadCommands.
*
* When adding commands to the commandBuffer the texture proxies in those
* commands will be instantiated and the copy command added.
*/
class UploadTask final : public Task {
public:
static sk_sp<UploadTask> Make(UploadList*);
~UploadTask() override;
void addCommands(ResourceProvider*, CommandBuffer*) override;
private:
UploadTask(std::vector<UploadCommand>);
std::vector<UploadCommand> fCommands;
};
} // namespace skgpu
#endif // skgpu_UploadTask_DEFINED