| Index: content/renderer/skia_benchmarking_extension.cc
|
| diff --git a/content/renderer/skia_benchmarking_extension.cc b/content/renderer/skia_benchmarking_extension.cc
|
| index 078b51d2cd24d425a6f499e5e6ba015a307e139d..14dfe3bd720201218a76ee9cdf855d90897aa082 100644
|
| --- a/content/renderer/skia_benchmarking_extension.cc
|
| +++ b/content/renderer/skia_benchmarking_extension.cc
|
| @@ -4,14 +4,17 @@
|
|
|
| #include "content/renderer/skia_benchmarking_extension.h"
|
|
|
| +#include "base/time/time.h"
|
| #include "base/values.h"
|
| #include "cc/base/math_util.h"
|
| #include "cc/resources/picture.h"
|
| #include "content/public/renderer/v8_value_converter.h"
|
| +#include "skia/ext/benchmarking_canvas.h"
|
| #include "third_party/WebKit/public/platform/WebArrayBuffer.h"
|
| #include "third_party/WebKit/public/web/WebFrame.h"
|
| #include "third_party/skia/include/core/SkCanvas.h"
|
| #include "third_party/skia/include/core/SkColorPriv.h"
|
| +#include "third_party/skia/include/core/SkDevice.h"
|
| #include "third_party/skia/include/core/SkGraphics.h"
|
| #include "third_party/skia/src/utils/debugger/SkDebugCanvas.h"
|
| #include "third_party/skia/src/utils/debugger/SkDrawCommand.h"
|
| @@ -79,6 +82,17 @@ class SkiaBenchmarkingWrapper : public v8::Extension {
|
| " native function GetOps();"
|
| " return GetOps(picture);"
|
| "};"
|
| + "chrome.skiaBenchmarking.getOpTimings = function(picture) {"
|
| + " /* "
|
| + " Returns timing information for the given picture."
|
| + " @param {Object} picture A json-encoded cc::Picture."
|
| + " @returns { 'total_time': {Number}, 'cmd_times': [Number, ...] }"
|
| + " @returns undefined if the arguments are invalid or the picture"
|
| + " version is not supported."
|
| + " */"
|
| + " native function GetOpTimings();"
|
| + " return GetOpTimings(picture);"
|
| + "};"
|
| ) {
|
| content::SkiaBenchmarkingExtension::InitSkGraphics();
|
| }
|
| @@ -89,6 +103,8 @@ class SkiaBenchmarkingWrapper : public v8::Extension {
|
| return v8::FunctionTemplate::New(Rasterize);
|
| if (name->Equals(v8::String::New("GetOps")))
|
| return v8::FunctionTemplate::New(GetOps);
|
| + if (name->Equals(v8::String::New("GetOpTimings")))
|
| + return v8::FunctionTemplate::New(GetOpTimings);
|
|
|
| return v8::Handle<v8::FunctionTemplate>();
|
| }
|
| @@ -218,6 +234,43 @@ class SkiaBenchmarkingWrapper : public v8::Extension {
|
|
|
| args.GetReturnValue().Set(result);
|
| }
|
| +
|
| + static void GetOpTimings(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| + if (args.Length() != 1)
|
| + return;
|
| +
|
| + scoped_refptr<cc::Picture> picture = ParsePictureArg(args[0]);
|
| + if (!picture.get())
|
| + return;
|
| +
|
| + gfx::Rect bounds = picture->LayerRect();
|
| +
|
| + // Measure the total time by drawing straight into a bitmap-backed canvas.
|
| + skia::RefPtr<SkDevice> device = skia::AdoptRef(SkNEW_ARGS(SkDevice,
|
| + (SkBitmap::kARGB_8888_Config, bounds.width(), bounds.height())));
|
| + SkCanvas bitmap_canvas(device.get());
|
| + bitmap_canvas.clear(SK_ColorTRANSPARENT);
|
| + base::TimeTicks t0 = base::TimeTicks::HighResNow();
|
| + picture->Replay(&bitmap_canvas);
|
| + base::TimeDelta total_time = base::TimeTicks::HighResNow() - t0;
|
| +
|
| + // Gather per-op timing info by drawing into a BenchmarkingCanvas.
|
| + skia::BenchmarkingCanvas benchmarking_canvas(bounds.width(),
|
| + bounds.height());
|
| + picture->Replay(&benchmarking_canvas);
|
| +
|
| + v8::Local<v8::Array> op_times =
|
| + v8::Array::New(benchmarking_canvas.CommandCount());
|
| + for (size_t i = 0; i < benchmarking_canvas.CommandCount(); ++i)
|
| + op_times->Set(i, v8::Number::New(benchmarking_canvas.GetTime(i)));
|
| +
|
| + v8::Handle<v8::Object> result = v8::Object::New();
|
| + result->Set(v8::String::New("total_time"),
|
| + v8::Number::New(total_time.InMillisecondsF()));
|
| + result->Set(v8::String::New("cmd_times"), op_times);
|
| +
|
| + args.GetReturnValue().Set(result);
|
| + }
|
| };
|
|
|
| } // namespace
|
|
|