blob: 053889b4d1a614ac66492e97228d0e1eb3ff2152 [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_graphite_ComputePipelineDesc_DEFINED
#define skgpu_graphite_ComputePipelineDesc_DEFINED
#include "include/core/SkSpan.h"
#include "include/private/SkOpts_spi.h"
#include <array>
#include <string>
namespace skgpu::graphite {
/**
* ComputePipelineDesc represents the state needed to create a backend specific ComputePipeline.
*/
class ComputePipelineDesc {
public:
ComputePipelineDesc() = default;
SkSpan<const uint32_t> asKey() const {
return SkSpan(reinterpret_cast<const uint32_t*>(fName.data()),
this->keySize() / sizeof(uint32_t));
}
bool operator==(const ComputePipelineDesc& that) const { return this->fName == that.fName; }
bool operator!=(const ComputePipelineDesc& other) const { return !(*this == other); }
// TODO(b/240604614): Until we have a more sophisticated way to dynamically construct compute
// shader programs, this currently directly takes the entire program SkSL text as input. The
// caching scheme is based entirely on the name and could be improved.
const std::string& sksl() const { return fSkSL; }
const std::string& name() const { return fName; }
void setProgram(std::string sksl, std::string name) {
SkASSERT(!sksl.empty());
SkASSERT(name.size() >= sizeof(uint32_t));
fSkSL = std::move(sksl);
fName = std::move(name);
}
struct Hash {
uint32_t operator()(const ComputePipelineDesc& desc) const {
return SkOpts::hash_fn(desc.fName.data(), desc.keySize(), 0);
}
};
private:
size_t keySize() const {
size_t nameLength = fName.length();
return nameLength - (nameLength % sizeof(uint32_t));
}
std::string fSkSL;
std::string fName;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_ComputePipelineDesc_DEFINED