aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkRasterPipeline.cpp
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2016-11-30 12:18:15 -0500
committerGravatar Mike Klein <mtklein@chromium.org>2016-11-30 18:12:29 +0000
commit9ac7b2c545769a6b7c863b8e4c7f88096c9a9969 (patch)
tree4ce675dbdbbf6575e07168183ced7de53a083e27 /src/core/SkRasterPipeline.cpp
parent94528981c8f668280fd56aea75fd720078f4ea3c (diff)
Show constant-foldable runs in SkRasterPipeline::dump().
Change-Id: I2f85249a09163dd21a8008f50340b8463718ada2 Reviewed-on: https://skia-review.googlesource.com/5350 Reviewed-by: Mike Klein <mtklein@chromium.org> Commit-Queue: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src/core/SkRasterPipeline.cpp')
-rw-r--r--src/core/SkRasterPipeline.cpp59
1 files changed, 58 insertions, 1 deletions
diff --git a/src/core/SkRasterPipeline.cpp b/src/core/SkRasterPipeline.cpp
index e52a2429b0..7c4c95f480 100644
--- a/src/core/SkRasterPipeline.cpp
+++ b/src/core/SkRasterPipeline.cpp
@@ -31,8 +31,54 @@ std::function<void(size_t, size_t, size_t)> SkRasterPipeline::compile() const {
return SkOpts::compile_pipeline(fStages, fNum);
}
+static bool invariant_in_x(const SkRasterPipeline::Stage& st) {
+ if (st.ctx == nullptr) {
+ // If a stage doesn't have a context pointer, it can't really do anything with x.
+ return true;
+ }
+
+ // This would be a lot more compact as a blacklist (the loads, the stores, the gathers),
+ // but it's safer to write as a whitelist. If we get it wrong this way, not a big deal.
+ switch (st.stage) {
+ default: return false;
+
+ case SkRasterPipeline::trace:
+ case SkRasterPipeline::set_rgb:
+ case SkRasterPipeline::constant_color:
+ case SkRasterPipeline::scale_constant_float:
+ case SkRasterPipeline::lerp_constant_float:
+ case SkRasterPipeline::matrix_2x3:
+ case SkRasterPipeline::matrix_3x4:
+ case SkRasterPipeline::matrix_4x5:
+ case SkRasterPipeline::matrix_perspective:
+ case SkRasterPipeline::parametric_r:
+ case SkRasterPipeline::parametric_g:
+ case SkRasterPipeline::parametric_b:
+ case SkRasterPipeline::table_r:
+ case SkRasterPipeline::table_g:
+ case SkRasterPipeline::table_b:
+ case SkRasterPipeline::color_lookup_table:
+ case SkRasterPipeline::lab_to_xyz:
+ case SkRasterPipeline::clamp_x:
+ case SkRasterPipeline::mirror_x:
+ case SkRasterPipeline::repeat_x:
+ case SkRasterPipeline::clamp_y:
+ case SkRasterPipeline::mirror_y:
+ case SkRasterPipeline::repeat_y:
+ case SkRasterPipeline::top_left:
+ case SkRasterPipeline::top_right:
+ case SkRasterPipeline::bottom_left:
+ case SkRasterPipeline::bottom_right:
+ case SkRasterPipeline::accumulate:
+ SkASSERT(st.ctx != nullptr);
+ return true;
+ }
+ return false;
+}
+
void SkRasterPipeline::dump() const {
SkDebugf("SkRasterPipeline, %d stages\n", fNum);
+ bool in_constant_run = false;
for (int i = 0; i < fNum; i++) {
const char* name = "";
switch (fStages[i].stage) {
@@ -40,7 +86,18 @@ void SkRasterPipeline::dump() const {
SK_RASTER_PIPELINE_STAGES(M)
#undef M
}
- SkDebugf("\t%s\n", name);
+
+ char mark = ' ';
+ if (fStages[i].stage == SkRasterPipeline::constant_color) {
+ mark = '*';
+ in_constant_run = true;
+ } else if (in_constant_run && invariant_in_x(fStages[i])) {
+ mark = '|';
+ } else {
+ mark = ' ';
+ in_constant_run = false;
+ }
+ SkDebugf("\t%c %s\n", mark, name);
}
SkDebugf("\n");
}