Index: src/gpu/vk/GrVkResourceProvider.h |
diff --git a/src/gpu/vk/GrVkResourceProvider.h b/src/gpu/vk/GrVkResourceProvider.h |
index 5e2d1723a1406f62ff360a230defc52980245e14..56a35160f337544646f1d60446fb7aee27131e49 100644 |
--- a/src/gpu/vk/GrVkResourceProvider.h |
+++ b/src/gpu/vk/GrVkResourceProvider.h |
@@ -15,6 +15,8 @@ |
#include "GrVkUtil.h" |
#include "SkTArray.h" |
#include "SkTDynamicHash.h" |
+#include "SkTHash.h" |
+#include "SkTInternalLList.h" |
#include "vulkan/vulkan.h" |
@@ -63,10 +65,10 @@ public: |
// The refcount is incremented and a pointer returned. |
GrVkSampler* findOrCreateCompatibleSampler(const GrTextureParams&); |
- GrVkPipelineState* findOrCreateCompatiblePipelineState(const GrPipeline&, |
- const GrPrimitiveProcessor&, |
- GrPrimitiveType, |
- const GrVkRenderPass& renderPass); |
+ sk_sp<GrVkPipelineState> findOrCreateCompatiblePipelineState(const GrPipeline&, |
+ const GrPrimitiveProcessor&, |
+ GrPrimitiveType, |
+ const GrVkRenderPass& renderPass); |
// Destroy any cached resources. To be called before destroying the VkDevice. |
// The assumption is that all queues are idle and all command buffers are finished. |
@@ -80,6 +82,11 @@ public: |
void abandonResources(); |
private: |
+ |
+#ifdef SK_DEVELOPER |
+#define GR_PIPELINE_STATE_CACHE_STATS |
+#endif |
+ |
class PipelineStateCache : public ::SkNoncopyable { |
public: |
PipelineStateCache(GrVkGpu* gpu); |
@@ -87,42 +94,31 @@ private: |
void abandon(); |
void release(); |
- GrVkPipelineState* refPipelineState(const GrPipeline&, |
- const GrPrimitiveProcessor&, |
- GrPrimitiveType, |
- const GrVkRenderPass& renderPass); |
+ sk_sp<GrVkPipelineState> refPipelineState(const GrPipeline&, |
+ const GrPrimitiveProcessor&, |
+ GrPrimitiveType, |
+ const GrVkRenderPass& renderPass); |
private: |
enum { |
// We may actually have kMaxEntries+1 PipelineStates in context because we create a new |
// PipelineState before evicting from the cache. |
kMaxEntries = 128, |
- kHashBits = 6, |
}; |
struct Entry; |
- struct PipelineDescLess; |
- |
void reset(); |
- // binary search for entry matching desc. returns index into fEntries that matches desc or ~ |
- // of the index of where it should be inserted. |
- int search(const GrVkPipelineState::Desc& desc) const; |
- |
- // sorted array of all the entries |
- Entry* fEntries[kMaxEntries]; |
- // hash table based on lowest kHashBits bits of the pipeline state key. Used to avoid binary |
- // searching fEntries. |
- Entry* fHashTable[1 << kHashBits]; |
- |
int fCount; |
- unsigned int fCurrLRUStamp; |
+ SkTHashTable<Entry*, const GrVkPipelineState::Desc&, Entry> fHashTable; |
+ SkTInternalLList<Entry> fLRUList; |
+ |
GrVkGpu* fGpu; |
-#ifdef PIPELINE_STATE_CACHE_STATS |
+ |
+#ifdef GR_PIPELINE_STATE_CACHE_STATS |
int fTotalRequests; |
int fCacheMisses; |
- int fHashMisses; // cache hit but hash table missed |
#endif |
}; |