From 8b6394c24f755db39936e4e5111a3f251cc56857 Mon Sep 17 00:00:00 2001 From: egdaniel Date: Fri, 4 Mar 2016 07:35:10 -0800 Subject: Add a cache of GrVkSamplers in GrVkResourceProvider. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1765523002 Review URL: https://codereview.chromium.org/1765523002 --- src/gpu/vk/GrVkResourceProvider.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/gpu/vk/GrVkResourceProvider.cpp') diff --git a/src/gpu/vk/GrVkResourceProvider.cpp b/src/gpu/vk/GrVkResourceProvider.cpp index 19bda41525..b273e3b65d 100644 --- a/src/gpu/vk/GrVkResourceProvider.cpp +++ b/src/gpu/vk/GrVkResourceProvider.cpp @@ -7,9 +7,11 @@ #include "GrVkResourceProvider.h" +#include "GrTextureParams.h" #include "GrVkCommandBuffer.h" #include "GrVkPipeline.h" #include "GrVkRenderPass.h" +#include "GrVkSampler.h" #include "GrVkUtil.h" #ifdef SK_TRACE_VK_RESOURCES @@ -81,6 +83,17 @@ GrVkDescriptorPool* GrVkResourceProvider::findOrCreateCompatibleDescriptorPool( return new GrVkDescriptorPool(fGpu, typeCounts); } +GrVkSampler* GrVkResourceProvider::findOrCreateCompatibleSampler(const GrTextureParams& params) { + GrVkSampler* sampler = fSamplers.find(GrVkSampler::GenerateKey(params)); + if (!sampler) { + sampler = GrVkSampler::Create(fGpu, params); + fSamplers.add(sampler); + } + SkASSERT(sampler); + sampler->ref(); + return sampler; +} + GrVkCommandBuffer* GrVkResourceProvider::createCommandBuffer() { GrVkCommandBuffer* cmdBuffer = GrVkCommandBuffer::Create(fGpu, fGpu->cmdPool()); fActiveCommandBuffers.push_back(cmdBuffer); @@ -112,6 +125,13 @@ void GrVkResourceProvider::destroyResources() { } fSimpleRenderPasses.reset(); + // Iterate through all store GrVkSamplers and unref them before resetting the hash. + SkTDynamicHash::Iter iter(&fSamplers); + for (; !iter.done(); ++iter) { + (*iter).unref(fGpu); + } + fSamplers.reset(); + #ifdef SK_TRACE_VK_RESOURCES SkASSERT(0 == GrVkResource::fTrace.count()); #endif @@ -133,6 +153,13 @@ void GrVkResourceProvider::abandonResources() { } fSimpleRenderPasses.reset(); + // Iterate through all store GrVkSamplers and unrefAndAbandon them before resetting the hash. + SkTDynamicHash::Iter iter(&fSamplers); + for (; !iter.done(); ++iter) { + (*iter).unrefAndAbandon(); + } + fSamplers.reset(); + #ifdef SK_TRACE_VK_RESOURCES SkASSERT(0 == GrVkResource::fTrace.count()); #endif -- cgit v1.2.3