void inspectCache(Cache cache) { unsigned int max_cache_size = 200; unsigned int grid_size = 100; for (unsigned int cache_size = 3; cache_size <= max_cache_size; cache_size += 1) { std::vector<unsigned int> grid1; gridGen(grid1, 0, grid_size, 0, grid_size, grid_size, cache_size, true); std::vector<unsigned int> grid2; gridGen(grid2, 0, grid_size, 0, grid_size, grid_size, cache_size, false); std::vector<unsigned int> grid3; gridGen(grid3, 0, grid_size, 0, grid_size, grid_size, grid_size * 4, false); // this generates a simple indexed grid without striping/degenerate triangles meshopt_optimizeVertexCacheFifo(&grid3[0], &grid3[0], grid3.size(), (grid_size + 1) * (grid_size + 1), cache_size); std::vector<unsigned int> grid4; gridGen(grid4, 0, grid_size, 0, grid_size, grid_size, grid_size * 4, false); // this generates a simple indexed grid without striping/degenerate triangles meshopt_optimizeVertexCache(&grid4[0], &grid4[0], grid4.size(), (grid_size + 1) * (grid_size + 1)); unsigned int invocations1 = cache(&grid1[0], grid1.size()); unsigned int invocations2 = cache(&grid2[0], grid2.size()); unsigned int invocations3 = cache(&grid3[0], grid3.size()); unsigned int invocations4 = cache(&grid4[0], grid4.size()); unsigned int ideal_invocations = (grid_size + 1) * (grid_size + 1); printf("%d, %f, %f, %f, %f\n", cache_size, double(invocations1) / double(ideal_invocations), double(invocations2) / double(ideal_invocations), double(invocations3) / double(ideal_invocations), double(invocations4) / double(ideal_invocations)); } }
void gridGen(std::vector<unsigned int>& indices, int x0, int x1, int y0, int y1, int width, int cacheSize, bool prefetch) { if (x1 - x0 + 1 < cacheSize) { bool prefetchStrip = 2 * (x1 - x0) + 1 > cacheSize && prefetch; stripGen(indices, x0, x1, y0, y1, width, prefetchStrip); } else { int xm = x0 + cacheSize - 2; gridGen(indices, x0, xm, y0, y1, width, cacheSize, prefetch); gridGen(indices, xm, x1, y0, y1, width, cacheSize, prefetch); } }
int main(){ struct Block**x = gridGen(); randGenN(x); printf("\033[2J\033[1;1H"); clearScreen(); printGrid(x); char a=' '; while(a!='q'){ a=getChar(); if(a==27&& getChar()==91){ a=getChar(); switch(a){ case 'A': up(x); break; case 'B': down(x); break; case 'C': right(x); break; case 'D': left(x); break; default:break; } randGenN(x); } clearScreen(); printGrid(x); } return 0; }