| Index: bench/nanobench.cpp
|
| diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
|
| index 65d9216e35090a21bf578f71c1574e269649024b..13ae9f6239aff951d5a5ca4a4aded236e9b4020f 100644
|
| --- a/bench/nanobench.cpp
|
| +++ b/bench/nanobench.cpp
|
| @@ -79,7 +79,7 @@ DEFINE_int32(overheadLoops, 100000, "Loops to estimate timer overhead.");
|
| DEFINE_double(overheadGoal, 0.0001,
|
| "Loop until timer overhead is at most this fraction of our measurments.");
|
| DEFINE_double(gpuMs, 5, "Target bench time in millseconds for GPU.");
|
| -DEFINE_int32(gpuFrameLag, 5, "Overestimate of maximum number of frames GPU allows to lag.");
|
| +DEFINE_int32(gpuFrameLag, 5, "If unknown, estimated maximum number of frames GPU allows to lag.");
|
| DEFINE_bool(gpuCompressAlphaMasks, false, "Compress masks generated from falling back to "
|
| "software path rendering.");
|
|
|
| @@ -144,7 +144,13 @@ struct GPUTarget : public Target {
|
| SK_GL(*this->gl, Finish());
|
| }
|
|
|
| - bool needsFrameTiming() const override { return true; }
|
| + bool needsFrameTiming(int* maxFrameLag) const override {
|
| + if (!this->gl->getMaxGpuFrameLag(maxFrameLag)) {
|
| + // Frame lag is unknown.
|
| + *maxFrameLag = FLAGS_gpuFrameLag;
|
| + }
|
| + return true;
|
| + }
|
| bool init(SkImageInfo info, Benchmark* bench) override {
|
| uint32_t flags = this->config.useDFText ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0;
|
| SkSurfaceProps props(flags, SkSurfaceProps::kLegacyFontHost_InitType);
|
| @@ -155,6 +161,10 @@ struct GPUTarget : public Target {
|
| if (!this->surface.get()) {
|
| return false;
|
| }
|
| + if (!this->gl->fenceSyncSupport()) {
|
| + SkDebugf("WARNING: GL context for config \"%s\" does not support fence sync. "
|
| + "Timings might not be accurate.\n", this->config.name);
|
| + }
|
| return true;
|
| }
|
| void fillOptions(ResultsWriter* log) override {
|
| @@ -307,7 +317,8 @@ static int cpu_bench(const double overhead, Target* target, Benchmark* bench, do
|
|
|
| static int gpu_bench(Target* target,
|
| Benchmark* bench,
|
| - double* samples) {
|
| + double* samples,
|
| + int maxGpuFrameLag) {
|
| // First, figure out how many loops it'll take to get a frame up to FLAGS_gpuMs.
|
| int loops = FLAGS_loops;
|
| if (kAutoTuneLoops == loops) {
|
| @@ -321,9 +332,8 @@ static int gpu_bench(Target* target,
|
| }
|
| loops *= 2;
|
| // If the GPU lets frames lag at all, we need to make sure we're timing
|
| - // _this_ round, not still timing last round. We force this by looping
|
| - // more times than any reasonable GPU will allow frames to lag.
|
| - for (int i = 0; i < FLAGS_gpuFrameLag; i++) {
|
| + // _this_ round, not still timing last round.
|
| + for (int i = 0; i < maxGpuFrameLag; i++) {
|
| elapsed = time(loops, bench, target);
|
| }
|
| } while (elapsed < FLAGS_gpuMs);
|
| @@ -340,7 +350,7 @@ static int gpu_bench(Target* target,
|
|
|
| // Pretty much the same deal as the calibration: do some warmup to make
|
| // sure we're timing steady-state pipelined frames.
|
| - for (int i = 0; i < FLAGS_gpuFrameLag; i++) {
|
| + for (int i = 0; i < maxGpuFrameLag - 1; i++) {
|
| time(loops, bench, target);
|
| }
|
|
|
| @@ -429,6 +439,9 @@ static void create_configs(SkTDArray<Config>* configs) {
|
| #ifdef SK_ANGLE
|
| GPU_CONFIG(angle, kANGLE_GLContextType, 0, false)
|
| #endif
|
| +#if SK_MESA
|
| + GPU_CONFIG(mesa, kMESA_GLContextType, 0, false)
|
| +#endif
|
| }
|
| #endif
|
|
|
| @@ -1008,9 +1021,10 @@ int nanobench_main() {
|
| targets[j]->setup();
|
| bench->perCanvasPreDraw(canvas);
|
|
|
| + int frameLag;
|
| const int loops =
|
| - targets[j]->needsFrameTiming()
|
| - ? gpu_bench(targets[j], bench.get(), samples.get())
|
| + targets[j]->needsFrameTiming(&frameLag)
|
| + ? gpu_bench(targets[j], bench.get(), samples.get(), frameLag)
|
| : cpu_bench(overhead, targets[j], bench.get(), samples.get());
|
|
|
| bench->perCanvasPostDraw(canvas);
|
|
|