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