From cd3e6e0e5ef22dc24aa2b1edcb43e4e51bdc006d Mon Sep 17 00:00:00 2001 From: Arseny Kapoulkine Date: Thu, 25 May 2017 07:16:48 -0700 Subject: [PATCH] pretransformanalyzer: Add bytes_fetched stat All other analyzers expose absolute metrics and compute relative metrics based on that; do the same for pretransform analyzer and expose the number of bytes fetched from memory. --- src/meshoptimizer.hpp | 3 ++- src/pretransformanalyzer.cpp | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/meshoptimizer.hpp b/src/meshoptimizer.hpp index 48ca11b2..be6da4fd 100644 --- a/src/meshoptimizer.hpp +++ b/src/meshoptimizer.hpp @@ -73,7 +73,8 @@ OverdrawStatistics analyzeOverdraw(const unsigned int* indices, size_t index_cou struct PreTransformCacheStatistics { - float overfetch; + unsigned int bytes_fetched; + float overfetch; // fetched bytes / vertex buffer size; best case 1.0 (each byte is fetched once) }; // Vertex fetch cache analyzer diff --git a/src/pretransformanalyzer.cpp b/src/pretransformanalyzer.cpp index f6d65e6f..6577a540 100644 --- a/src/pretransformanalyzer.cpp +++ b/src/pretransformanalyzer.cpp @@ -15,7 +15,6 @@ namespace // simple direct mapped cache; on typical mesh data this is close to 4-way cache, and this model is a gross approximation anyway size_t cache[kCacheSize / kCacheLine] = {}; - size_t fetched = 0; for (size_t i = 0; i < index_count; ++i) { @@ -34,12 +33,12 @@ namespace size_t line = tag % (sizeof(cache) / sizeof(cache[0])); // we store +1 since cache is filled with 0 by default - fetched += cache[line] != tag + 1; + result.bytes_fetched += (cache[line] != tag + 1) * kCacheLine; cache[line] = tag + 1; } } - result.overfetch = static_cast(fetched * kCacheLine) / static_cast(vertex_count * vertex_size); + result.overfetch = static_cast(result.bytes_fetched) / static_cast(vertex_count * vertex_size); return result; }