blob: c0c32ffa596a455c51789ebf17368b377449f864 [file] [log] [blame]
/*
* 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<GrVkTexture> MakeNewTexture(GrVkGpu*,
SkBudgeted budgeted,
SkISize dimensions,
VkFormat format,
uint32_t mipLevels,
GrProtected,
GrMipmapStatus);
static sk_sp<GrVkTexture> MakeWrappedTexture(GrVkGpu*,
SkISize dimensions,
GrWrapOwnership,
GrWrapCacheable,
GrIOType,
const GrVkImageInfo&,
sk_sp<GrBackendSurfaceMutableStateImpl>);
~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<GrVkAttachment> 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<GrRefCntedCallback> releaseHelper) override {
// Forward the release proc onto the fTexture's GrVkImage
fTexture->setResourceRelease(std::move(releaseHelper));
}
private:
GrVkTexture(GrVkGpu*, SkBudgeted, SkISize, sk_sp<GrVkAttachment> texture, GrMipmapStatus);
GrVkTexture(GrVkGpu*, SkISize, sk_sp<GrVkAttachment> texture, GrMipmapStatus,
GrWrapCacheable, GrIOType, bool isExternal);
sk_sp<GrVkAttachment> fTexture;
struct SamplerHash {
uint32_t operator()(GrSamplerState state) const { return state.asIndex(); }
};
struct DescriptorCacheEntry;
SkLRUCache<const GrSamplerState, std::unique_ptr<DescriptorCacheEntry>, SamplerHash>
fDescSetCache;
static constexpr int kMaxCachedDescSets = 8;
};
#endif