Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(462)

Unified Diff: src/gpu/vk/GrVkProgramCache.cpp

Issue 1816153002: Set up cache in vulkan to reuse GrVkPrograms (aka VkPipelines) (Closed) Base URL: https://skia.googlesource.com/skia.git@progSamplers
Patch Set: cleanup Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
}

Powered by Google App Engine
This is Rietveld 408576698