Index: src/gpu/vk/GrVkProgramCache.cpp |
diff --git a/src/gpu/gl/GrGLGpuProgramCache.cpp b/src/gpu/vk/GrVkProgramCache.cpp |
similarity index 57% |
copy from src/gpu/gl/GrGLGpuProgramCache.cpp |
copy to src/gpu/vk/GrVkProgramCache.cpp |
index f37264aa1de14931035f4899f20164994dafb6a9..6dbb28e84393a4d01299f400bd2ec4320e99f565 100644 |
--- a/src/gpu/gl/GrGLGpuProgramCache.cpp |
+++ b/src/gpu/vk/GrVkProgramCache.cpp |
@@ -1,19 +1,20 @@ |
/* |
- * Copyright 2011 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
+* Copyright 2016 Google Inc. |
bsalomon
2016/03/22 14:00:33
spaces?
|
+* |
+* Use of this source code is governed by a BSD-style license that can be |
+* found in the LICENSE file. |
+*/ |
-#include "GrGLGpu.h" |
+#include "GrVkResourceProvider.h" |
-#include "builders/GrGLProgramBuilder.h" |
+#include "GrVkGpu.h" |
#include "GrProcessor.h" |
-#include "GrGLPathRendering.h" |
-#include "glsl/GrGLSLFragmentProcessor.h" |
-#include "glsl/GrGLSLProgramDataManager.h" |
+#include "GrVkProgram.h" |
+#include "GrVkProgramBuilder.h" |
#include "SkRTConf.h" |
#include "SkTSearch.h" |
+#include "glsl/GrGLSLFragmentProcessor.h" |
+#include "glsl/GrGLSLProgramDataManager.h" |
#ifdef PROGRAM_CACHE_STATS |
SK_CONF_DECLARE(bool, c_DisplayCache, "gpu.displayCache", false, |
@@ -22,27 +23,27 @@ SK_CONF_DECLARE(bool, c_DisplayCache, "gpu.displayCache", false, |
typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
-struct GrGLGpu::ProgramCache::Entry { |
- |
+struct GrVkResourceProvider::ProgramCache::Entry { |
+ |
Entry() : fProgram(nullptr), fLRUStamp(0) {} |
- SkAutoTUnref<GrGLProgram> fProgram; |
+ SkAutoTUnref<GrVkProgram> fProgram; |
unsigned int fLRUStamp; |
}; |
-struct GrGLGpu::ProgramCache::ProgDescLess { |
- bool operator() (const GrProgramDesc& desc, const Entry* entry) { |
+struct GrVkResourceProvider::ProgramCache::PipelineDescLess { |
+ bool operator() (const GrVkProgram::PipelineDesc& desc, const Entry* entry) { |
SkASSERT(entry->fProgram.get()); |
- return GrProgramDesc::Less(desc, entry->fProgram->getDesc()); |
+ return GrVkProgram::PipelineDesc::Less(desc, entry->fProgram->getDesc()); |
} |
- bool operator() (const Entry* entry, const GrProgramDesc& desc) { |
+ bool operator() (const Entry* entry, const GrVkProgram::PipelineDesc& desc) { |
SkASSERT(entry->fProgram.get()); |
- return GrProgramDesc::Less(entry->fProgram->getDesc(), desc); |
+ return GrVkProgram::PipelineDesc::Less(entry->fProgram->getDesc(), desc); |
} |
}; |
-GrGLGpu::ProgramCache::ProgramCache(GrGLGpu* gpu) |
+GrVkResourceProvider::ProgramCache::ProgramCache(GrVkGpu* gpu) |
: fCount(0) |
, fCurrLRUStamp(0) |
, fGpu(gpu) |
@@ -57,10 +58,8 @@ GrGLGpu::ProgramCache::ProgramCache(GrGLGpu* gpu) |
} |
} |
-GrGLGpu::ProgramCache::~ProgramCache() { |
- for (int i = 0; i < fCount; ++i){ |
- delete fEntries[i]; |
- } |
+GrVkResourceProvider::ProgramCache::~ProgramCache() { |
+ SkASSERT(0 == fCount); |
// dump stats |
#ifdef PROGRAM_CACHE_STATS |
if (c_DisplayCache) { |
@@ -68,8 +67,8 @@ GrGLGpu::ProgramCache::~ProgramCache() { |
SkDebugf("Total requests: %d\n", fTotalRequests); |
SkDebugf("Cache misses: %d\n", fCacheMisses); |
SkDebugf("Cache miss %%: %f\n", (fTotalRequests > 0) ? |
- 100.f * fCacheMisses / fTotalRequests : |
- 0.f); |
+ 100.f * fCacheMisses / fTotalRequests : |
+ 0.f); |
int cacheHits = fTotalRequests - fCacheMisses; |
SkDebugf("Hash miss %%: %f\n", (cacheHits > 0) ? 100.f * fHashMisses / cacheHits : 0.f); |
SkDebugf("---------------------\n"); |
@@ -77,10 +76,8 @@ GrGLGpu::ProgramCache::~ProgramCache() { |
#endif |
} |
-void GrGLGpu::ProgramCache::reset() { |
+void GrVkResourceProvider::ProgramCache::reset() { |
for (int i = 0; i < fCount; ++i) { |
- SkASSERT(fEntries[i]->fProgram.get()); |
- fEntries[i]->fProgram->abandon(); |
delete fEntries[i]; |
fEntries[i] = nullptr; |
} |
@@ -92,44 +89,64 @@ void GrGLGpu::ProgramCache::reset() { |
} |
fCurrLRUStamp = 0; |
-#ifdef PROGRAM_CACHE_STATS |
- fTotalRequests = 0; |
- fCacheMisses = 0; |
- fHashMisses = 0; |
-#endif |
} |
-void GrGLGpu::ProgramCache::abandon() { |
+void GrVkResourceProvider::ProgramCache::abandon() { |
+ for (int i = 0; i < fCount; ++i) { |
+ SkASSERT(fEntries[i]->fProgram.get()); |
+ fEntries[i]->fProgram->abandonGPUResources(); |
+ } |
+ this->reset(); |
+} |
+ |
+void GrVkResourceProvider::ProgramCache::release() { |
+ for (int i = 0; i < fCount; ++i) { |
+ SkASSERT(fEntries[i]->fProgram.get()); |
+ fEntries[i]->fProgram->freeGPUResources(fGpu); |
+ } |
this->reset(); |
} |
-int GrGLGpu::ProgramCache::search(const GrProgramDesc& desc) const { |
- ProgDescLess less; |
+int GrVkResourceProvider::ProgramCache::search(const GrVkProgram::PipelineDesc& desc) const { |
+ PipelineDescLess less; |
return SkTSearch(fEntries, fCount, desc, sizeof(Entry*), less); |
} |
-GrGLProgram* GrGLGpu::ProgramCache::refProgram(const GrGLGpu* gpu, |
- const GrPipeline& pipeline, |
- const GrPrimitiveProcessor& primProc) { |
+GrVkProgram* GrVkResourceProvider::ProgramCache::refProgram(const GrPipeline& pipeline, |
+ const GrPrimitiveProcessor& primProc, |
+ GrPrimitiveType primiteType, |
+ const GrVkRenderPass& renderPass) { |
#ifdef PROGRAM_CACHE_STATS |
++fTotalRequests; |
#endif |
- // Get GrGLProgramDesc |
- GrGLProgramDesc desc; |
- if (!GrGLProgramDescBuilder::Build(&desc, primProc, pipeline, *gpu->glCaps().glslCaps())) { |
- GrCapsDebugf(gpu->caps(), "Failed to gl program descriptor!\n"); |
- return nullptr; |
+ Entry* entry = nullptr; |
+ |
+ // Get GrVkProgramDesc |
+ GrVkProgram::PipelineDesc desc; |
+ if (!GrVkProgramDescBuilder::Build(&desc.fProgramDesc, |
+ primProc, |
+ pipeline, |
+ *fGpu->vkCaps().glslCaps())) { |
+ GrCapsDebugf(fGpu->caps(), "Failed to vk program descriptor!\n"); |
jvanverth1
2016/03/21 21:16:16
Failed to build?
|
+ return false; |
} |
- Entry* entry = nullptr; |
+ // Get vulkan specific descriptor key |
+ GrVkProgram::BuildVkKey(pipeline, primiteType, &desc.fVkKey); |
+ // Get checksum of entire PipelineDesc |
+ int keyLength = desc.fVkKey.count(); |
+ SkASSERT(0 == (keyLength % 4)); |
+ // Seed the checksum with the checksome of the programDesc then add the vulkan key to it. |
jvanverth1
2016/03/21 21:16:16
Checksum (sp)
|
+ desc.fChecksum = SkChecksum::Murmur3(desc.fVkKey.begin(), keyLength, |
+ desc.fProgramDesc.getChecksum()); |
- uint32_t hashIdx = desc.getChecksum(); |
+ uint32_t hashIdx = desc.fChecksum; |
hashIdx ^= hashIdx >> 16; |
if (kHashBits <= 8) { |
hashIdx ^= hashIdx >> 8; |
} |
- hashIdx &=((1 << kHashBits) - 1); |
+ hashIdx &= ((1 << kHashBits) - 1); |
Entry* hashedEntry = fHashTable[hashIdx]; |
if (hashedEntry && hashedEntry->fProgram->getDesc() == desc) { |
SkASSERT(hashedEntry->fProgram); |
@@ -152,7 +169,12 @@ GrGLProgram* GrGLGpu::ProgramCache::refProgram(const GrGLGpu* gpu, |
#ifdef PROGRAM_CACHE_STATS |
++fCacheMisses; |
#endif |
- GrGLProgram* program = GrGLProgramBuilder::CreateProgram(pipeline, primProc, desc, fGpu); |
+ GrVkProgram* program = GrVkProgramBuilder::CreateProgram(fGpu, |
+ pipeline, |
+ primProc, |
+ primiteType, |
+ desc, |
+ renderPass); |
if (nullptr == program) { |
return nullptr; |
} |
@@ -170,10 +192,11 @@ GrGLProgram* GrGLGpu::ProgramCache::refProgram(const GrGLGpu* gpu, |
} |
} |
entry = fEntries[purgeIdx]; |
- int purgedHashIdx = entry->fProgram->getDesc().getChecksum() & ((1 << kHashBits) - 1); |
+ int purgedHashIdx = entry->fProgram->getDesc().fChecksum & ((1 << kHashBits) - 1); |
if (fHashTable[purgedHashIdx] == entry) { |
fHashTable[purgedHashIdx] = nullptr; |
} |
+ entry->fProgram->freeGPUResources(fGpu); |
} |
SkASSERT(fEntries[purgeIdx] == entry); |
entry->fProgram.reset(program); |
@@ -202,10 +225,10 @@ GrGLProgram* GrGLGpu::ProgramCache::refProgram(const GrGLGpu* gpu, |
SkASSERT(fEntries[0]->fProgram.get()); |
for (int i = 0; i < fCount - 1; ++i) { |
SkASSERT(fEntries[i + 1]->fProgram.get()); |
- const GrProgramDesc& a = fEntries[i]->fProgram->getDesc(); |
- const GrProgramDesc& b = fEntries[i + 1]->fProgram->getDesc(); |
- SkASSERT(GrProgramDesc::Less(a, b)); |
- SkASSERT(!GrProgramDesc::Less(b, a)); |
+ const GrVkProgram::PipelineDesc& a = fEntries[i]->fProgram->getDesc(); |
+ const GrVkProgram::PipelineDesc& b = fEntries[i + 1]->fProgram->getDesc(); |
+ SkASSERT(GrVkProgram::PipelineDesc::Less(a, b)); |
+ SkASSERT(!GrVkProgram::PipelineDesc::Less(b, a)); |
} |
#endif |
} |