From 9ac7b2c545769a6b7c863b8e4c7f88096c9a9969 Mon Sep 17 00:00:00 2001 From: Mike Klein Date: Wed, 30 Nov 2016 12:18:15 -0500 Subject: [PATCH] Show constant-foldable runs in SkRasterPipeline::dump(). Change-Id: I2f85249a09163dd21a8008f50340b8463718ada2 Reviewed-on: https://skia-review.googlesource.com/5350 Reviewed-by: Mike Klein Commit-Queue: Mike Klein --- src/core/SkRasterPipeline.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/src/core/SkRasterPipeline.cpp b/src/core/SkRasterPipeline.cpp index e52a242..7c4c95f 100644 --- a/src/core/SkRasterPipeline.cpp +++ b/src/core/SkRasterPipeline.cpp @@ -31,8 +31,54 @@ std::function 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"); } -- 2.7.4