Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Unified Diff: content/renderer/gpu/gpu_benchmarking_extension.cc

Issue 10787025: Expose a gpu-benchmark-only measureRecordTime API to JS. This function measures the time it takes t… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/gpu/gpu_benchmarking_extension.cc
===================================================================
--- content/renderer/gpu/gpu_benchmarking_extension.cc (revision 146858)
+++ content/renderer/gpu/gpu_benchmarking_extension.cc (working copy)
@@ -4,10 +4,12 @@
#include "content/renderer/gpu/gpu_benchmarking_extension.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/WebKit/chromium/public/WebFrame.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/WebFrame.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebViewBenchmarkSupport.h"
#include "v8/include/v8.h"
using WebKit::WebFrame;
@@ -16,9 +18,31 @@
const char kGpuBenchmarkingExtensionName[] = "v8/GpuBenchmarking";
+using WebKit::WebCanvas;
using WebKit::WebFrame;
+using WebKit::WebSize;
using WebKit::WebView;
+using WebKit::WebViewBenchmarkSupport;
+namespace {
+class SkPictureRecordingController
+ : public WebViewBenchmarkSupport::PaintingController {
+ public:
+ SkPictureRecordingController(SkPicture* picture) : picture_(picture) { }
+
+ // WebViewBenchmarkSupport::PaintingController overrides.
+ virtual WebCanvas* createCanvas(const WebSize& size) {
+ return picture_->beginRecording(size.width, size.height);
+ }
nduca 2012/07/18 06:17:47 do we use the OVERRIDE convention yet in chromium?
alokp 2012/07/18 16:00:49 Will check.
+ virtual void paintingComplete(const WebCanvas&) {
+ picture_->endRecording();
+ }
+
+ private:
+ SkPicture* picture_;
+};
nduca 2012/07/18 06:17:47 Is this the right way to handle layers? You're goi
alokp 2012/07/18 16:00:49 We can do it in any number of ways: 1. multiple la
+} // namespace
+
namespace content {
class GpuBenchmarkingWrapper : public v8::Extension {
@@ -35,6 +59,10 @@
" native function GetRenderingStats();"
" return GetRenderingStats();"
"};"
+ "chrome.gpuBenchmarking.printToSkPicture = function(filename) {"
+ " native function PrintToSkPicture();"
+ " return PrintToSkPicture(filename);"
+ "};"
"chrome.gpuBenchmarking.beginSmoothScrollDown = "
" function(scroll_far) {"
" scroll_far = scroll_far || false;"
@@ -51,6 +79,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);
@@ -81,6 +111,40 @@
return stats_object;
}
+ static v8::Handle<v8::Value> PrintToSkPicture(const v8::Arguments& args) {
+ if (args.Length() != 1)
+ return v8::Undefined();
+
+ v8::String::AsciiValue filename(args[0]);
+ if (filename.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();
+
+ SkPicture picture;
+ SkPictureRecordingController controller(&picture);
+ double record_time = benchmark_support->paint(
+ controller,
+ WebViewBenchmarkSupport::PaintModeEverything);
+
+ // Open the file into which recorded SkPicture will be dumped.
+ // Note that for this to work Chrome needs to be launched with
+ // --no-sandbox command-line flag.
+ SkFILEWStream file(*filename);
nduca 2012/07/18 06:17:47 We definitely want to file a bug with skia to allo
alokp 2012/07/18 16:00:49 They already have this feature. We should sync up
+ picture.serialize(&file);
+ return v8::Number::New(record_time);
nduca 2012/07/18 06:17:47 Any reason we need to even return this variable? S
alokp 2012/07/18 16:00:49 The same reason WebViewBenchmarkSupport::paint() r
+ }
+
static v8::Handle<v8::Value> BeginSmoothScroll(const v8::Arguments& args) {
WebFrame* web_frame = WebFrame::frameForEnteredContext();
if (!web_frame)
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698