1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2016 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 GrVkSampler_DEFINED 9cb93a386Sopenharmony_ci#define GrVkSampler_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/gpu/vk/GrVkTypes.h" 12cb93a386Sopenharmony_ci#include "src/core/SkOpts.h" 13cb93a386Sopenharmony_ci#include "src/gpu/vk/GrVkManagedResource.h" 14cb93a386Sopenharmony_ci#include "src/gpu/vk/GrVkSamplerYcbcrConversion.h" 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ci#include <atomic> 17cb93a386Sopenharmony_ci#include <cinttypes> 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ciclass GrSamplerState; 20cb93a386Sopenharmony_ciclass GrVkGpu; 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ciclass GrVkSampler : public GrVkManagedResource { 23cb93a386Sopenharmony_cipublic: 24cb93a386Sopenharmony_ci static GrVkSampler* Create(GrVkGpu* gpu, GrSamplerState, const GrVkYcbcrConversionInfo&); 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci VkSampler sampler() const { return fSampler; } 27cb93a386Sopenharmony_ci const VkSampler* samplerPtr() const { return &fSampler; } 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci struct Key { 30cb93a386Sopenharmony_ci Key(uint8_t samplerKey, const GrVkSamplerYcbcrConversion::Key& ycbcrKey) { 31cb93a386Sopenharmony_ci // We must memset here since the GrVkSamplerYcbcrConversion has a 64 bit value which may 32cb93a386Sopenharmony_ci // force alignment padding to occur in the middle of the Key struct. 33cb93a386Sopenharmony_ci memset(this, 0, sizeof(Key)); 34cb93a386Sopenharmony_ci fSamplerKey = samplerKey; 35cb93a386Sopenharmony_ci fYcbcrKey = ycbcrKey; 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci uint8_t fSamplerKey; 38cb93a386Sopenharmony_ci GrVkSamplerYcbcrConversion::Key fYcbcrKey; 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci bool operator==(const Key& that) const { 41cb93a386Sopenharmony_ci return this->fSamplerKey == that.fSamplerKey && 42cb93a386Sopenharmony_ci this->fYcbcrKey == that.fYcbcrKey; 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci }; 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci // Helpers for hashing GrVkSampler 47cb93a386Sopenharmony_ci static Key GenerateKey(GrSamplerState, const GrVkYcbcrConversionInfo&); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci static const Key& GetKey(const GrVkSampler& sampler) { return sampler.fKey; } 50cb93a386Sopenharmony_ci static uint32_t Hash(const Key& key) { 51cb93a386Sopenharmony_ci return SkOpts::hash(reinterpret_cast<const uint32_t*>(&key), sizeof(Key)); 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci uint32_t uniqueID() const { return fUniqueID; } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci#ifdef SK_TRACE_MANAGED_RESOURCES 57cb93a386Sopenharmony_ci void dumpInfo() const override { 58cb93a386Sopenharmony_ci SkDebugf("GrVkSampler: %" PRIdPTR " (%d refs)\n", (intptr_t)fSampler, this->getRefCnt()); 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci#endif 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ciprivate: 63cb93a386Sopenharmony_ci GrVkSampler(const GrVkGpu* gpu, VkSampler sampler, 64cb93a386Sopenharmony_ci GrVkSamplerYcbcrConversion* ycbcrConversion, Key key) 65cb93a386Sopenharmony_ci : INHERITED(gpu) 66cb93a386Sopenharmony_ci , fSampler(sampler) 67cb93a386Sopenharmony_ci , fYcbcrConversion(ycbcrConversion) 68cb93a386Sopenharmony_ci , fKey(key) 69cb93a386Sopenharmony_ci , fUniqueID(GenID()) {} 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci void freeGPUData() const override; 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci static uint32_t GenID() { 74cb93a386Sopenharmony_ci static std::atomic<uint32_t> nextID{1}; 75cb93a386Sopenharmony_ci uint32_t id; 76cb93a386Sopenharmony_ci do { 77cb93a386Sopenharmony_ci id = nextID++; 78cb93a386Sopenharmony_ci } while (id == SK_InvalidUniqueID); 79cb93a386Sopenharmony_ci return id; 80cb93a386Sopenharmony_ci } 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ci VkSampler fSampler; 83cb93a386Sopenharmony_ci GrVkSamplerYcbcrConversion* fYcbcrConversion; 84cb93a386Sopenharmony_ci Key fKey; 85cb93a386Sopenharmony_ci uint32_t fUniqueID; 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci using INHERITED = GrVkManagedResource; 88cb93a386Sopenharmony_ci}; 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci#endif 91