1 /* 2 * Copyright 2018 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrMtlSampler_DEFINED 9 #define GrMtlSampler_DEFINED 10 11 #import <Metal/Metal.h> 12 13 #include "src/core/SkOpts.h" 14 #include "src/gpu/GrManagedResource.h" 15 #include <atomic> 16 17 class GrSamplerState; 18 class GrMtlGpu; 19 20 // A wrapper for a MTLSamplerState object with caching support. 21 class GrMtlSampler : public GrManagedResource { 22 public: 23 static GrMtlSampler* Create(const GrMtlGpu* gpu, GrSamplerState); ~GrMtlSampler()24 ~GrMtlSampler() override { fMtlSamplerState = nil; } 25 mtlSampler()26 id<MTLSamplerState> mtlSampler() const { return fMtlSamplerState; } 27 28 typedef uint32_t Key; 29 30 // Helpers for hashing GrMtlSampler 31 static Key GenerateKey(GrSamplerState); 32 GetKey(const GrMtlSampler & sampler)33 static const Key& GetKey(const GrMtlSampler& sampler) { return sampler.fKey; } Hash(const Key & key)34 static uint32_t Hash(const Key& key) { 35 return SkOpts::hash(reinterpret_cast<const uint32_t*>(&key), sizeof(Key)); 36 } 37 38 #ifdef SK_TRACE_MANAGED_RESOURCES 39 /** output a human-readable dump of this resource's information 40 */ dumpInfo()41 void dumpInfo() const override { 42 SkDebugf("GrMtlSampler: %p (%ld refs)\n", fMtlSamplerState, 43 CFGetRetainCount((CFTypeRef)fMtlSamplerState)); 44 } 45 #endif 46 freeGPUData()47 void freeGPUData() const override { 48 fMtlSamplerState = nil; 49 } 50 51 private: GrMtlSampler(id<MTLSamplerState> mtlSamplerState,Key key)52 GrMtlSampler(id<MTLSamplerState> mtlSamplerState, Key key) 53 : fMtlSamplerState(mtlSamplerState) 54 , fKey(key) {} 55 56 mutable id<MTLSamplerState> fMtlSamplerState; 57 Key fKey; 58 }; 59 60 #endif 61