diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/debugger/SkDebugCanvas.cpp | 62 | ||||
-rw-r--r-- | tools/debugger/SkDebugCanvas.h | 5 | ||||
-rw-r--r-- | tools/skiaserve/skiaserve.cpp | 1 | ||||
-rw-r--r-- | tools/skiaserve/urlhandlers/BatchBoundsHandler.cpp | 38 | ||||
-rw-r--r-- | tools/skiaserve/urlhandlers/UrlHandler.h | 11 |
5 files changed, 116 insertions, 1 deletions
diff --git a/tools/debugger/SkDebugCanvas.cpp b/tools/debugger/SkDebugCanvas.cpp index cc1733b705..4fc6d14625 100644 --- a/tools/debugger/SkDebugCanvas.cpp +++ b/tools/debugger/SkDebugCanvas.cpp @@ -13,6 +13,12 @@ #include "SkPaintFilterCanvas.h" #include "SkOverdrawMode.h" +#if SK_SUPPORT_GPU +#include "GrAuditTrail.h" +#include "GrContext.h" +#include "GrRenderTarget.h" +#endif + #define SKDEBUGCANVAS_VERSION 1 #define SKDEBUGCANVAS_ATTRIBUTE_VERSION "version" #define SKDEBUGCANVAS_ATTRIBUTE_COMMANDS "commands" @@ -68,7 +74,8 @@ SkDebugCanvas::SkDebugCanvas(int width, int height) , fOverdrawViz(false) , fOverrideFilterQuality(false) , fFilterQuality(kNone_SkFilterQuality) - , fClipVizColor(SK_ColorTRANSPARENT) { + , fClipVizColor(SK_ColorTRANSPARENT) + , fDrawGpuBatchBounds(true) { fUserMatrix.reset(); // SkPicturePlayback uses the base-class' quickReject calls to cull clipped @@ -209,16 +216,36 @@ void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) { if (fPaintFilterCanvas) { fPaintFilterCanvas->addCanvas(canvas); canvas = fPaintFilterCanvas.get(); + } if (fMegaVizMode) { this->markActiveCommands(index); } + + // If we have a GPU backend we can also visualize the batching information +#if SK_SUPPORT_GPU + GrAuditTrail* at = nullptr; + GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); + if (rt && fDrawGpuBatchBounds) { + GrContext* ctx = rt->getContext(); + if (ctx) { + at = ctx->getAuditTrail(); + } + } +#endif for (int i = 0; i <= index; i++) { if (i == index && fFilter) { canvas->clear(0xAAFFFFFF); } + +#if SK_SUPPORT_GPU + GrAuditTrail::AutoCollectBatches* acb = nullptr; + if (at) { + acb = new GrAuditTrail::AutoCollectBatches(at, i); + } +#endif if (fCommandVector[i]->isVisible()) { if (fMegaVizMode && fCommandVector[i]->active()) { @@ -232,6 +259,11 @@ void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) { fCommandVector[i]->execute(canvas); } } +#if SK_SUPPORT_GPU + if (at && acb) { + delete acb; + } +#endif } if (SkColorGetA(fClipVizColor) != 0) { @@ -294,6 +326,34 @@ void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) { if (fPaintFilterCanvas) { fPaintFilterCanvas->removeAll(); } + +#if SK_SUPPORT_GPU + // draw any batches if required and issue a full reset onto GrAuditTrail + if (at) { + GrAuditTrail::AutoEnable ae(at); + SkTArray<GrAuditTrail::BatchInfo> childrenBounds; + at->getBoundsByClientID(&childrenBounds, index); + SkPaint paint; + paint.setStyle(SkPaint::kStroke_Style); + paint.setStrokeWidth(1); + for (int i = 0; i < childrenBounds.count(); i++) { + paint.setColor(SK_ColorBLACK); + canvas->drawRect(childrenBounds[i].fBounds, paint); + for (int j = 0; j < childrenBounds[i].fBatches.count(); j++) { + const GrAuditTrail::BatchInfo::Batch& batch = childrenBounds[i].fBatches[j]; + if (batch.fClientID != index) { + paint.setColor(SK_ColorBLUE); + } else { + paint.setColor(SK_ColorRED); + } + canvas->drawRect(batch.fBounds, paint); + } + } + + at->fullReset(); + } + +#endif } void SkDebugCanvas::deleteDrawCommandAt(int index) { diff --git a/tools/debugger/SkDebugCanvas.h b/tools/debugger/SkDebugCanvas.h index d06637d42b..9549cb06ad 100644 --- a/tools/debugger/SkDebugCanvas.h +++ b/tools/debugger/SkDebugCanvas.h @@ -43,6 +43,10 @@ public: void setClipVizColor(SkColor clipVizColor) { this->fClipVizColor = clipVizColor; } SkColor getClipVizColor() const { return fClipVizColor; } + void setDrawGpuBatchBounds(bool drawGpuBatchBounds) { + fDrawGpuBatchBounds = drawGpuBatchBounds; + } + bool getAllowSimplifyClip() const { return fAllowSimplifyClip; } void setPicture(SkPicture* picture) { fPicture = picture; } @@ -245,6 +249,7 @@ private: bool fOverrideFilterQuality; SkFilterQuality fFilterQuality; SkColor fClipVizColor; + bool fDrawGpuBatchBounds; SkAutoTUnref<SkNWayCanvas> fPaintFilterCanvas; diff --git a/tools/skiaserve/skiaserve.cpp b/tools/skiaserve/skiaserve.cpp index b593e7224f..195544e83a 100644 --- a/tools/skiaserve/skiaserve.cpp +++ b/tools/skiaserve/skiaserve.cpp @@ -39,6 +39,7 @@ public: fHandlers.push_back(new DataHandler); fHandlers.push_back(new BreakHandler); fHandlers.push_back(new BatchesHandler); + fHandlers.push_back(new BatchBoundsHandler); } ~UrlManager() { diff --git a/tools/skiaserve/urlhandlers/BatchBoundsHandler.cpp b/tools/skiaserve/urlhandlers/BatchBoundsHandler.cpp new file mode 100644 index 0000000000..40449868bf --- /dev/null +++ b/tools/skiaserve/urlhandlers/BatchBoundsHandler.cpp @@ -0,0 +1,38 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "UrlHandler.h" + +#include "microhttpd.h" +#include "../Request.h" +#include "../Response.h" + +using namespace Response; + +bool BatchBoundsHandler::canHandle(const char* method, const char* url) { + static const char* kBasePath = "/batchBounds/"; + return 0 == strcmp(method, MHD_HTTP_METHOD_POST) && + 0 == strncmp(url, kBasePath, strlen(kBasePath)); +} + +int BatchBoundsHandler::handle(Request* request, MHD_Connection* connection, + const char* url, const char* method, + const char* upload_data, size_t* upload_data_size) { + SkTArray<SkString> commands; + SkStrSplit(url, "/", &commands); + + if (!request->hasPicture() || commands.count() != 2) { + return MHD_NO; + } + + int enabled; + sscanf(commands[1].c_str(), "%d", &enabled); + + request->fDebugCanvas->setDrawGpuBatchBounds(enabled); + return SendOK(connection); +} + diff --git a/tools/skiaserve/urlhandlers/UrlHandler.h b/tools/skiaserve/urlhandlers/UrlHandler.h index 28d378aaf9..3fe269a57f 100644 --- a/tools/skiaserve/urlhandlers/UrlHandler.h +++ b/tools/skiaserve/urlhandlers/UrlHandler.h @@ -112,6 +112,17 @@ public: const char* upload_data, size_t* upload_data_size) override; }; +/* + * Enables drawing of batch bounds + */ +class BatchBoundsHandler : public UrlHandler { +public: + bool canHandle(const char* method, const char* url) override; + int handle(Request* request, MHD_Connection* connection, + const char* url, const char* method, + const char* upload_data, size_t* upload_data_size) override; +}; + class RootHandler : public UrlHandler { public: bool canHandle(const char* method, const char* url) override; |