1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrVkSampler_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrVkSampler_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMacros.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/vk/SkiaVulkan.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkChecksum.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrManagedResource.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkManagedResource.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/vk/GrVkSamplerYcbcrConversion.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker #include <atomic> 21*c8dee2aaSAndroid Build Coastguard Worker #include <cinttypes> 22*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker class GrSamplerState; 25*c8dee2aaSAndroid Build Coastguard Worker class GrVkGpu; 26*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 27*c8dee2aaSAndroid Build Coastguard Worker struct VulkanYcbcrConversionInfo; 28*c8dee2aaSAndroid Build Coastguard Worker } 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker class GrVkSampler : public GrVkManagedResource { 31*c8dee2aaSAndroid Build Coastguard Worker public: 32*c8dee2aaSAndroid Build Coastguard Worker static GrVkSampler* Create(GrVkGpu* gpu, 33*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState, 34*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanYcbcrConversionInfo&); 35*c8dee2aaSAndroid Build Coastguard Worker sampler()36*c8dee2aaSAndroid Build Coastguard Worker VkSampler sampler() const { return fSampler; } samplerPtr()37*c8dee2aaSAndroid Build Coastguard Worker const VkSampler* samplerPtr() const { return &fSampler; } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker SK_BEGIN_REQUIRE_DENSE 40*c8dee2aaSAndroid Build Coastguard Worker struct Key { KeyKey41*c8dee2aaSAndroid Build Coastguard Worker Key(uint32_t samplerKey, const GrVkSamplerYcbcrConversion::Key& ycbcrKey) { 42*c8dee2aaSAndroid Build Coastguard Worker fSamplerKey = samplerKey; 43*c8dee2aaSAndroid Build Coastguard Worker fYcbcrKey = ycbcrKey; 44*c8dee2aaSAndroid Build Coastguard Worker } 45*c8dee2aaSAndroid Build Coastguard Worker GrVkSamplerYcbcrConversion::Key fYcbcrKey; 46*c8dee2aaSAndroid Build Coastguard Worker uint32_t fSamplerKey; 47*c8dee2aaSAndroid Build Coastguard Worker uint32_t fPadding = 0; 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const Key& that) const { 50*c8dee2aaSAndroid Build Coastguard Worker return this->fSamplerKey == that.fSamplerKey && 51*c8dee2aaSAndroid Build Coastguard Worker this->fYcbcrKey == that.fYcbcrKey; 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker }; 54*c8dee2aaSAndroid Build Coastguard Worker SK_END_REQUIRE_DENSE 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker // Helpers for hashing GrVkSampler 57*c8dee2aaSAndroid Build Coastguard Worker static Key GenerateKey(GrSamplerState, const skgpu::VulkanYcbcrConversionInfo&); 58*c8dee2aaSAndroid Build Coastguard Worker GetKey(const GrVkSampler & sampler)59*c8dee2aaSAndroid Build Coastguard Worker static const Key& GetKey(const GrVkSampler& sampler) { return sampler.fKey; } Hash(const Key & key)60*c8dee2aaSAndroid Build Coastguard Worker static uint32_t Hash(const Key& key) { 61*c8dee2aaSAndroid Build Coastguard Worker return SkChecksum::Hash32(&key, sizeof(Key)); 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker uniqueID()64*c8dee2aaSAndroid Build Coastguard Worker uint32_t uniqueID() const { return fUniqueID; } 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_TRACE_MANAGED_RESOURCES dumpInfo()67*c8dee2aaSAndroid Build Coastguard Worker void dumpInfo() const override { 68*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("GrVkSampler: %" PRIdPTR " (%d refs)\n", (intptr_t)fSampler, this->getRefCnt()); 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker #endif 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker private: GrVkSampler(const GrVkGpu * gpu,VkSampler sampler,GrVkSamplerYcbcrConversion * ycbcrConversion,Key key)73*c8dee2aaSAndroid Build Coastguard Worker GrVkSampler(const GrVkGpu* gpu, VkSampler sampler, 74*c8dee2aaSAndroid Build Coastguard Worker GrVkSamplerYcbcrConversion* ycbcrConversion, Key key) 75*c8dee2aaSAndroid Build Coastguard Worker : INHERITED(gpu) 76*c8dee2aaSAndroid Build Coastguard Worker , fSampler(sampler) 77*c8dee2aaSAndroid Build Coastguard Worker , fYcbcrConversion(ycbcrConversion) 78*c8dee2aaSAndroid Build Coastguard Worker , fKey(key) 79*c8dee2aaSAndroid Build Coastguard Worker , fUniqueID(GenID()) {} 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker void freeGPUData() const override; 82*c8dee2aaSAndroid Build Coastguard Worker GenID()83*c8dee2aaSAndroid Build Coastguard Worker static uint32_t GenID() { 84*c8dee2aaSAndroid Build Coastguard Worker static std::atomic<uint32_t> nextID{1}; 85*c8dee2aaSAndroid Build Coastguard Worker uint32_t id; 86*c8dee2aaSAndroid Build Coastguard Worker do { 87*c8dee2aaSAndroid Build Coastguard Worker id = nextID++; 88*c8dee2aaSAndroid Build Coastguard Worker } while (id == SK_InvalidUniqueID); 89*c8dee2aaSAndroid Build Coastguard Worker return id; 90*c8dee2aaSAndroid Build Coastguard Worker } 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker VkSampler fSampler; 93*c8dee2aaSAndroid Build Coastguard Worker GrVkSamplerYcbcrConversion* fYcbcrConversion; 94*c8dee2aaSAndroid Build Coastguard Worker Key fKey; 95*c8dee2aaSAndroid Build Coastguard Worker uint32_t fUniqueID; 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrVkManagedResource; 98*c8dee2aaSAndroid Build Coastguard Worker }; 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker #endif 101