diff options
author | Mike Klein <mtklein@chromium.org> | 2016-11-30 12:18:15 -0500 |
---|---|---|
committer | Mike Klein <mtklein@chromium.org> | 2016-11-30 18:12:29 +0000 |
commit | 9ac7b2c545769a6b7c863b8e4c7f88096c9a9969 (patch) | |
tree | 4ce675dbdbbf6575e07168183ced7de53a083e27 /src/core/SkRasterPipeline.cpp | |
parent | 94528981c8f668280fd56aea75fd720078f4ea3c (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.cpp | 59 |
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"); } |