blob: 9c827d3b500a20f92557f68ce89fd22176f2e1ac [file] [log] [blame]
/*
* Copyright 2025 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef PipelineCallbackHandler_DEFINED
#define PipelineCallbackHandler_DEFINED
#include "include/core/SkData.h"
#include "include/core/SkRefCnt.h"
#include "src/base/SkSpinlock.h"
#include "src/core/SkChecksum.h"
#include "src/core/SkTHash.h"
#include <vector>
class SkData;
namespace skiatools::graphite {
// This is intended to be an example of a Precompilation Callback handler. For DM it collects
// all the Android-style keys that are used by a given source (e.g., gm, or skp) and uses
// them in resetAndRecreatePipelines to recreate the Pipelines.
class PipelineCallBackHandler {
public:
static void CallBack(void* data, sk_sp<SkData> androidStyleKey) {
PipelineCallBackHandler* handler = reinterpret_cast<PipelineCallBackHandler*>(data);
handler->add(std::move(androidStyleKey));
}
// Add an Android-style key to the map
void add(sk_sp<SkData> androidStyleKey) SK_EXCLUDES(fSpinLock);
// Retrieve all the unique collected keys
void retrieve(std::vector<sk_sp<SkData>>*) SK_EXCLUDES(fSpinLock);
void reset() SK_EXCLUDES(fSpinLock);
int numKeys() const SK_EXCLUDES(fSpinLock) {
SkAutoSpinlock lock{ fSpinLock };
return fMap.count();
}
private:
mutable SkSpinlock fSpinLock;
struct SkDataKey {
static SkDataKey GetKey(sk_sp<SkData>& e) { return { e.get() }; }
static uint32_t Hash(const SkDataKey& k) { return k.hash(); }
bool operator==(const SkDataKey& other) const { return fData->equals(other.fData); }
uint32_t hash() const { return SkChecksum::Hash32(fData->data(), fData->size()); }
const SkData* fData;
};
skia_private::THashTable<sk_sp<SkData>, SkDataKey, SkDataKey> fMap SK_GUARDED_BY(fSpinLock);
};
} // namespace skiatools::graphite
#endif // PipelineCallbackHandler_DEFINED