Chromium Code Reviews| 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 |
| } |