blob: 32411ccccab02b0b7dc6cb78d8c071dbca5785e2 [file] [log] [blame]
/*
* Copyright 2018 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrMtlSampler_DEFINED
#define GrMtlSampler_DEFINED
#import <Metal/Metal.h>
#include "src/core/SkOpts.h"
#include "src/gpu/GrManagedResource.h"
#include <atomic>
class GrSamplerState;
class GrMtlGpu;
// A wrapper for a MTLSamplerState object with caching support.
class GrMtlSampler : public GrManagedResource {
public:
static GrMtlSampler* Create(const GrMtlGpu* gpu, GrSamplerState);
~GrMtlSampler() override { fMtlSamplerState = nil; }
id<MTLSamplerState> mtlSampler() const { return fMtlSamplerState; }
typedef uint32_t Key;
// Helpers for hashing GrMtlSampler
static Key GenerateKey(GrSamplerState);
static const Key& GetKey(const GrMtlSampler& sampler) { return sampler.fKey; }
static uint32_t Hash(const Key& key) {
return SkOpts::hash(reinterpret_cast<const uint32_t*>(&key), sizeof(Key));
}
#ifdef SK_TRACE_MANAGED_RESOURCES
/** output a human-readable dump of this resource's information
*/
void dumpInfo() const override {
SkDebugf("GrMtlSampler: %p (%ld refs)\n", fMtlSamplerState,
CFGetRetainCount((CFTypeRef)fMtlSamplerState));
}
#endif
void freeGPUData() const override {
fMtlSamplerState = nil;
}
private:
GrMtlSampler(id<MTLSamplerState> mtlSamplerState, Key key)
: fMtlSamplerState(mtlSamplerState)
, fKey(key) {}
mutable id<MTLSamplerState> fMtlSamplerState;
Key fKey;
};
#endif