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) {
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");
}