Index: src/gpu/vk/GrVkProgram.h |
diff --git a/src/gpu/vk/GrVkProgram.h b/src/gpu/vk/GrVkProgram.h |
index 1a024f2f2a6da81c9cec0f1c82145a4314ad5225..0735f05aa8dabfad64ac0c51d5b313da4da20fc8 100644 |
--- a/src/gpu/vk/GrVkProgram.h |
+++ b/src/gpu/vk/GrVkProgram.h |
@@ -47,11 +47,76 @@ public: |
void abandonGPUResources(); |
+ // The key is composed of two parts: |
+ // 1. uint32_t for total key length |
+ // 2. Vulkan specific data |
+ enum KeyOffsets { |
+ // Part 1. |
+ kLength_KeyOffset = 0, |
+ // Part 2. |
+ kData_KeyOffset = kLength_KeyOffset + sizeof(uint32_t), |
+ }; |
+ |
+ static void BuildVkKey(const GrPipeline&, GrPrimitiveType primitiveType, |
+ SkTArray<unsigned char, true>* key); |
+ |
+ struct PipelineDesc { |
+ uint32_t fChecksum; |
+ GrVkProgramDesc fProgramDesc; |
+ SkTArray<uint8_t, true> fVkKey; |
bsalomon
2016/03/22 14:00:33
Any idea what the typical size is? Wonder if we sh
egdaniel
2016/03/22 20:06:14
Changed this to STArray
|
+ |
+ bool operator== (const PipelineDesc& that) const { |
+ if (fChecksum != that.fChecksum || fProgramDesc != that.fProgramDesc) { |
+ return false; |
+ } |
+ // We store the keyLength at the start of fVkKey. Thus we don't have to worry about |
+ // different length keys since we will fail on the comparison immediately. Therefore we |
+ // just use this PipelineDesc to get the length to iterate over. |
+ int keyLength = fVkKey.count(); |
+ SkASSERT(SkIsAlign4(keyLength)); |
+ int l = keyLength >> 2; |
+ const uint32_t* aKey = reinterpret_cast<const uint32_t*>(fVkKey.begin()); |
+ const uint32_t* bKey = reinterpret_cast<const uint32_t*>(that.fVkKey.begin());; |
+ for (int i = 0; i < l; ++i) { |
+ if (aKey[i] != bKey[i]) { |
+ return false; |
+ } |
+ } |
+ return true; |
+ } |
+ |
+ static bool Less(const PipelineDesc& a, const PipelineDesc& b) { |
jvanverth1
2016/03/21 21:16:16
Is there a reason you didn't use operator<?
egdaniel
2016/03/21 22:23:52
Mostly just following the template from GL. SkTSea
|
+ if (a.fChecksum != b.fChecksum) { |
+ return a.fChecksum < b.fChecksum ? true : false; |
+ } |
+ bool progDescLess = GrProgramDesc::Less(a.fProgramDesc, b.fProgramDesc); |
+ if (progDescLess || a.fProgramDesc != b.fProgramDesc) { |
+ return progDescLess; |
+ } |
+ |
+ int keyLength = a.fVkKey.count(); |
+ SkASSERT(SkIsAlign4(keyLength)); |
+ int l = keyLength >> 2; |
+ const uint32_t* aKey = reinterpret_cast<const uint32_t*>(a.fVkKey.begin()); |
+ const uint32_t* bKey = reinterpret_cast<const uint32_t*>(b.fVkKey.begin());; |
+ for (int i = 0; i < l; ++i) { |
+ if (aKey[i] != bKey[i]) { |
+ return aKey[i] < bKey[i] ? true : false; |
+ } |
+ } |
+ return false; |
+ } |
+ |
+ }; |
+ |
+ const PipelineDesc& getDesc() { return fPipelineDesc; } |
+ |
private: |
typedef GrVkProgramDataManager::UniformInfoArray UniformInfoArray; |
typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
GrVkProgram(GrVkGpu* gpu, |
+ const GrVkProgram::PipelineDesc&, |
GrVkPipeline* pipeline, |
VkPipelineLayout layout, |
VkDescriptorSetLayout dsLayout[2], |
@@ -177,14 +242,14 @@ private: |
SkAutoTDelete<GrGLSLXferProcessor> fXferProcessor; |
GrGLSLFragProcs fFragmentProcessors; |
+ PipelineDesc fPipelineDesc; |
+ |
GrVkProgramDataManager fProgramDataManager; |
DescriptorPoolManager fSamplerPoolManager; |
DescriptorPoolManager fUniformPoolManager; |
-#ifdef SK_DEBUG |
int fNumSamplers; |
-#endif |
friend class GrVkProgramBuilder; |
}; |