Index: src/gpu/vk/GrVkResourceProvider.h |
diff --git a/src/gpu/vk/GrVkResourceProvider.h b/src/gpu/vk/GrVkResourceProvider.h |
index 66a2556a9398ba7e9cfa8e8f1a48875072406456..5e2d1723a1406f62ff360a230defc52980245e14 100644 |
--- a/src/gpu/vk/GrVkResourceProvider.h |
+++ b/src/gpu/vk/GrVkResourceProvider.h |
@@ -8,7 +8,9 @@ |
#ifndef GrVkResourceProvider_DEFINED |
#define GrVkResourceProvider_DEFINED |
+#include "GrGpu.h" |
#include "GrVkDescriptorPool.h" |
+#include "GrVkPipelineState.h" |
#include "GrVkResource.h" |
#include "GrVkUtil.h" |
#include "SkTArray.h" |
@@ -61,6 +63,11 @@ public: |
// The refcount is incremented and a pointer returned. |
GrVkSampler* findOrCreateCompatibleSampler(const GrTextureParams&); |
+ 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. |
// For resource tracing to work properly, this should be called after unrefing all other |
@@ -73,6 +80,52 @@ public: |
void abandonResources(); |
private: |
+ class PipelineStateCache : public ::SkNoncopyable { |
+ public: |
+ PipelineStateCache(GrVkGpu* gpu); |
+ ~PipelineStateCache(); |
+ |
+ void abandon(); |
+ void release(); |
+ 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; |
+ GrVkGpu* fGpu; |
+#ifdef PIPELINE_STATE_CACHE_STATS |
+ int fTotalRequests; |
+ int fCacheMisses; |
+ int fHashMisses; // cache hit but hash table missed |
+#endif |
+ }; |
+ |
GrVkGpu* fGpu; |
// Central cache for creating pipelines |
@@ -86,8 +139,11 @@ private: |
SkSTArray<4, GrVkCommandBuffer*> fActiveCommandBuffers; |
// Stores GrVkSampler objects that we've already created so we can reuse them across multiple |
- // programs |
+ // GrVkPipelineStates |
SkTDynamicHash<GrVkSampler, uint8_t> fSamplers; |
+ |
+ // Cache of GrVkPipelineStates |
+ PipelineStateCache* fPipelineStateCache; |
}; |
#endif |