| Index: content/renderer/gpu/gpu_benchmarking_extension.cc
|
| ===================================================================
|
| --- content/renderer/gpu/gpu_benchmarking_extension.cc (revision 149202)
|
| +++ content/renderer/gpu/gpu_benchmarking_extension.cc (working copy)
|
| @@ -6,29 +6,69 @@
|
|
|
| #include <string>
|
|
|
| +#include "base/file_path.h"
|
| +#include "base/file_util.h"
|
| #include "base/memory/scoped_vector.h"
|
| +#include "base/string_number_conversions.h"
|
| #include "content/public/renderer/render_thread.h"
|
| #include "content/renderer/all_rendering_benchmarks.h"
|
| +#include "content/renderer/render_view_impl.h"
|
| #include "content/renderer/rendering_benchmark.h"
|
| #include "content/renderer/rendering_benchmark_results.h"
|
| -#include "content/renderer/render_view_impl.h"
|
| +#include "third_party/skia/include/core/SkPicture.h"
|
| +#include "third_party/skia/include/core/SkStream.h"
|
| #include "third_party/WebKit/Source/Platform/chromium/public/WebRenderingStats.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebViewBenchmarkSupport.h"
|
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
|
| #include "v8/include/v8.h"
|
|
|
| +using WebKit::WebCanvas;
|
| using WebKit::WebFrame;
|
| using WebKit::WebPrivatePtr;
|
| -using WebKit::WebViewBenchmarkSupport;
|
| using WebKit::WebRenderingStats;
|
| +using WebKit::WebSize;
|
| using WebKit::WebView;
|
| +using WebKit::WebViewBenchmarkSupport;
|
|
|
| const char kGpuBenchmarkingExtensionName[] = "v8/GpuBenchmarking";
|
|
|
| -using WebKit::WebFrame;
|
| -using WebKit::WebView;
|
| +namespace {
|
|
|
| +class SkPictureRecorder : public WebViewBenchmarkSupport::PaintClient {
|
| + public:
|
| + explicit SkPictureRecorder(const FilePath& dirpath)
|
| + : dirpath_(dirpath),
|
| + layer_id_(0) {
|
| + }
|
| +
|
| + virtual WebCanvas* willPaint(const WebSize& size) {
|
| + return picture_.beginRecording(size.width, size.height);
|
| + }
|
| +
|
| + virtual void didPaint(WebCanvas* canvas) {
|
| + DCHECK(canvas == picture_.getRecordingCanvas());
|
| + picture_.endRecording();
|
| + // Serialize picture to file.
|
| + // TODO(alokp): Note that for this to work Chrome needs to be launched with
|
| + // --no-sandbox command-line flag. Get rid of this limitation.
|
| + // CRBUG: 139640.
|
| + std::string filename = "layer_" + base::IntToString(layer_id_++) + ".skp";
|
| + std::string filepath = dirpath_.AppendASCII(filename).MaybeAsASCII();
|
| + DCHECK(!filepath.empty());
|
| + SkFILEWStream file(filepath.c_str());
|
| + DCHECK(file.isValid());
|
| + picture_.serialize(&file);
|
| + }
|
| +
|
| + private:
|
| + FilePath dirpath_;
|
| + int layer_id_;
|
| + SkPicture picture_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| namespace content {
|
|
|
| // Benchmark results object that populates a v8 array.
|
| @@ -76,6 +116,10 @@
|
| " native function GetRenderingStats();"
|
| " return GetRenderingStats();"
|
| "};"
|
| + "chrome.gpuBenchmarking.printToSkPicture = function(dirname) {"
|
| + " native function PrintToSkPicture();"
|
| + " return PrintToSkPicture(dirname);"
|
| + "};"
|
| "chrome.gpuBenchmarking.beginSmoothScrollDown = "
|
| " function(scroll_far) {"
|
| " scroll_far = scroll_far || false;"
|
| @@ -96,6 +140,8 @@
|
| v8::Handle<v8::String> name) {
|
| if (name->Equals(v8::String::New("GetRenderingStats")))
|
| return v8::FunctionTemplate::New(GetRenderingStats);
|
| + if (name->Equals(v8::String::New("PrintToSkPicture")))
|
| + return v8::FunctionTemplate::New(PrintToSkPicture);
|
| if (name->Equals(v8::String::New("BeginSmoothScroll")))
|
| return v8::FunctionTemplate::New(BeginSmoothScroll);
|
| if (name->Equals(v8::String::New("RunRenderingBenchmarks")))
|
| @@ -140,6 +186,42 @@
|
| return stats_object;
|
| }
|
|
|
| + static v8::Handle<v8::Value> PrintToSkPicture(const v8::Arguments& args) {
|
| + if (args.Length() != 1)
|
| + return v8::Undefined();
|
| +
|
| + v8::String::AsciiValue dirname(args[0]);
|
| + if (dirname.length() == 0)
|
| + return v8::Undefined();
|
| +
|
| + WebFrame* web_frame = WebFrame::frameForEnteredContext();
|
| + if (!web_frame)
|
| + return v8::Undefined();
|
| +
|
| + WebView* web_view = web_frame->view();
|
| + if (!web_view)
|
| + return v8::Undefined();
|
| +
|
| + WebViewBenchmarkSupport* benchmark_support = web_view->benchmarkSupport();
|
| + if (!benchmark_support)
|
| + return v8::Undefined();
|
| +
|
| + FilePath dirpath;
|
| + dirpath = dirpath.AppendASCII(*dirname);
|
| + if (!file_util::CreateDirectory(dirpath) ||
|
| + !file_util::PathIsWritable(dirpath)) {
|
| + std::string msg("Path is not writable: ");
|
| + msg.append(dirpath.MaybeAsASCII());
|
| + return v8::ThrowException(v8::Exception::Error(
|
| + v8::String::New(msg.c_str(), msg.length())));
|
| + }
|
| +
|
| + SkPictureRecorder recorder(dirpath);
|
| + benchmark_support->paint(&recorder,
|
| + WebViewBenchmarkSupport::PaintModeEverything);
|
| + return v8::Undefined();
|
| + }
|
| +
|
| static v8::Handle<v8::Value> BeginSmoothScroll(const v8::Arguments& args) {
|
| WebFrame* web_frame = WebFrame::frameForEnteredContext();
|
| if (!web_frame)
|
|
|