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 GrVkSamplerYcbcrConverison_DEFINED 9cb93a386Sopenharmony_ci#define GrVkSamplerYcbcrConverison_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "src/gpu/vk/GrVkManagedResource.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include "include/gpu/vk/GrVkTypes.h" 14cb93a386Sopenharmony_ci#include "src/core/SkOpts.h" 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ci#include <cinttypes> 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ciclass GrVkGpu; 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ciclass GrVkSamplerYcbcrConversion : public GrVkManagedResource { 21cb93a386Sopenharmony_cipublic: 22cb93a386Sopenharmony_ci static GrVkSamplerYcbcrConversion* Create(GrVkGpu* gpu, const GrVkYcbcrConversionInfo&); 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci VkSamplerYcbcrConversion ycbcrConversion() const { return fYcbcrConversion; } 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci struct Key { 27cb93a386Sopenharmony_ci Key() : fVkFormat(VK_FORMAT_UNDEFINED), fExternalFormat(0), fConversionKey(0) {} 28cb93a386Sopenharmony_ci Key(VkFormat vkFormat, uint64_t externalFormat, uint8_t conversionKey) { 29cb93a386Sopenharmony_ci memset(this, 0, sizeof(Key)); 30cb93a386Sopenharmony_ci fVkFormat = vkFormat; 31cb93a386Sopenharmony_ci fExternalFormat = externalFormat; 32cb93a386Sopenharmony_ci fConversionKey = conversionKey; 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci VkFormat fVkFormat; 36cb93a386Sopenharmony_ci uint64_t fExternalFormat; 37cb93a386Sopenharmony_ci uint8_t fConversionKey; 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci bool operator==(const Key& that) const { 40cb93a386Sopenharmony_ci return this->fVkFormat == that.fVkFormat && 41cb93a386Sopenharmony_ci this->fExternalFormat == that.fExternalFormat && 42cb93a386Sopenharmony_ci this->fConversionKey == that.fConversionKey; 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci }; 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci // Helpers for hashing GrVkSamplerYcbcrConversion 47cb93a386Sopenharmony_ci static Key GenerateKey(const GrVkYcbcrConversionInfo& ycbcrInfo); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci static const Key& GetKey(const GrVkSamplerYcbcrConversion& ycbcrConversion) { 50cb93a386Sopenharmony_ci return ycbcrConversion.fKey; 51cb93a386Sopenharmony_ci } 52cb93a386Sopenharmony_ci static uint32_t Hash(const Key& key) { 53cb93a386Sopenharmony_ci return SkOpts::hash(reinterpret_cast<const uint32_t*>(&key), sizeof(Key)); 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci#ifdef SK_TRACE_MANAGED_RESOURCES 57cb93a386Sopenharmony_ci void dumpInfo() const override { 58cb93a386Sopenharmony_ci SkDebugf("GrVkSamplerYcbcrConversion: %" PRIdPTR " (%d refs)\n", (intptr_t)fYcbcrConversion, 59cb93a386Sopenharmony_ci this->getRefCnt()); 60cb93a386Sopenharmony_ci } 61cb93a386Sopenharmony_ci#endif 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ciprivate: 64cb93a386Sopenharmony_ci GrVkSamplerYcbcrConversion(const GrVkGpu* gpu, VkSamplerYcbcrConversion ycbcrConversion, 65cb93a386Sopenharmony_ci Key key) 66cb93a386Sopenharmony_ci : INHERITED(gpu) 67cb93a386Sopenharmony_ci , fYcbcrConversion(ycbcrConversion) 68cb93a386Sopenharmony_ci , fKey(key) {} 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci void freeGPUData() const override; 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci VkSamplerYcbcrConversion fYcbcrConversion; 73cb93a386Sopenharmony_ci Key fKey; 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci using INHERITED = GrVkManagedResource; 76cb93a386Sopenharmony_ci}; 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci#endif 79cb93a386Sopenharmony_ci 80