/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrVkTexture_DEFINED #define GrVkTexture_DEFINED #include "include/gpu/vk/GrVkTypes.h" #include "src/core/SkLRUCache.h" #include "src/gpu/GrSamplerState.h" #include "src/gpu/GrTexture.h" #include "src/gpu/vk/GrVkAttachment.h" class GrVkDescriptorSet; class GrVkGpu; class GrVkImageView; struct GrVkImageInfo; class GrVkTexture : public GrTexture { public: static sk_sp MakeNewTexture(GrVkGpu*, SkBudgeted budgeted, SkISize dimensions, VkFormat format, uint32_t mipLevels, GrProtected, GrMipmapStatus); static sk_sp MakeWrappedTexture(GrVkGpu*, SkISize dimensions, GrWrapOwnership, GrWrapCacheable, GrIOType, const GrVkImageInfo&, sk_sp); ~GrVkTexture() override; GrBackendTexture getBackendTexture() const override; GrBackendFormat backendFormat() const override { return fTexture->getBackendFormat(); } void textureParamsModified() override {} GrVkAttachment* textureAttachment() const { return fTexture.get(); } const GrVkImageView* textureView(); // For each GrVkTexture, there is a cache of GrVkDescriptorSets which only contain a single // texture/sampler descriptor. If there is a cached descriptor set that matches the passed in // GrSamplerState, then a pointer to it is returned. The ref count is not incremented on the // returned pointer, thus the caller must call ref it if they wish to keep ownership of the // GrVkDescriptorSet. const GrVkDescriptorSet* cachedSingleDescSet(GrSamplerState); void addDescriptorSetToCache(const GrVkDescriptorSet*, GrSamplerState); protected: GrVkTexture(GrVkGpu*, SkISize dimensions, sk_sp texture, GrMipmapStatus); GrVkGpu* getVkGpu() const; void onAbandon() override; void onRelease() override; bool onStealBackendTexture(GrBackendTexture*, SkImage::BackendTextureReleaseProc*) override { return false; } // In Vulkan we call the release proc after we are finished with the underlying // GrVkImage::Resource object (which occurs after the GPU has finished all work on it). void onSetRelease(sk_sp releaseHelper) override { // Forward the release proc onto the fTexture's GrVkImage fTexture->setResourceRelease(std::move(releaseHelper)); } private: GrVkTexture(GrVkGpu*, SkBudgeted, SkISize, sk_sp texture, GrMipmapStatus); GrVkTexture(GrVkGpu*, SkISize, sk_sp texture, GrMipmapStatus, GrWrapCacheable, GrIOType, bool isExternal); sk_sp fTexture; struct SamplerHash { uint32_t operator()(GrSamplerState state) const { return state.asIndex(); } }; struct DescriptorCacheEntry; SkLRUCache, SamplerHash> fDescSetCache; static constexpr int kMaxCachedDescSets = 8; }; #endif